写在之前

这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变得遥遥无期。今天群里聊天时有个朋友问到文章的事,我觉得可能多少还有些价值,做了一些脱敏后发出来,希望对你阅读KeyMaster代码有些帮助,尤其阅读代码的方法,如何从0开始查找,分析代码。

相关文章:
Android Q 10.1 KeyMaster源码分析(一) - KeyMaster相关目录和文件
Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现

本文主要分析有哪些模块,分析完才发现KeyMaster本身的代码比较底层,一般主要关注接口就好,所以本篇文章最重要的就是关于KeyMaster结构的图了,一眼就可以看到 KeyMaster 从 0~4的各个版本之间的差别,其中的灰色是已经移除的接口。

1. 文档

关于keymaster的文档主要有两个:

  • Android官方文档

    • https://source.android.com/security/keystore
    • https://source.android.com/security/keystore/implementer-ref
  • Android本地HIDL接口定义文件中的注释
    • hardware/interfaces/keymaster/4.0/IKeymasterDevice.hal

2. keymaster结构对比

keymaster 0~4的功能结构对比:

  • keymaster 0: hardware/libhardware/include/hardware/keymaster0.h
  • keymaster 1: hardware/libhardware/include/hardware/keymaster1.h
  • keymaster 2: hardware/libhardware/include/hardware/keymaster2.h
  • keymaster 3: hardware/interfaces/keymaster/3.0/IKeymasterDevice.hal
  • keymaster 4: hardware/interfaces/keymaster/4.0/IKeymasterDevice.hal

图示颜色说明:

  • 灰色是已经移除的接口,可见早起KeyMaster0, KeyMaster1中的多个接口已经被移除了
  • 蓝色的部分是从KeyMaster 1~4 各代之间统一的接口,
  • 绿色是KeyMaster3 开始新增接口,
  • 橙色是KeyMaster4新增接口,
  • 紫色是KeyMaster3有,但是KeyMaster4不再保留的接口。

3. system\keymaster下的模块

