首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

BLE安全之配对流程剖析(3)

主机通过IRK解析机的私有地址,机也通过IRK来解析主机的私有地址。 2.2 生成CSRK CSRK是用来对数据进行签名的,一个设备接收到CSRK就可以对设备进行验证。...密钥下发 3.1 legacy pairing 密钥下发 • LTK, EDIV, and Rand • IRK • CSRK 在上述这些key下发之前,连接需要使用STK来加密 3.2 secure...Slave Security Request 机端可能发送一条Security Request 命令给主机端,当主机接收到该命令可能加密链路,初始化配对流程,或者拒绝该请求。...主机端收到Security Request数据包,如果主机端之前已经发送过Pairing Request命令给机端,并且机端没有回复, 或者主机端已经初始化了加密流程。...则主机端会直接忽略机发送的Security Request命令。 而如果主机不支持配对功能,则主机也会直接返回失败。

1.3K20

BLE安全之SM剖析(1)

Master端会发送配对请求 Pairing_Request命令,Slaver端收到后会回复配对响应包Pairing_Response的命令,当然如果设备不支持配对,则会返回“Pairing Not Supported...一个MasterSlave那里得到Slave的IRK,就可以解析Slave的random address;一个SlaveMaster那里得到Master的IRK,就可以解析Master的random...一个设备得到另一个设备的CSRK,就可以对另一个设备那接收到的数据进行签名验证了。...才可以使用OOB模式 至少有一方获取到对方的OOB信息,就可以使用OOB模式 传统配对方式中主要生成TK和STK:Temporary Key (TK):一个 128-bit的临时密钥,用来生成STK...在选择好了合适的配对和鉴权方式,接下来就是BLE配对的阶段二 ,在该阶段会通过配对流程生成STK或者LTK,该阶段不同的配对和鉴权方式导致情况较多,会专门在下章节详细介绍。

1.2K20
您找到你想要的搜索结果了吗?
是的
没有找到

Nat. Comput. Sci.|KarmaDock:针对超大规模虚拟筛选的基于深度学习的分子对接方法

其中,分子对接技术在预测蛋白质和小分子药物如何结合时起到了关键作用。传统的对接方法,如AutoDock、Glide等,主要通过搜索算法探索配体的可能构象,并用打分函数来评估这些构象。...这些方法为了提升虚拟筛选时的效率,对搜索算法和打分函数进行了化简(如采用了启发式搜索算法、打分函数忽略了溶剂效应、引入了经验能量项等),用预测精度换来计算速度。...在EGNN模块结束,可以选择两种后处理方式(RDKit构象叠合或者力场优化)来保证分子构象的合理性。...模型角度来看,我们可以图2中观察到筛选能力排名如下:KarmaDock FF > KarmaDock Raw > KarmaDock Aligned > Glide SP > Surflex > LeDock...为了证明KarmaDock在虚拟筛选中的实际意义,我们对LTK靶点进行了真实世界的虚拟筛选。我们使用广泛使用的商业化合物库Specs和ChemDiv数据库进行筛选,这些库包含超过177万个分子。

90940

BLE安全之SM剖析(2)

BLE安全之SM剖析(2)   上一章介绍了配对流程的第一阶段,剖析了配对第一阶段的配对请求包和配对响应包的各个字段的含义和使用。...主机端收到将自身的随机数LP_RAND_I 发送给设备端,设备端根据该随机数重新计算confirm值,如果计算结果和LP_CONFIRM_I不一致,则返回配对失败。...主机端收到,根据随机数LP_RAND_R 重新计算confirm值,如果计算结果和LP_CONFIRM_R不一致,则返回配对失败,否则返回配对成功,并计算STK,加密链路。...LTK就是用来生成后续加密链路的session key的 CTKD特性 额外补充一点,蓝牙支持一种交叉密钥派生的特性,简称CTKD,这种特性可以使用ble配对生成的LTK转化为BT配对的LinkKey,...以上就是BLE配对流程的阶段二,在该阶段根据设备的配对特性,选择了不同的配对和鉴权方式,并且生成了对应的STK或者LTK,为后续链路的加密打下基础。 那后续的链路是如何加密的?我们会在下个章节来剖析。

1K10

Lodash 防抖和节流是如何实现的

,即第一次触发,false 时忽略 let maxing = false // 是否有最大等待时间,配合 maxWait 多用于节流相关 let trailing = true // 是否响应事件结束的那次回调...------- 执行传入函数 ----------- // 执行连续事件刚开始的那次回调 function leadingEdge(time) {} // 执行连续事件结束的那次回调...入口函数 debounce 函数最终返回了 debounced,返回的这个函数就是入口函数了,事件每次触发都会执行 debounced 函数,而且会频繁的执行,所以在这个方法里需要「判断是否应该执行传入函数...// 定时器回调函数,表示定时结束的操作 function timerExpired() { const time = Date.now() // 1、是否需要执行 // 执行事件结束的那次回调...invokeFunc(time) : result } trailingEdge 这里就是执行事件结束的回调了,这里做的事情很简单,就是执行 func 函数,以及清空参数。

