English | 中文
该项目是华为移动服务中接触卫士的代码片段,主要包括:密钥管理、蓝牙(BLE)任务管理、密钥文件分析、数据存储。本项目还提供了示例代码,为您展示如何在已集成Google Exposure Notification的应用中快速集成Contact Shield SDK。
本模块描述了如何生成周期性密钥、动态共享码(DSC)和辅助元数据(SD)。启动接触卫士服务(Contact Shield)时,调用ContactAdvBeaconGenerator.generate()
可以生成上述与周期性密钥相关的数据。关键步骤如下:
PeriodicKeyGenerator.getPeriodicKey()
以获取周期性密钥,其逻辑为:PeriodicKeyGenerator.cRNG()
生成一个新的随机数组作为密钥,并将其保存至数据库中,之后返回新生成的密钥。DSC的生成依赖DSC Key
和PaddedData
。DSC Key派生自周期性密钥,可通过调用DynamicSharingCode.getDscKey()
生成。PaddedData包含了当前时间的Interval Number值,通过调用DynamicSharingCode.generatePaddedData()
生成。当准备好DSC Key和PaddedData后,调用EncryptDecrypt.aesEcbEncrypt()
使用DSC Key加密PaddedData
,从而生成DSC。所以,DSC是加密后的PaddedData
。
SD的生成需要使用到DSC
(DSC生成请参考步骤2)、SD Key
和metadata
。SupplementaryData
类中的SupplementaryData.getSdKey()
可用于生成SD Key。SD Key也是派生自周期性密钥,用于加密承载了BLE报文版本和传输功率的蓝牙metadata。具体实现细节请参见ContactAdvBeaconGenerator
。最后,调用EncryptDecrypt.aesCtrEncrypt()
生成新的SD。
接触卫士使用BLE与其他设备进行数据交互,期间向周围广播和扫描DSC和SD。接触卫士将扫描端与广播端整合在一起,便于管理。ContactBeacon
类承载了具体的广播报文。可以通过调用pack()
和unpack()
方法来转换广播报文和ContactBeacon
。调用ContactManage.startContact()
后,接触卫士将进行如下操作:
检查蓝牙状态,确保您的设备支持BLE。如果当前蓝牙处于关闭状态,则打开蓝牙。
调用ContactBleScanner.startBleScan()
启动BLE扫描,并配置BLE scanner timer
,使扫描在4秒后停止。BLE扫描端的具体实现细节集中在ContactBleScanner
类中。当接触卫士广播时,此类会调用ContactBeacon.unpack()
并将新发现的ContactBeacon
传给ContactManager
。由ContactManager
来保存ContactBeacon
的DSC
、SD
及RSSI
。
开始BLE广播。首先调用ContactAdvBeaconGenerator.generate()
来生成ContactBeacon
。ContactBeaco
n可以连结DS
C数据(对应当前时间戳Interval Number的值)和SD
数据(加密的蓝牙metadata)。然后将生成的ContactBeacon
传入ContactBleAdvertiser.startBleAdv()
。BLE广播端的实现细节集中在ContactBleAdvertiser
类中。
当BLE scanner timer
失效后,停止BLE扫描并调用ContactDataManage.flushScanDataToDb()
将扫描到的所有数据从缓存写入数据库。然后配置Contact Shield alarm
,以便在3-4分钟后开始下一次BLE扫描。
每次触发Contact Shield alarm
时,按照上述启动BLE扫描端持续扫描4秒,同时Contact Shield将检查BLE广播端数据更新的时间戳。如果超过十分钟未更新广播数据,则重新启动BLE广播端以更新DSC/SD
数据。
ContactAnalyze
类实现了密钥文件分析的核心步骤。ContactAnalyze.analyzeKeyFileList()
是诊断入口,调用该接口时,需要传入诊断配置信息(DiagnosisConfiguration
的实例)来计算接触风险值。
当app传入压缩文件后,KeyFileParser.parseFiles()
可以将每个密钥文件转换成相应的周期性密钥,并基于每个周期性密钥的有效时间和生存周期来判断它们的合法性,丢弃那些超过潜伏期的周期性密钥。
在诊断过程中,密钥管理模块可以协助ContactAnalyze.getTargetDsc()
为每个潜伏期内的密钥生成所有DSC,称之为目标DSC集合(target DSCs
),然后对比目标DSC集合和本地数据库保存的BLE曾扫描到的病毒潜伏期内的DSC数据表。
一旦任一本地DSC与目标DSC
匹配,便可确认当前用户与确诊者曾经有过近距离接触。接触卫士会根据匹配到的DSC数量,通过具体的DiagnosisConfiguration
计算风险值。与此同时,接触详情(Contact Detail
)、接触摘要(Contact Sketch
)和接触窗口(Contact Window
)都会同步更新。
诊断结束后,有三种方法可以获取诊断结果:
ContactAnalyze.getContactSketch()
提供传入的所有密钥压缩文件的摘要信息。ContactAnalyze.getDetailList()
提供密钥压缩文件中已匹配的密钥的详细信息。ContactAnalyze.getContactWindows()
提供ContactWindow
模式下已匹配的密钥的详细信息。诊断详情将保存至本地数据库以供后续查询,超过病毒潜伏期时将会被删除。
本模块显示接触卫士会将哪些数据保存至数据库。底层数据库操作依赖于平台,此处不进行说明。以下是接触卫士工作时使用的主要数据:
类名 | 说明 |
---|---|
ScanData |
BLE扫描数据,如DSC、SD、RSSI等。 |
PdkData |
历史周期性密钥。 |
ContactDetailData |
诊断结果:接触详情、token等。 |
ContactSketchData |
诊断结果:接触摘要、token等。 |
ContactWindowData |
诊断结果:接触窗口、ScanInfoData等。 |
何时清除数据:
ContactDataManager.checkAndDeleteData()
会删除历史周期性密钥、诊断结果和扫描数据。根据此模块的封装接口,可以轻松更新已集成Google Exposure Notification的应用来集成Contact Shield SDK。详情请参考ContactShieldWrapperReadme.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )