本文记录MTK芯片在Android S(Android 12)大版本上基于trustonic tee方案来开启Widevine L1方案整个移植过程。

MTK平台支持Widevine L1情况

G系列中高端平台,G70/G80/G85/G88对应mt6769平台,G90/G95对应mt6785平台,G96对应mt6781平台

软件宏设置情况

"preloader":[["MTK_TEE_SUPPORT", "yes"],["MICROTRUST_TEE_SUPPORT", "no"],["MTK_SEC_VIDEO_PATH_SUPPORT", "yes"],["TRUSTONIC_TEE_SUPPORT", "yes"],["MTK_NEBULA_VM_SUPPORT", "no"],["MTK_GOOGLE_TRUSTY_SUPPORT", "no"]
],"trustzone":[["MTK_ATF_SUPPORT", "yes"],["MTK_TEE_SUPPORT", "yes"],["MICROTRUST_TEE_SUPPORT", "no"],["TRUSTONIC_TEE_SUPPORT", "yes"],["MTK_TEE_DRAM_SIZE", "0x6000000"]
],"project":[["MTK_ATF_SUPPORT", "yes"],["MTK_TEE_SUPPORT", "yes"],["MICROTRUST_TEE_SUPPORT", "no"],["TRUSTONIC_TEE_SUPPORT", "yes"],["MTK_TEE_GP_SUPPORT", "yes"],["MTK_DRM_KEY_MNG_SUPPORT", "yes"],["MTK_NEBULA_VM_SUPPORT", "no"],["MTK_SEC_VIDEO_PATH_SUPPORT", "yes"],["MTK_WVDRM_SUPPORT", "yes"],["MTK_WVDRM_L1_SUPPORT", "yes"],["MTK_WMA_PLAYBACK_SUPPORT", "no"],["MTK_PERSIST_PARTITION_SUPPORT", "yes"]
],"kernel":[["CONFIG_MICROTRUST_TEE_SUPPORT", "n"],["CONFIG_TRUSTONIC_TEE_SUPPORT", "y"],["CONFIG_MTK_TEE_GP_SUPPORT", "y"],["CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT", "y"],["CONFIG_MTK_DRM_KEY_MNG_SUPPORT", "y"],["CONFIG_MTK_NEBULA_VM_SUPPORT", "n"],["CONFIG_TEE", "y"]
]

Widevine L1 Key安装

向Google申请Widevine keybox

提供机器的设备信息(品牌名/项目名/市场名/TAC等信息),如果申请test key务必不要用项目真实信息去申请Widevine keybox。

切割Widevine keybox

在Linux系统下执行gen_key.sh脚本(如下),将会同级目录下生成Kkb、Kkb_pri、Kkb_pub和Pkb四个文件

#!/bin/bashfunction format_file()
{local filename=$1local tmp="temp"mv $filename $tmplen=$(ls -l $tmp | awk '{print $5}')let len-=1dd if=$tmp of=$filename bs=1 count=$lenrm $tmp
}openssl genrsa -out Kkb_pri.pem 2048
openssl rsa -inform PEM -in Kkb_pri.pem -outform DER -out Kkb_pri
openssl rsa -text -in Kkb_pri.pem -pubout | head -n 20 | tail -n18 > tempfile
rm Kkb_pri.pemfor (( i=0;i<10;i++ ))
dosed 's/ //' -i tempfile
donedd if=tempfile of=Kkb_pub skip=3 bs=1 &&  rm tempfile
format_file Kkb_pubopenssl rand -hex 32 > Kkb
format_file Kkbecho "00" > tempfile
format_file tempfileopenssl rand -hex 128 > tempfile2
format_file tempfile2cat tempfile tempfile2 > Pkbrm tempfile tempfile2

在win7系统下打开EncSW.exe程序(MTK工具)

通过上述操作将在EncSW.exe同级目录/encsw/生成array.c文件,将array.c文件中的两把密钥替换掉软件代码vendor/mediatek/proprietary/trustzone/trustonic/source/trustlets/keyinstall/common/TlKeyInstall/drm/common/key.c中两把密钥(一一对应)

在win7系统下打开KeySplitter.exe程序(MTK工具)

Key File为Google申请的drm key(2020-04-27_01-30-23.396_UTC.1587951023985.output,目前只申请一个DeviceID对应的drm key,内容如下)