1.8K40

【测试开发】python系列教程:asyncio模块

(task.done())#结束 loop.close() # 结束循环 结果,看到随机的了一个任务名称,任务的状态是running,执行是done。...执行完毕的任务,想要在任务结果,执行一些事情,如何获取呢?其实可以利用add_done_callback来执行回调函数。...import asyncio import time def task_callback(future): # 回调函数获取任务完成返回值 print("拿到结果") print(...)# 为而任务添加回调函数 loop.run_until_complete(task) # 等待task运行完毕 loop.close() # 结束循环 如何获取到任务得返回结果呢?...num))) response = await asyncio.gather(tasks[0], tasks[1], tasks[2]) # 将task作为参数传入gather,等异步任务都结束返回结果列表

24920

QThread类

调用此函数,线程离开事件循环,并从对QEventLoop::exec()的调用返回。QEventLoop::exec()函数返回退出代码。     ...请注意,与同名的C库函数不同,此函数返回到调用者和停止的事件处理。     调用exit函数在此线程中不再启动QEventLoop,直到再次调用QThread::exec()。...译者注:   示例: 当用户执行killAndWait()函数则会导致run()函数内循环体结束,从而结束线程执行。...请确保terminate()之后使用QThread :: wait()来等待结束。   当线程终止时,所有等待线程都将被唤醒。 警告:此功能很危险,不鼓励使用。线程可以在其代码路径中的任何位置终止。...如果线程已完成,此函数返回true。 如果线程尚未启动,它也会返回true。 条件2:等待的时间已过。 如果时间是ULONG_MAX(默认值),那么等待将永远不会超时(线程必须run()返回)。

2.6K20

QThread类

调用此函数,线程离开事件循环,并从对QEventLoop::exec()的调用返回。QEventLoop::exec()函数返回退出代码。   ...请注意,与同名的C库函数不同,此函数返回到调用者和停止的事件处理。   调用exit函数在此线程中不再启动QEventLoop,直到再次调用QThread::exec()。...译者注: 示例: 当用户执行killAndWait()函数则会导致run()函数内循环体结束,从而结束线程执行。...请确保terminate()之后使用QThread :: wait()来等待结束。   当线程终止时,所有等待线程都将被唤醒。 警告:此功能很危险,不鼓励使用。线程可以在其代码路径中的任何位置终止。...如果线程已完成,此函数返回true。 如果线程尚未启动,它也会返回true。 条件2:等待的时间已过。 如果时间是ULONG_MAX(默认值),那么等待将永远不会超时(线程必须run()返回)。

1.1K20

IRP的同步

应用层对设备的同步与异步操作 以WriteFile为例,一般的同步操作是调用WriteFile完成,并不会返回,应用程序会在此处暂停,一直等到函数将数据写入文件中并正常返回,而异步操作则是调用WriteFile...,由于应用层会等待派遣函数返回,所以直接结束IRP的方式可以看做是同步,而先返回以后处理的方式可以看做是异步处理。...对于ReadFile和WriteFile来说,它们支持异步操作,在调用这两个函数进行同步操作时,内部会生成一个事件等待这个事件,这个事件会和IRP一起发送的派遣函数中,当IRP被结束时,事件会被置为有信号...,这样函数中的等待就可以正常返回。...而异步操作就不会产生这个事件。而是使用函数中的overlapped参数,这时它内部不会等待这个事件,而由程序员自己在合适的位置等待

59040

函数 SCF Node.js Runtime 最佳实践

另外一种就是在返回就直接结束当次调用,直接挂起异步处理。 腾讯云云函数针对 Node.js 的异步场景,实现了返回结束分离的特殊机制。...[ungon7txvs.jpeg] 入口函数的同步执行过程完成及返回,云函数的调用将立刻返回,并将代码的返回信息返回函数调用方 同步流程处理并返回,代码中的异步逻辑可以继续执行和处理,直到异步事件执行完成...默认情况下,函数执行会等待所有异步执行结束才算一次调用结束,但也给用户提供了关闭事件循环等待的选项,用户可以关闭事件循环等待来自行控制函数返回时机。...通过在 callback 回调执行前设置context.callbackWaitsForEmptyEventLoop = false,可以使云函数在执行返回立刻冻结进程,不再等待异步循环内的事件 比如一下示例代码...而在返回,程序会继续执行,直到 setTimeout 的事件执行完才算本次调用结束