根据文件system/keymaster/Android.bp, 这下面的代码主要分4个部分:

  • libkeymaster_messages

    • 与AndroidKeymaster implementation通信
      "android_keymaster/android_keymaster_messages.cpp","android_keymaster/android_keymaster_utils.cpp","android_keymaster/authorization_set.cpp","android_keymaster/keymaster_tags.cpp","android_keymaster/logger.cpp","android_keymaster/serializable.cpp","android_keymaster/keymaster_stl.cpp",
    
  • libkeymaster_portable
    • 包含了keymaster除具体的实现环境KeymasterContext之外,所需要实现的一切功能

      "android_keymaster/android_keymaster.cpp",
      "android_keymaster/android_keymaster_messages.cpp",
      "android_keymaster/android_keymaster_utils.cpp",
      "android_keymaster/authorization_set.cpp",
      "android_keymaster/keymaster_enforcement.cpp",
      "android_keymaster/keymaster_stl.cpp",
      "android_keymaster/keymaster_tags.cpp",
      "android_keymaster/logger.cpp",
      "android_keymaster/operation.cpp",
      "android_keymaster/operation_table.cpp",
      "android_keymaster/serializable.cpp",
      "key_blob_utils/auth_encrypted_key_blob.cpp",
      "key_blob_utils/integrity_assured_key_blob.cpp",
      "key_blob_utils/ocb.c",
      "key_blob_utils/ocb_utils.cpp",
      "key_blob_utils/software_keyblobs.cpp",
      "km_openssl/aes_key.cpp",
      "km_openssl/aes_operation.cpp",
      "km_openssl/asymmetric_key.cpp",
      "km_openssl/asymmetric_key_factory.cpp",
      "km_openssl/attestation_record.cpp",
      "km_openssl/attestation_utils.cpp",
      "km_openssl/block_cipher_operation.cpp",
      "km_openssl/ckdf.cpp",
      "km_openssl/ec_key.cpp",
      "km_openssl/ec_key_factory.cpp",
      "km_openssl/ecdsa_operation.cpp",
      "km_openssl/ecies_kem.cpp",
      "km_openssl/hkdf.cpp",
      "km_openssl/hmac.cpp",
      "km_openssl/hmac_key.cpp",
      "km_openssl/hmac_operation.cpp",
      "km_openssl/iso18033kdf.cpp",
      "km_openssl/kdf.cpp",
      "km_openssl/nist_curve_key_exchange.cpp",
      "km_openssl/openssl_err.cpp",
      "km_openssl/openssl_utils.cpp",
      "km_openssl/rsa_key.cpp",
      "km_openssl/rsa_key_factory.cpp",
      "km_openssl/rsa_operation.cpp",
      "km_openssl/software_random_source.cpp",
      "km_openssl/symmetric_key.cpp",
      "km_openssl/triple_des_key.cpp",
      "km_openssl/triple_des_operation.cpp",
      "km_openssl/wrapped_key.cpp",
      
  • libsoftkeymasterdevice
    • 纯软件的keymaster HAL层实现
    • 当硬件层不支持hardware keymaster时,keystore会转而使用这里的纯软件的keymaster
      "android_keymaster/keymaster_configuration.cpp",
      "legacy_support/ec_keymaster0_key.cpp",
      "legacy_support/ec_keymaster1_key.cpp",
      "legacy_support/ecdsa_keymaster1_operation.cpp",
      "legacy_support/keymaster0_engine.cpp",
      "legacy_support/keymaster1_engine.cpp",
      "legacy_support/rsa_keymaster0_key.cpp",
      "legacy_support/rsa_keymaster1_key.cpp",
      "legacy_support/rsa_keymaster1_operation.cpp",
      "legacy_support/keymaster1_legacy_support.cpp",
      "contexts/soft_attestation_cert.cpp",
      "contexts/soft_keymaster_context.cpp",
      "contexts/pure_soft_keymaster_context.cpp",
      "contexts/soft_keymaster_device.cpp",
      "km_openssl/soft_keymaster_enforcement.cpp",
      "contexts/soft_keymaster_logger.cpp",
      
  • libpuresoftkeymasterdevice
    "android_keymaster/keymaster_configuration.cpp",
    "contexts/soft_attestation_cert.cpp",
    "contexts/pure_soft_keymaster_context.cpp",
    "contexts/soft_keymaster_logger.cpp",
    "km_openssl/soft_keymaster_enforcement.cpp",
    
  • libkeymaster3device
    "legacy_support/keymaster_passthrough_key.cpp",
    "legacy_support/keymaster_passthrough_engine.cpp",
    "legacy_support/keymaster_passthrough_operation.cpp",
    "contexts/keymaster1_passthrough_context.cpp",
    "contexts/keymaster2_passthrough_context.cpp",
    "ng/AndroidKeymaster3Device.cpp",
    "android_keymaster/keymaster_configuration.cpp",
    "legacy_support/ec_keymaster0_key.cpp",
    "legacy_support/ec_keymaster1_key.cpp",
    "legacy_support/ecdsa_keymaster1_operation.cpp",
    "legacy_support/keymaster0_engine.cpp",
    "legacy_support/keymaster1_engine.cpp",
    "legacy_support/keymaster1_legacy_support.cpp",
    "legacy_support/rsa_keymaster0_key.cpp",
    "legacy_support/rsa_keymaster1_key.cpp",
    "legacy_support/rsa_keymaster1_operation.cpp",
    
  • libkeymaster4
    "legacy_support/keymaster_passthrough_key.cpp",
    "legacy_support/keymaster_passthrough_engine.cpp",
    "legacy_support/keymaster_passthrough_operation.cpp",
    "ng/AndroidKeymaster4Device.cpp",
    "android_keymaster/keymaster_configuration.cpp",
    

4. keymaster 4.0实现

针对手上的代码,尝试搜索