<?xml version="1.0"?>
<Widevine>
<NumberOfKeyboxes>1</NumberOfKeyboxes>
<Keybox DeviceID="356317110000005"><Key>1d2d12b4233a571bdaba91993e7f7cae</Key><ID>00000002000046f75aa37d0374c35f39f4c8d9bba69b46cf6a6c885a6bc543886b91b0faca4e686157bed0c343f5fed85b7a8581ec808db4679ebb964e6bd36d943350a16854e97b</ID><Magic>6b626f78</Magic><CRC>0f4822d9</CRC></Keybox>
</Widevine>

点击【Split】之后将生成splitter/widevine/2020-04-27_01-30-23.396_UTC.1587951023985_0000000000.bin,接下来可以进一步操作

其中WideVine Key设置中的First Key为splitter/widevine/2020-04-27_01-30-23.396_UTC.1587951023985_0000000000.bin,设置好后,点击【Compose】之后将生成composer/kb_0000000000.bin(Widevine L1 Key)

安装Widevine L1 Key

1、打开SP META

2、SP META设置为“DRM Key Install Tool”

3、点击【Reconnect按钮】,插入手机(手机为关机状态)

4、等待进入meta mode,并弹出如下窗口,并按如下进行安装(参考MTK文档:DRM_Key_Install_Introduction.pdf)

对应的kernel log如下:

[KI_TA] INFO:TA_CreateEntry Point
[KI_TA] INFO:TA_OpenSessionEntryPoint
[KI_TA] INFO:allocated session at 0x0018b018
[KI_TA] INFO:TA_InvokeCommandEntryPoint, commandID: 0x6
[KI_TA] INFO:TZCMD_DRMKEY_INSTALL start
[KI_TA] INFO:Input buffer        = 0x00200960
[KI_TA] INFO:Inputbuffersize     = 1056
[KI_TA] INFO:Output buffer       = 0x00300020
[KI_TA] INFO:Outputbuffersize    = 16384
[KI_TA] INFO:keypair_index \x09\x09= 0
[KI_TA] INFO:[KI] 2
[KI_TA] INFO:get_keypair_index, 0
[KI_TA] INFO:[KI] 3
[KI_TA] INFO:cal_SEJ_seed 1
[KI_TA] INFO:Clear text in(addr)=0x180401, inLen=128
[KI_TA] INFO:cal_SEJ_seed 2
[KI_TA] INFO:l_Ekkb_pub=0x180484, l_PublicKeyOut=0x184df0
[KI_TA] INFO:l_Cpre=0x180584
[KI_TA] INFO:l_Pkb=0x180400, l_Pkb[0]=0x0
[KI_TA] INFO:[KI] 4
[KI_TA] INFO:l_Ekkb_pub=0x180484, l_PublicKeyOut=0x184df0
[KI_TA] INFO:l_Cpre=0x180584
[KI_TA] INFO:l_Pkb[0]=0x0
[KI_TA] INFO:Clear text in(addr)=0x180401, inLen=128
[KI_TA] INFO:shaResult=0x184b00, l_Cpre=0x180584, aesKey=0x184ae0, aesIV=0x184af0
[KI_TA] INFO:l_Ekkb_pub=0x180484, l_PublicKeyOut=0x184df0
[KI_TA] INFO:aes128_cbc_decrypt: Ciphertext length = 256
[KI_TA] INFO:plaintext length: 256
[KI_TA] INFO:[KI] 5
[KI_TA] INFO:212hasEkkb=0x1
[KI_TA] INFO:hLen=0x14, modulus_len=0x100
[KI_TA] INFO:msglen=0x100, modulus_bitlen=0x800
[KI_TA] INFO:OAEP_1
[KI_TA] INFO:OAEP_2
[KI_TA] INFO:OAEP_3
[KI_TA] INFO:OAEP_4
[KI_TA] INFO:OAEP_5
[KI_TA] INFO:OAEP_6
[KI_TA] INFO:OAEP_7
[KI_TA] INFO:OAEP_8
[KI_TA] INFO:OAEP_9
[KI_TA] INFO:OAEP_A
[KI_TA] INFO:OAEP_B
[KI_TA] INFO:[KI] 6
[KI_TA] INFO:-------------4
[KI_TA] INFO:shaLen=0x20
[KI_TA] INFO:Clear text in(addr)=0x18b028, inLen=800
[KI_TA] INFO:shaLen=0x20
[KI_TA] INFO:signLen=0x100
[KI_TA] INFO:-------------5
[KI_TA] INFO:pkcs_1_pss_decode_sha1 start
[KI_TA] INFO:PSS Sig verify pass
[KI_TA] INFO:pkcs_1_pss_decode_sha1 verify pass
[KI_TA] INFO:[KI] 7
[KI_TA] INFO:[KI] 8
[KI_TA] INFO:[KI] DecMaxKeySize=0x80, DecTotalKeySize=0x80
[KI_TA] INFO:[KI] EncMaxKeySize=0x80, EncTotalKeySize=0x80
[KI_TA] INFO:[KI] MaxKeySize=0x80, TotalKeySize=0x80
[KI_TA] INFO:[KI] keycount: 1
[KI_TA] INFO:[KI] ALIGN_16_BYTES(MaxKeySize + SZ_DRMKEY_ID + SZ_DRMKEY_SIZE): 144
[KI_TA] INFO:[KI] ALIGN_16_BYTES(keycount * sizeof(ENCRYPT_DRM_KEY_T)): 96
[KI_TA] INFO:[KI] ALIGN_16_BYTES(keycount * SZ_DRMKEY_SIG): 16
[KI_TA] INFO:[KI] ALIGN_16_BYTES(TotalKeySize): 128
[KI_TA] INFO:[KI] 8
[KI_TA] INFO:[KI] 81
[KI_TA] INFO:[KI] 9, i=0
[KI_TA] INFO:[KI] A
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 16
[KI_TA] INFO:[KI] B
[KI_TA] INFO:aes128_cbc_decrypt: Ciphertext length = 128
[KI_TA] INFO:plaintext length: 128
[KI_TA] INFO:[KI] C
[KI_TA] INFO:[KI] D
[KI_TA] INFO:[KI] E1
[KI_TA] INFO:[KI] E2,drmKeyID=0x0 inputSize=0x88, drmKeySize=0x80, total=0x88
[KI_TA] INFO:[KI] E3,TempBuf=0x18f458
[KI_TA] INFO:[KI] E02
[KI_TA] INFO:[KI] E03
[KI_TA] INFO:[KI] E04
[KI_TA] INFO:Clear text in(addr)=0x18f458, inLen=136
[KI_TA] INFO:[KI] F
[KI_TA] INFO:cal_SEJ_seed 1
[KI_TA] INFO:Clear text in(addr)=0x184ae8, inLen=12
[KI_TA] INFO:cal_SEJ_seed 2
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 128
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 128
[KI_TA] INFO:[KI] J
[KI_TA] INFO:cal_SEJ_seed 1
[KI_TA] INFO:Clear text in(addr)=0x184ae8, inLen=12
[KI_TA] INFO:cal_SEJ_seed 2
[KI_TA] INFO:aes128_ecb_decrypt: Ciphertext length = 128
[KI_TA] INFO:aes128_ecb_decrypt: plaintext length = 128
[KI_TA] INFO:OK! Encrypt & Decrypt check OK!
[KI_TA] INFO:[KI] K
[KI_TA] INFO:[KI] L
[KI_TA] INFO:cal_SEJ_seed 1
[KI_TA] INFO:Clear text in(addr)=0x180401, inLen=128
[KI_TA] INFO:cal_SEJ_seed 2
[KI_TA] INFO:[KI] sizeof(TempBuf) = 0x4
[KI_TA] INFO:cal_SEJ_seed 1
[KI_TA] INFO:Clear text in(addr)=0x184aa8, inLen=12
[KI_TA] INFO:cal_SEJ_seed 2
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 16
[KI_TA] INFO:aes128_cmac: enter inputLen =0x90
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: plaintext length = 16
[KI_TA] INFO:aes128_ecb_encrypt: Ciphertext length = 16
[KI_TA] INFO:[KI] M
[KI_TA] INFO:[KI] N
[KI_TA] INFO:[KI] N1
[KI_TA] INFO:[KI] N111
[KI_TA] INFO:[KI] N2
[KI_TA] INFO:[KI] N3
[KI_TA] INFO:[KI] N4
[KI_TA] INFO:[KI] O, i = 0
[KI_TA] INFO:[KI] p1
[KI_TA] INFO:[KI] p2
[KI_TA] INFO:[KI] p3
[KI_TA] INFO:[KI] p4
[KI_TA] INFO:[KI] p5
[KI_TA] INFO:[KI] p6
[KI_TA] INFO:TZCMD_DRMKEY_INSTALL end, nOutputSize: 296
[KI_TA] INFO:TA_CloseSessionEntryPoint
[KI_TA] INFO:client called 1 times, encoded 0 bytes.
[KI_TA] INFO:TA_DestroyEntryPoint
[KI_TA] INFO:TA_CreateEntry Point
[KI_TA] INFO:TA_OpenSessionEntryPoint
[KI_TA] INFO:allocated session at 0x000b5018
[KI_TA] INFO:TA_InvokeCommandEntryPoint, commandID: 0xD
[KI_TA] INFO:TZCMD_DRMKEY_STORE_KB start
[KI_TA] INFO:pInput        = 0x00100350
[KI_TA] INFO:nInputSize    = 296
[KI_TA] INFO:[KI] tl_keyblock_write_to_RPMB starts, encKeyBlock = 0x000b5028, length = 296
[KI_TA] INFO:[KI] TEE_RpmbOpenSession() done!
[KI_TA] ERROR:[KI] TEE_RpmbWriteData(8) fails: teeResult = -65536, result = 1
[KI_TA] INFO:[KI] tl_keyblock_write_to_RPMB ends
[KI_TA] INFO:TZCMD_DRMKEY_STORE_KB end, nOutputSize: 0
[KI_TA] INFO:TA_CloseSessionEntryPoint
[KI_TA] INFO:client called 1 times, encoded 0 bytes.
[KI_TA] INFO:TA_DestroyEntryPoint
[KI_TA] INFO:TA_CreateEntry Point
[KI_TA] INFO:TA_OpenSessionEntryPoint
[KI_TA] INFO:allocated session at 0x00047018
[KI_TA] INFO:TA_InvokeCommandEntryPoint, commandID: 0x1
[KI_TA] INFO:TZCMD_DRMKEY_QUERY start
[KI_TA] INFO:Input           = 0x00100840
[KI_TA] INFO:Inputbuffersize = 16384
[KI_TA] INFO:Keytype buffer  = 0x00200318
[KI_TA] INFO:=== query_drmkey_impl start ===
[KI_TA] INFO:query_1, keyblock=0x00047028
[KI_TA] INFO:query_2, keycount=1
[KI_TA] INFO:query_8, i=0, size=88
[KI_TA] INFO:query_9, i=0
[KI_TA] INFO:query_A, SZ_DRMKEY_HEADER_SIZE=80, encryptDrmHeader.encDrmKeySize=128, SZ_DRMKEY_SIG=16,
[KI_TA] INFO:query_A, i=0, keytype=0x4b030, keyid=0x0, keyblockLeng=224, encryptDrmHeader.encDrmKeySize=128
[KI_TA] INFO:=== query_drmkey_impl end ===
[KI_TA] INFO:TZCMD_DRMKEY_QUERY end, count: 1
[KI_TA] INFO:TA_CloseSessionEntryPoint
[KI_TA] INFO:client called 1 times, encoded 0 bytes.
[KI_TA] INFO:TA_DestroyEntryPoint