1.9K82

JS异步编程

一旦状态等待改变为其他状态就不再可变了。 Promise是个构造函数,接受一个函数作为参数。作为参数的函数有两个参数:resolve和reject,分别对应完成和拒绝两种状态。...async在使用上会有一些需要注意的地方: async函数返回值是一个Promise对象,不像是generator函数返回的是Iterator遍历器对象,所以async函数执行可以继续使用then等方法来继续执行后面的逻辑...await后边一般跟Promise对象,async函数执行遇到await等待后面的Promise对象的状态pending变成resolve,将resolve的参数返回并自动往下执行知道下一个await...3、当主线程同步任务执行完成,会失去Event Queue读取对应的函数,并结束它的等待状态,进入主线程执行。...setTimeOut(fn, 0)在下一轮事件循环开始时执行,Promise.then在本轮事件循环结束时执行。

3K30

Python多进程及多线程基础

2)就绪状态:所有运行条件都已满足,正在等待CPU。 3)运行状态(执行窗台):进程正在处理器上运行。 4)阻塞状态:进程正在等待某一事件而暂停运行。如等待可用资源或等待输入输出完成。...阻塞——>就绪:当所等待事件发生,如得到申请资源,I/O传输完成,进程由阻塞变为就绪状态 Python中如何使用多进程 Python中使用multiprocessing模块创建进程 multiprocessing...name:当前进程实例别名,默认Process-N,N1开始递增。 pid:当前进程实例的PID值。...8460 子进程的父进程ppid: 4256 主进程pid:4256 子进程名字 Process-3 子进程PID:4468 子进程的父进程ppid: 4256 主进程pid:4256 Python中如何使用多线程...threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动结束前,不包括启动前和终止的线程。

77010

C#同步方法转异步 创建新线程AMP 转 EAP