android-q-ab2/src-km$ grep -Rn CreateKeymasterDevice system hardware vendor/broadcom/ device/
system/keymaster/ng/include/AndroidKeymaster3Device.h:98:IKeymasterDevice* CreateKeymasterDevice();
system/keymaster/ng/include/AndroidKeymaster3Device.h:100:IKeymasterDevice* CreateKeymasterDevice(keymaster2_device_t* km2_device);
system/keymaster/ng/include/AndroidKeymaster3Device.h:101:IKeymasterDevice* CreateKeymasterDevice(keymaster1_device_t* km1_device);
system/keymaster/ng/include/AndroidKeymaster3Device.h:102:IKeymasterDevice* CreateKeymasterDevice(keymaster0_device_t* km0_device);
system/keymaster/ng/include/AndroidKeymaster4Device.h:106:IKeymasterDevice* CreateKeymasterDevice(SecurityLevel securityLevel);
system/keymaster/ng/AndroidKeymaster3Device.cpp:496:IKeymasterDevice* CreateKeymasterDevice() {
system/keymaster/ng/AndroidKeymaster3Device.cpp:499:IKeymasterDevice* CreateKeymasterDevice(keymaster2_device_t* km2_device) {
system/keymaster/ng/AndroidKeymaster3Device.cpp:505:IKeymasterDevice* CreateKeymasterDevice(keymaster1_device_t* km1_device) {
system/keymaster/ng/AndroidKeymaster3Device.cpp:510:IKeymasterDevice* CreateKeymasterDevice(keymaster0_device_t* km0_device) {
system/keymaster/ng/AndroidKeymaster4Device.cpp:563:IKeymasterDevice* CreateKeymasterDevice(SecurityLevel securityLevel) {
hardware/interfaces/keymaster/3.0/default/KeymasterDevice.cpp:74:        return ::keymaster::ng::CreateKeymasterDevice();
hardware/interfaces/keymaster/3.0/default/KeymasterDevice.cpp:82:        return ::keymaster::ng::CreateKeymasterDevice(dev);
hardware/interfaces/keymaster/3.0/default/KeymasterDevice.cpp:88:        return ::keymaster::ng::CreateKeymasterDevice(dev);
hardware/interfaces/keymaster/3.0/default/KeymasterDevice.cpp:94:        return ::keymaster::ng::CreateKeymasterDevice(dev);
hardware/interfaces/keymaster/3.0/default/KeymasterDevice.cpp:102:        return ::keymaster::ng::CreateKeymasterDevice();
hardware/interfaces/keymaster/4.0/default/service.cpp:28:    auto keymaster = ::keymaster::V4_0::ng::CreateKeymasterDevice(SecurityLevel::SOFTWARE);
vendor/broadcom/bcm_platform/hals/keymaster/4.0/BcmKm40.sage.cpp:1806:         auto swkm = ::keymaster::V4_0::ng::CreateKeymasterDevice(SecurityLevel::SOFTWARE);
vendor/broadcom/bcm_platform/hals/keymaster/4.0/BcmKm40.tee.cpp:1087:      auto swkm = ::keymaster::V4_0::ng::CreateKeymasterDevice(SecurityLevel::SOFTWARE);
device/generic/goldfish/keymaster/strongbox/service.cpp:29:    using ::keymaster::V4_0::ng::CreateKeymasterDevice;
device/generic/goldfish/keymaster/strongbox/service.cpp:35:    auto keymaster = CreateKeymasterDevice(SecurityLevel::TRUSTED_ENVIRONMENT);
device/generic/goldfish/keymaster/strongbox/service.cpp:41:    auto strongbox = CreateKeymasterDevice(SecurityLevel::STRONGBOX);
grep: device/ti/beagle_x15/hostcc/ar: No such file or directory
grep: device/ti/beagle_x15/hostcc/cc: No such file or directory
grep: device/ti/beagle_x15/hostcc/ld: No such file or directory
grep: device/ti/beagle_x15/hostcc/strings: No such file or directory
grep: device/ti/beagle_x15/hostcc/gcc: No such file or directory
grep: device/ti/beagle_x15/hostcc/g++: No such file or directory
grep: device/ti/beagle_x15/hostcc/ld.bfd: No such file or directory
android-q-ab2/src-km$ grep -Rn CreateBcmKm40 vendor/broadcom/
vendor/broadcom/bcm_platform/hals/keymaster/4.0/BcmKm40Tee.h:123:IKeymasterDevice* CreateBcmKm40();
vendor/broadcom/bcm_platform/hals/keymaster/4.0/BcmKm40.sage.cpp:3544:IKeymasterDevice* CreateBcmKm40() {
vendor/broadcom/bcm_platform/hals/keymaster/4.0/service.cpp:29:    auto keymaster = ::bcm::keymaster::V4_0::implementation::CreateBcmKm40();
vendor/broadcom/bcm_platform/hals/keymaster/4.0/BcmKm40.tee.cpp:1902:IKeymasterDevice* CreateBcmKm40() {
vendor/broadcom/bcm_platform/hals/keymaster/4.0/BcmKm40Sage.h:150:IKeymasterDevice* CreateBcmKm40();

发现,在:

  • hardware/interfaces/keymaster/4.0/default/service.cpp

    • 提供了一个基于AndroidKeymaster4Device的实现
  • vendor/broadcom/bcm_platform/hals/keymaster/4.0/service.cpp
    • 提供了一个Broadcom平台的具体实现

在device, hardware, system和vendor下搜索hardware相关service脚本:

android-q-ab2/src-km$ find device/ hardware/ system/ vendor/broadcom/ -type f -iname android.hardware.keymaster*.rc
device/generic/goldfish/keymaster/strongbox/android.hardware.keymaster@4.0-strongbox-service.rc
hardware/interfaces/keymaster/3.0/default/android.hardware.keymaster@3.0-service.rc
hardware/interfaces/keymaster/4.0/default/android.hardware.keymaster@4.0-service.rc
system/core/trusty/keymaster/3.0/android.hardware.keymaster@3.0-service.trusty.rc
system/core/trusty/keymaster/4.0/android.hardware.keymaster@4.0-service.trusty.rc
vendor/broadcom/bcm_platform/hals/keymaster/4.0/android.hardware.keymaster@4.0-service.bcm.rc

4.1 Broadcom 私有实现

文件android.hardware.keymaster@4.0-service.bcm.rc是Broadcom实现的KeyMaster Service的启动脚本。

在实现代码中,实际上获取的KeyMaster是Broadcom私有代码CreateBcmKm40返回的一个对象BcmKm40。

# vendor/broadcom/bcm_platform/hals/keymaster/4.0/android.hardware.keymaster@4.0-service.bcm.rc# vendor/broadcom/bcm_platform/hals/keymaster/4.0/service.cpp
int main() {::android::hardware::configureRpcThreadpool(1, true /* willJoinThreadpool */);auto keymaster = ::bcm::keymaster::V4_0::implementation::CreateBcmKm40();if (keymaster == NULL) {LOG(FATAL) << "Could not create Bcm Keymaster 4.0";}auto status = keymaster->registerAsService();if (status != android::OK) {LOG(FATAL) << "Could not register service for Bcm Keymaster 4.0 (" << status << ")";}android::hardware::joinRpcThreadpool();return -1;  // Should never get here.
}# vendor/broadcom/bcm_platform/hals/keymaster/4.0/BcmKm40.sage.cpp
IKeymasterDevice* CreateBcmKm40() {return new BcmKm40();
}

4.2 Android 默认的基于软件的实现

文件android.hardware.keymaster@4.0-service.rc是 Android 默认实现的KeyMaster Service的启动脚本。

Android 默认提供了一个基于软件的KeyMaster实现,即创建服务时: CreateKeymasterDevice(SecurityLevel::SOFTWARE),如果相应的硬件平台没有实现硬件的KeyMaster,则这里会回退使用Android的Software的Keymaster。

# hardware/interfaces/keymaster/4.0/default/android.hardware.keymaster@4.0-service.rc# hardware/interfaces/keymaster/4.0/default/service.cpp
int main() {::android::hardware::configureRpcThreadpool(1, true /* willJoinThreadpool */);auto keymaster = ::keymaster::V4_0::ng::CreateKeymasterDevice(SecurityLevel::SOFTWARE);auto status = keymaster->registerAsService();if (status != android::OK) {LOG(FATAL) << "Could not register service for Keymaster 4.0 (" << status << ")";}android::hardware::joinRpcThreadpool();return -1;  // Should never get here.
}# system/keymaster/ng/AndroidKeymaster4Device.cpp
IKeymasterDevice* CreateKeymasterDevice(SecurityLevel securityLevel) {return new AndroidKeymaster4Device(securityLevel);
}# system/keymaster/ng/AndroidKeymaster4Device.cpp/** AndroidKeymaster4Device::impl_ = new ::keymaster::AndroidKeymaster(KeymasterContext* context, size_t operation_table_size);*   impl_->context_ = new PureSoftKeymasterContext();*   impl_->operation_table_ = (new OperationTable(kOperationTableSize));* AndroidKeymaster4Device::securityLevel_ = securityLevel;*/
AndroidKeymaster4Device::AndroidKeymaster4Device(SecurityLevel securityLevel): impl_(new ::keymaster::AndroidKeymaster([]() -> auto {auto context = new PureSoftKeymasterContext();context->SetSystemVersion(GetOsVersion(), GetOsPatchlevel());return context;}(),kOperationTableSize)), securityLevel_(securityLevel) {}

4.3 Trusty 实现

文件android.hardware.keymaster@4.0-service.trusty.rc是 Trusty 实现的KeyMaster Service的启动脚本。

基于 Trusty TEE 的 KeyMaster实现,代码分析略。

# system/core/trusty/keymaster/4.0/android.hardware.keymaster@4.0-service.trusty.rc# system/core/trusty/keymaster/4.0/service.cpp
int main() {::android::hardware::configureRpcThreadpool(1, true);auto trustyKeymaster = new keymaster::TrustyKeymaster();int err = trustyKeymaster->Initialize();if (err != 0) {LOG(FATAL) << "Could not initialize TrustyKeymaster (" << err << ")";return -1;}auto keymaster = new ::keymaster::V4_0::TrustyKeymaster4Device(trustyKeymaster);auto status = keymaster->registerAsService();if (status != android::OK) {LOG(FATAL) << "Could not register service for Keymaster 4.0 (" << status << ")";return -1;}android::hardware::joinRpcThreadpool();return -1;  // Should never get here.
}# system/core/trusty/keymaster/TrustyKeymaster.cpp
int TrustyKeymaster::Initialize() {int err;err = trusty_keymaster_connect();if (err) {ALOGE("Failed to connect to trusty keymaster %d", err);return err;}ConfigureRequest req;req.os_version = GetOsVersion();req.os_patchlevel = GetOsPatchlevel();ConfigureResponse rsp;Configure(req, &rsp);if (rsp.error != KM_ERROR_OK) {ALOGE("Failed to configure keymaster %d", rsp.error);return -1;}return 0;
}TrustyKeymaster::TrustyKeymaster() {}# system/core/trusty/keymaster/4.0/TrustyKeymaster4Device.cpp
/** TrustyKeymaster4Device::impl_ = new keymaster::TrustyKeymaster()*/
TrustyKeymaster4Device::TrustyKeymaster4Device(TrustyKeymaster* impl) : impl_(impl) {}

4.4 Goldfish 实现

从代码中可以看到,Goldfish 有基于 StrongBox 和 一般 KeyMaster 两种

  • StrongBox
# device/generic/goldfish/keymaster/strongbox/android.hardware.keymaster@4.0-strongbox-service.rc# device/generic/goldfish/keymaster/strongbox/service.cpp
int main() {::android::hardware::configureRpcThreadpool(1, true /* willJoinThreadpool */);using android::hardware::keymaster::V4_0::SecurityLevel;using ::keymaster::V4_0::ng::CreateKeymasterDevice;/** Create two software keymaster devices claiming different security levels for testing* purposes. They do not have the certificates of real TEE or Strongbox keymaster devices.*/auto keymaster = CreateKeymasterDevice(SecurityLevel::TRUSTED_ENVIRONMENT);auto status = keymaster->registerAsService("default");if (status != android::OK) {LOG(FATAL) << "Could not register default service for Keymaster 4.0 (" << status << ")";}auto strongbox = CreateKeymasterDevice(SecurityLevel::STRONGBOX);status = strongbox->registerAsService("strongbox");if (status != android::OK) {LOG(FATAL) << "Could not register strongbox service for Keymaster 4.0 (" << status << ")";}android::hardware::joinRpcThreadpool();return -1;  // Should never get here.
}# 以上代码基于不同的security level创建了两个keymaster设备keymaster和strongbox
# using ::keymaster::V4_0::ng::CreateKeymasterDevice;
  • Keymaster
#
# device/generic/goldfish/keymaster/trusty
#
# 模拟器使用的都是ranchu内核,android源码是在7.0的时候才开始提供的,路径是:prebuilts/qemu-kernel/x86/ranchu/kernel-qemu
# 编译可用的Android模拟器ranchu内核# device/generic/goldfish/keymaster/trusty/keymaster_module.cpp
struct keystore_module HAL_MODULE_INFO_SYM __attribute__((visibility("default"))) = {.common ={.tag = HARDWARE_MODULE_TAG,.module_api_version = KEYMASTER_MODULE_API_VERSION_2_0,.hal_api_version = HARDWARE_HAL_API_VERSION,.id = KEYSTORE_HARDWARE_MODULE_ID,.name = "Trusty Keymaster HAL",.author = "The Android Open Source Project",.methods = &keystore_module_methods,.dso = 0,.reserved = {},},
};/** Generic device handling*/
static int trusty_keymaster_open(const hw_module_t* module __unused, const char* name, hw_device_t** device) {if (strcmp(name, KEYSTORE_KEYMASTER) != 0) {return -EINVAL;}// Use softkeymaster in guest instead of connecting to host implementation of softkeymaster*device = reinterpret_cast<hw_device_t*>((new keymaster::SoftKeymasterDevice())->keymaster2_device());return 0;
}# system/keymaster/contexts/soft_keymaster_device.cpp
keymaster2_device_t* SoftKeymasterDevice::keymaster2_device() {return &km2_device_;
}

4.5 QualComm 私有实现

这个应该是 QualComm 基于老的 KeyMaster 接口的实现,还是原来的 HAL_MODULE 的形式,不适合最新的 KeyMaster,默认实现比较简单,公开的代码中没有最新的实现。

# hardware/qcom/keymaster/keymaster_qcom.cppstatic struct hw_module_methods_t keystore_module_methods = {.open = qcom_km_open,
};struct keystore_module HAL_MODULE_INFO_SYM
__attribute__ ((visibility ("default"))) = {.common = {.tag = HARDWARE_MODULE_TAG,.module_api_version = QCOM_KEYMASTER_API_VERSION,.hal_api_version = HARDWARE_HAL_API_VERSION,.id = KEYSTORE_HARDWARE_MODULE_ID,.name = "Keymaster QCOM HAL",.author = "The Android Open Source Project",.methods = &keystore_module_methods,.dso = 0,.reserved = {},},
};

5. 关于 KeyMaster 的注释文档

system/keymaster/include/keymaster/keymaster_context.h 提供了一些关于 keymaster 的注释,如果需要学习 KeyMaster,建议看下 Android 官方关于 KeyMaster 的文档。

Android 官方网站文档: https://source.android.google.cn/security/keystore?hl=zh-cn

# system/keymaster/include/keymaster/keymaster_context.h/*** KeymasterContext provides a singleton abstract interface that encapsulates various* environment-dependent elements of AndroidKeymaster.** AndroidKeymaster runs in multiple contexts.  Primarily:** - In a trusted execution environment (TEE) as a "secure hardware" implementation.  In this*   context keys are wrapped with an master key that never leaves the TEE, TEE-specific routines*   are used for random number generation, all AndroidKeymaster-enforced authorizations are*   considered hardware-enforced, and there's a bootloader-provided root of trust.** - In the non-secure world as a software-only implementation.  In this context keys are not*   encrypted (though they are integrity-checked) because there is no place to securely store a*   key, OpenSSL is used for random number generation, no AndroidKeymaster-enforced authorizations*   are considered hardware enforced and the root of trust is a static string.** - In the non-secure world as a hybrid implementation fronting a less-capable hardware*   implementation.  For example, a keymaster0 hardware implementation.  In this context keys are*   not encrypted by AndroidKeymaster, but some may be opaque blobs provided by the backing*   hardware, but blobs that lack the extended authorization lists of keymaster1.  In addition,*   keymaster0 lacks many features of keymaster1, including modes of operation related to the*   backing keymaster0 keys.  AndroidKeymaster must extend the blobs to add authorization lists,*   and must provide the missing operation mode implementations in software, which means that*   authorization lists are partially hardware-enforced (the bits that are enforced by the*   underlying keymaster0) and partially software-enforced (the rest). OpenSSL is used for number*   generation and the root of trust is a static string.** More contexts are possible.*/
class KeymasterContext {...
}
  • AndroidKeymaster运行在多个上下文context中

    • TEE, secure hardware, 由TEE的一个master key包含keymaster key
    • REE, software-only implementation
      • keys没有加密, OpenSSL用来生成随机数
    • REE (hybrid implementation, a less-capable hardware implementation)

广告

洛奇工作中常常会遇到自己不熟悉的问题,这些问题可能并不难,但因为不了解,找不到人帮忙而瞎折腾,往往导致浪费几天甚至更久的时间。

所以我组建了几个微信讨论群(记得微信我说加哪个群,如何加微信见后面),欢迎一起讨论:

  • 一个密码编码学讨论组,主要讨论各种加解密,签名校验等算法,请说明加密码学讨论群。
  • 一个Android OTA的讨论组,请说明加Android OTA群。
  • 一个git和repo的讨论组,请说明加git和repo群。

在工作之余,洛奇尽量写一些对大家有用的东西,如果洛奇的这篇文章让您有所收获,解决了您一直以来未能解决的问题,不妨赞赏一下洛奇,这也是对洛奇付出的最大鼓励。扫下面的二维码赞赏洛奇,金额随意:

洛奇自己维护了一个公众号“洛奇看世界”,一个很佛系的公众号,不定期瞎逼逼。公号也提供个人联系方式,一些资源,说不定会有意外的收获,详细内容见公号提示。扫下方二维码关注公众号:

Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现相关推荐

  1. Android Q 基站刷新接口源码分析 适配双卡手机基站刷新逻辑

    目录 一.获取基站信息的两个关键方法 getAllCellInfo调用流程总结 requestCellInfoUpdate 流程总结 问题 二.双卡手机适配 Android Q requestCell ...

  2. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  3. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  4. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | Instrumentation 源码分析 )

    文章目录 一.Instrumentation 源码分析 二.Instrumentation 创建 Application 相关的部分源码 dex 解密时 , 需要将 代理 Application 替换 ...

  5. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | LoadedApk 源码分析 )

    文章目录 一.LoadedApk 源码分析 二.LoadedApk 源码 makeApplication 方法分析 dex 解密时 , 需要将 代理 Application 替换为 真实 Applic ...

  6. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | ActivityThread 源码分析 )

    文章目录 一.ActivityThread 源码分析 二.ActivityThread 部分代码示例 dex 解密时 , 需要将 代理 Application 替换为 真实 Application ; ...

  7. Android shortcut的使用及源码分析

    Android shortcut的使用及源码分析 最近遇到了一个切换国家码后部分应用的shortcut未更新的问题,就学习了shortcut的相关知识,在这里分享一下我了解的知识,希望能对大家有帮助. ...

  8. gSOAP 源码分析(二)

    gSOAP 源码分析(二) 2012-5-24 flyfish 一 gSOAP XML介绍 Xml的全称是EXtensible Markup Language.可扩展标记语言.仅仅是一个纯文本.适合用 ...

  9. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

最新文章

  1. java寻找最大的字母_【LeetCode(Java) - 744】寻找比目标字母大的最小字母
  2. 想转行做web前端工程师,必学这6大技能!你都知道吗?
  3. file协议访问linux,Mozilla Firefox for Android 'file'协议未授权访问漏洞(CVE-2014-1501)
  4. 使用wireshark工具抓取手机包
  5. 如何教女朋友学 Python?
  6. Docker 比较好的新入门教程
  7. unix系统发展史3
  8. Python科学计算——Numpy知识点
  9. 太卷了,这篇 CPU Cache,估计没人看
  10. 最通俗PLC教程—源自Koyo光洋PLC自学总结(1)
  11. 头指针、头节点、首元结点——《王道数据结构》
  12. 标准偏差:评价数据的离散程度
  13. strtolower()和strtoupper()中文乱码问题
  14. CTF逆向-[GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用
  15. html思维导图word版,(完整word版)非谓语动词练习及思维导图
  16. PS2 键盘在win10下开机过程 收发的数据
  17. 几行代码!用 Python 画漂亮、专业的插图
  18. Apache/.htaccess的Order Allow,Deny 详解
  19. 如何在topcoder上进行算法比赛
  20. 【目标检测·yolo系列】YOLOV3目标检测论文笔记(参考 同济子豪兄的解读)

热门文章

  1. Mapbox GL JS介绍及使用
  2. skywalking内部测试服务器安装记录
  3. tcl国际化路线一直堪称商界经
  4. [overleaf] 插入图片无法显示
  5. this和super
  6. 区块链入门:如何简单易懂地介绍区块链(图文)
  7. 清华大学老师的一席话
  8. android 商城评价,打开应用商店对应用进行评价
  9. 动态SQL(if、where、trim、choose when otherwise、foreach、sql标签等)
  10. ElsaticSearch为什么搜索很快