在软件开启Widevine L1和烧录Widevine L1 Key之后,则可使用drminfo APK查看到Security Level为L1

基于trustonic tee使能MTK Widevine L1(SVP)相关推荐

  1. 基于Android 6.0 MTK 彩信收发

    想要开发彩信功能的收发,就必须了解原生SMS彩信是如何发送,因此我们就要基于它的流程来开发彩信的发送.... 对看过彩信发送流程的同学,想必就不过多介绍,此篇只简单介绍一下,原生的彩信发送是在Work ...

  2. 基于RT1052 Aworks使能U盘功能(十九)

    本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发# 1. 首先阅读原理图 前置知识,一般来说访问U盘,软件上需要满足如下几点功能. USB host 驱动 USB ho ...

  3. 基于RT1052 Awroks 使能看门狗记录(二)

    本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发 1. 首先阅读原理图 正常来说看门狗超时,CPU会直接复位,有时会要求输出复位脉冲.这个功能可以使能,也可以不使能. ...

  4. 基于scikit-learn求向量/矩阵的L1范数和L2范数

    示例代码如下: from sklearn import preprocessing import numpy as npX = [[ 1., -1., 2.],[ 2., 0., 0.],[ 0., ...

  5. [TT]-Trustonic acronyms

    缩写 解释 TEE (Trusted Execution Environment) REE (Rich Execution Environment) NWd (Normal World) SWd (S ...

  6. SoK: Understanding the Prevailing Security Vulnerabilities in TrustZone-assisted TEE Systems论文笔记

    SoK: Understanding the Prevailing Security Vulnerabilities in TrustZone-assisted TEE Systems 题外话 所谓T ...

  7. TEE(Trusted Execution Environment)简介

    TEE(Trusted Execution Environment),可信执行环境,该环境可以保证不被常规操作系统干扰的计算,因此称为"可信".这是通过创建一个可以在TrustZo ...

  8. Android可信执行环境TEE最全介绍

    TEE简介 TEE的全称trusted execution environment,它是移动设备(智能手机.平板电脑.智能电视)CPU上的一块区域.这块区域的作用是给数据和代码的执行提供一个更安全的空 ...

  9. 重磅!中国电信研究院、浦发银行、冲量在线和中国信通院联合发布-隐私计算之TEE技术实践分析

    隐私计算之TEE技术和应用实践分析 大数据时代,数据流通.安全等问题接踵而至. 据IDC预测,全球数据总量预计2020年达到44ZB,我国数据量将达到8060EB,占全球数据总量的18%.2025年全 ...

  10. mtk case 搜索

    MTK搜索地址:https://online.mediatek.com/QuickStart/QS00017#QSS03939CTS和GTS直接用USER版本测试 GSI只要刷system文件 Vts ...

最新文章

  1. java改成c语言专业名词解释,求助大神!!!JAVA转换成C语言
  2. 视频|每日CeBIT:IBM九大展区各显神通,传统工业与工业4.0的博弈
  3. python判断文件是否为空文件对象_判断Python对象是不是为文件对象的方法有哪些...
  4. python下面代码是什么_python代码下面__name__= __main__怎么使用 作用是什么?
  5. sublime html 折叠,关于sublime text, notepad++,vscode 代码折叠显示的比较
  6. 如何在私服上传jar包
  7. 2014年3月26日,今天的收获_______每天都能觉得进步,这是多么好的一件事
  8. 在TextView中添加图片属性
  9. $2019$ 暑期刷题记录 $2$(基本算法专题)
  10. python tab和空格混用_我的 Python 编码规范
  11. mysql删除员工_MySQL误删数据救命指南:开发人员必收藏
  12. 三菱a系列motion软体_通化三菱Q00JCPU
  13. 精读CSS权威指南第四版(4)
  14. 使用cmd命令安装apk文件
  15. Windows注册表开机自启,右键菜单,运行的位置介绍
  16. 20个免费的webservice接口(测试人员必须知道)
  17. 知识图谱学习(一)(笔记整理)
  18. scrollView无限滚动,横屏和竖屏
  19. 解决input输入的是空格问题
  20. CAD.net cad中的菜单创建

热门文章

  1. AllenNLP使用Predictor进行预测
  2. 贝叶斯网络模型自动搭建
  3. python制作adobe photoshop插件_Python 图像处理这样学 小白也易懂,还能顺便学习 Photoshop...
  4. kali攻击wifi、破解wifi密码详细教程(一)
  5. JavaWeb和WebGIS学习笔记(七)——MapGuide Open Source安装、配置以及MapGuide Maestro发布地图——超详细!目前最保姆级的MapGuide上手教程!
  6. 《麦肯锡方法》第四部分 麦肯锡生存之道 第17-19章-思维导图
  7. Flash反编译软件ASV2013之SWF转Fla教程
  8. 小猪的Python学习之旅 —— 7.Python并发之threading模块(1)
  9. aspectjweaver AspectJ
  10. html 如何写退出程序,vb点击关闭窗口 单击退出程序的VB代码怎么写