本文来告诉大家如何把同步的代码转换为异步 创建新线程 最简单的方法是创建一个新的线程,创建的方法是使用 Task.Run ,请看下面代码,原来有一个函数 Delay 需要把他转换为异步,就可以使用 DelayAsync...表示 现在微软告诉大家,建议使用 EAP 基于事件的异步模式,也就是 Async 的模型 例如有一个文件读取,文件读取可以使用 BeginRead 和 EndRead ,看到下面代码大家就会觉得这很难用...,那么建议看如何实现一个可以用 await 异步等待的 Awaiter - walterlv 如何实现一个可以用 await 异步等待的 Awaiter - walterlv复制出来类 DispatcherAsyncOperation...动画的等待是在动画结束返回函数,也许这里比较难说,动画有开始和结束事件,希望在结束事件函数返回 private void TrirlelJallardra() {...如果可以使用下面的函数的方法,可读性比较好 private void TrirlelJallardra() { // 执行动画

65920

C#同步方法转异步

本文来告诉大家如何把同步的代码转换为异步 创建新线程 最简单的方法是创建一个新的线程,创建的方法是使用 Task.Run ,请看下面代码,原来有一个函数 Delay 需要把他转换为异步,就可以使用 DelayAsync...表示 现在微软告诉大家,建议使用 EAP 基于事件的异步模式,也就是 Async 的模型 例如有一个文件读取,文件读取可以使用 BeginRead 和 EndRead ,看到下面代码大家就会觉得这很难用...,那么建议看如何实现一个可以用 await 异步等待的 Awaiter - walterlv 如何实现一个可以用 await 异步等待的 Awaiter - walterlv复制出来类 DispatcherAsyncOperation...动画的等待是在动画结束返回函数,也许这里比较难说,动画有开始和结束事件,希望在结束事件函数返回 private void TrirlelJallardra() {...如果可以使用下面的函数的方法,可读性比较好 private void TrirlelJallardra() { // 执行动画

88700

C#同步方法转异步 创建新线程AMP 转 EAP

本文来告诉大家如何把同步的代码转换为异步 创建新线程 最简单的方法是创建一个新的线程,创建的方法是使用 Task.Run ,请看下面代码,原来有一个函数 Delay 需要把他转换为异步,就可以使用 DelayAsync...表示 现在微软告诉大家,建议使用 EAP 基于事件的异步模式,也就是 Async 的模型 例如有一个文件读取,文件读取可以使用 BeginRead 和 EndRead ,看到下面代码大家就会觉得这很难用...,那么建议看如何实现一个可以用 await 异步等待的 Awaiter - walterlv 如何实现一个可以用 await 异步等待的 Awaiter - walterlv复制出来类 DispatcherAsyncOperation...动画的等待是在动画结束返回函数,也许这里比较难说,动画有开始和结束事件,希望在结束事件函数返回 private void TrirlelJallardra() {...如果可以使用下面的函数的方法,可读性比较好 private void TrirlelJallardra() { // 执行动画

53510

使用 .NET 实现 Ajax 长连接

服务器会保持连接并等待一个需要通知客户端的事件,该事件发生马上将数据写入响应,这时候客户端就以相当“实时”的方式接收到事件通知。...我们接着开始讨论如何使用.NET实现这个模型。...一般情况下,如果30秒没有任何事件发生,服务器端就应该通知客户端确实没有事件发生,结束掉本次请求,然后重新开始一次新的请求以便继续等待。 那么上述函数签名可否用来返回一个无事件的消息呢?...这是显然可以的,我们可以选择返回null表示无事件,或者返回一个EmptyMessage常量,这视乎我们使用class还是struct来定义Message。...然而这种模型不太适用于解决我们的问题,因为我们需要等待一个事件,如果使用lock来等待的话,那就是说要先在Web Service外部把对象锁上,然后等事件触发了就解锁,这时候Web Service才顺利进入临界区域

75020

Redis源码阅读(三)初始化与事件循环

事件处理框架非常简单,初始化、服务到结束,分别对应的函数:aeCreateEventLoop、aeMain、aeDeleteEventLoop。...等待事件发生的时候,程序会被重新唤醒,循环继续。 等待和唤醒的操作需要依赖底层系统实现。 (3) 如何统一调度timer事件和I/O事件? 需要能够同时等待timer和I/O两种事件的发生。...有数据就返回,没有数据就sleep,等到timeout时间到即使链表没数据也返回。所以,epoll_wait非常高效。...(5) 如何进行事件循环?...(6) 底层是如何支持了Redis的事件循环?(事件循环的底层实现) a. 注册回调函数 首先,向事件循环中注册I/O事件回调的时候,需要指定哪个回调函数注册到哪个事件上(事件用文件描述符来表示)。

75830

重新理解IO模型

以read为例,我们利用read函数socket中同步阻塞的读取数据,整个流程如下所示: [read调用示意图] 调用read,该调用会转入内核调用 内核会等待该socket的可读事件,直到远程向socket...可以看到除了转入内核调用,与传统的磁盘IO不同的是,网络IO的读写大致可以分为两个阶段: 等待阶段:等待socket的可读或者可写事件成立 拷贝数据阶段:将数据内核拷贝到用户进程,或者用户进程拷贝到内核中...如果一直等待下去,直到成立,才进行下个阶段,则称为阻塞式IO;如果发现socket非可读可写状态,则直接返回,不等待,也不进行下个阶段,则称为非阻塞式IO。...拷贝同步:内核拷贝到用户空间的这个阶段,如果直到开始拷贝直到拷贝结束,read函数返回,则称为同步IO。...同步阻塞IO的两个阶段都需要等待完成,read才会返回。 也就是说,如果远程一直没有发送数据,则read一直就不会返回,整个线程就会阻塞到这里了。

1.6K70

蓝牙安全与攻击案例分析

时间线上来看,BR/EDR分为几个阶段: 2.1之前:使用Legacy Pairing,后续版本中称为BR/EDR legacy 2.1:使用 Secure Simple Pairing 4.2:使用...例如,HCI命令0x200c表示LE Set Scan Enable,并通过参数控制开启和关闭BLE的扫描,Controller执行完毕返回event code 0x0e,即Command Complete...之所以介绍这些背景,是因为漏洞的成因与背景相关性较大,在上面的基础上,BIAS漏洞可以描述为以下问题: LSC过程中master发起连接请求,slave返回自己的LTK认证响应,但master可以不进行校验...即在收到Secure Connection的请求发起Role Switch操作,并且伪造对端的认证请求,由于两端的LTK相同,因此对端可以返回合法的认证响应;之后再发起一次Role Switch,将合法的认证响应转发给对端...Profile本质上定义了如何使用协议来实现某种通用或者特定的目的。

2K30

7 个角度吃透 Lodash 防抖节流原理

// 定时器回调函数,表示定时结束的操作 function timerExpired() { const time = Date.now() // 1、是否需要执行 // 执行事件结束的那次回调...fn,但是如果设置了{trailing: false},那么事件回调结束是不会再执行 fn 的。...、开启定时器,为了事件结束的那次回调 timerId = startTimer(timerExpired, wait) // 3、如果配置了 leading 执行传入函数 func //...这里开启一个定时器的目的是为了事件结束的那次回调,即如果设置了 {trailing: true} 那么最后一次回调将执行传入函数 fn,哪怕 debounced 函数只触发一次。...第二种方案,在监听函数上处理,使用闭包保存传入参数并返回需要执行的函数即可。

1.5K20
领券