基于trustonic tee使能MTK Widevine L1(SVP)

DRM-widevine 总结 1. 前言 Widevine是google在ICS(android4.0)版本上新推出的一种DRM数字版权管理功能,有这个功能的话,就能从google指定的服务器上,下载经过google加密的版权文件,例如视频、应用等等。 google推出这个功能主要的目的是为了在应用内容上可以和苹果更好的竞争,由于目前android的开放性,导致基本上所有的android应用都可以很快的扩散并免费安装,因此导致... 阅读详情
AI摘要

本文详细介绍了MTK芯片在Android S(Android 12)系统上实现Widevine L1的安全等级移植过程,包括软件宏设置、Key的生成与安装、Kernel配置以及相关工具的使用。在完成这些步骤后,设备能够支持高级别的DRM内容播放。

本文记录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/bash

function format_file()
{
	local filename=$1
	local tmp="temp"
	
	mv $filename $tmp
	
	len=$(ls -l $tmp | awk '{print $5}')
	let len-=1
	
	dd if=$tmp of=$filename bs=1 count=$len
	rm $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.pem

for (( i=0;i<10;i++ ))
do
	sed 's/ //' -i tempfile
done

dd if=tempfile of=Kkb_pub skip=3 bs=1 &&  rm tempfile
format_file Kkb_pub

openssl rand -hex 32 > Kkb
format_file Kkb

echo "00" > tempfile
format_file tempfile

openssl rand -hex 128 > tempfile2
format_file tempfile2

cat tempfile tempfile2 > Pkb

rm 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

DRM(数字权限管理技术)防截屏录屏----widevine谷歌浏览器防截屏录屏demo ‌‌‌Widevine‌是一种由谷歌开发的数字版权管理(DRM)技术,主要用于保护和传递数字内容,如视频和应用程序。Widevine技术通过加密内容并限制未经授权的复制和再分发,帮助内容提供者保护其版权。Widevine的基本概念Widevine技术分为三个安全级别:L1、L2和L3。不同级别的安全性决定了可以播放的视频内容的质量和范围。1‌、L1‌:最高安全级别,通常用于高质量视频和高分辨率的流媒体,内容在设备内进行解密,并使用硬件保护,以防止原始数据泄露。 阅读详情

相关推荐

Widevine数字版权管理及其在嵌入式设备中的重要性

它通过加密和授权管理机制,保护和管理数字内容的传输和播放,防止盗版和非法复制,提升用户体验,支持多平台和多设备的访问。在数字娱乐产业快速发展的今天,Widevine为内容创作者和服务提供商提供了一种可靠的保护机制,同时也为用户提供了更安全和便捷的娱乐体验。Widevine采用了多层加密和授权策略,确保内容只能被授权用户在授权设备上进行播放,并防止未经授权的复制、传播和盗版行为。Widevine是一种数字版权管理(DRM)系统,广泛应用于许多流媒体平台和设备上,以保护和管理数字内容的传输和播放。

DevCyberX的博客 668

Google Widevine 及其工作原理

Google Widevine 是一种常用的 DRM 解决方案,支持 Android 操作系统、多种智能电视、浏览器等。Widevine 还支持 MPEG-DASH、HLS、MSS 以及 CENC 和 CMAF,这种广泛的支持使它成为视频传输中非常受欢迎的 DRM 解决方案。在本文中,我们将深入了解谷歌的 Widevine DRM 解决方案 —— 它是一种流行的 DRM 解决方案,在 Web 和移动生态系统中获得了广泛支持。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 6617

深入理解DRM(二)——了解Widevine与OEMCrypto

文章目录基本术语定义KeyBox是什么Widevine的级别Widevine DRM FrameworkWidevine Classic与Widevine ModularOEMCrypto是什么1.OEMCrypto中的Session2. OEMCrypto API2.1 Crypto Device Control2.2 Crypto Key Ladder2.3 Decryption API2.4 Keybox Provisioning2.5 Keybox Access关键解密流程 基本术语定义 Dev

张晖的专栏 9588

如何检查 Android 设备是否支持 Widevine DRM

想知道您的 Android 设备是否可以流式传输来自 Netflix 和 Amazon Prime Video 的高清视频?这是检查 Widevine DRM 支持的方法!许多流媒体服务,如 Netflix、Disney+、Hulu 等,使用各种类型的数字版权管理 (DRM) 来保护其内容不被复制和重新分发。大多数 DRM 实际上并没有阻止这种行为,而是主要用来惹恼那些为内容付费的人,但那是另一个时间的讨论。

天天的博客 6271

什么是 Widevine 数字版权管理 (DRM),它为什么重要

许多视频服务(如Disney Plus、Netflix和Prime Video )不允许某些智能手机以高于 480p 的分辨率播放电影或电视节目。锁定的原因是这些服务受数字版权管理 (DRM) 保护,以防止复制和未经授权重新分发这些视频文件。 为了确保 Android 智能手机和许多其他设备免受盗版,这些流行的流媒体服务使用了Google 的 Widevine DRM 平台。作为业界最古老的 DRM 服务之一,它估计安装在全球约 40 亿台设备上。 以下是您需要了解的有关 Widevine 及其工作原理的.

baron-周贺贺-代码改变世界ctw 3260

sp_meta工具

MTK平台进入meta模式的工具源代码,方便进入meta模式的二次开发

DRM之Widevine学习入门

逻辑上,安全世界中,安全系统的OS提供统一的服务,针对不同的安全需求加载不同的安全应用TA(Trusted Application)。DASH为不同DRM系统构建了一个简单有效的系统,以共享密钥,密钥标识符,加密算法,参数和信令,以及将专有数据存储在保护系统特定报头(PSSH)中的位置,但将DRM具体实现留给了系统自身。Widevine支持在硬件层与厂商的安全机制绑定,在boot等底层中加入自主研发的安全机制,只有通过可信赖的bootloader才能使用具有正常权限的手机软件,并支持Widevine机制。

Venus 的博客 2304

我的老款Intel MacBook Pro,如何用OpenVINO把本地大模型推理速度提升10倍?

本文详细介绍了如何在老款Intel MacBook Pro上使用OpenVINO工具包将本地大模型推理速度提升10倍。通过对比Ollama CPU原生、Transformers原生和OpenVINO优化三种方案,展示了OpenVINO在性能优化上的显著优势,并提供了从环境配置到模型转换、性能调优的完整实战指南。

weixin_28694295的博客 300

深入理解 DRM (1) --了解Widevine与OEMCrypto

在上面的方案中,解密操作在OEMCrypto API中实现,而另一种方案是把解密操作留给decoders去实现。直译为key的阶梯/梯子,其实理解为key的栈更好,我们知道所有的key在传输时都会被加密,所以想要使用一个key,必须要先对其进行解密(一般就是用位于key ladder顶端的key来解密),解密得到的key又被加到key ladder中为接下来的操作做好准备.这部分API同时要求设备必须提供AES-128 ECB,CBC和CTR的硬件支持,保证clear key不会暴露给cpu。

Venus 的博客 5891

Pikachu靶场环境搭建(Windows环境下安装详细教程)

Pikachu靶场是一个漏洞测试练习平台。其中包含了常见的web安全漏洞,如果你是一个渗透测试学习者没有靶场的练手,那么pikachu是一个很好的测试平台。

weixin_42857656的博客 1823

Bellhop水声信道模型的仿真

Bellhop是一种基于射线追踪的水声信道模型,广泛用于预测水下环境中的声压场。它通过模拟声波在水中的传播路径,计算声场分布,适用于复杂的水下通信场景。

yt94832的博客 1313

安卓的8种Key

root Key、attestation Key、ifaa、fido、fido2、widevine、hdcp Key

olivia的博客 2488

Java开发者必备:Ollama4j客户端库全面指南与实战

在AI应用开发领域,本地部署大型语言模型(LLM)已成为降低成本和提升隐私安全的重要趋势。其核心原理是通过REST API与模型服务器交互,实现文本生成、对话和语义理解等功能。这一技术为Java生态系统带来了显著的工程价值,使开发者能够便捷地将AI能力集成到企业级应用中。Ollama4j作为一款专为Java设计的轻量级客户端库,通过封装底层HTTP通信和JSON处理,提供了类型安全、面向对象的API,极大地简化了与Ollama服务器的交互。它全面支持流式生成、多轮对话、嵌入向量计算以及高级的**工具调用**

weixin_28295799的博客 436

什么是可信执行环境(TEE)?

可信执行环境(TEE)是一个执行代码的环境,在该环境中,执行代码的人可以高度信任周围环境,因为它可以忽略来自设备其他部分的威胁。可信执行环境(TEE)是一个执行代码的环境,在该环境中,执行代码的人可以高度信任周围环境的资产管理,因为它可以忽略来自设备“未知”部分的威胁。因此,TEE代表可信执行环境,为了将其与REE中应用程序的不确定性质区分开来,TEE中的应用程序被称为可信应用程序(TA)。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 4863

云端全自动AI漫剧生成工作流:从模型选型到完整实现

本文提出了一套云端全自动AI漫剧生成工作流解决方案,旨在解决传统漫剧制作效率低下的问题。该系统采用"编排引擎+模型矩阵"架构,通过集成大语言模型、图像生成、视频合成等技术,实现从剧本输入到成片输出的全流程自动化。 核心内容包括: 模型选型方案:剧本解析采用DeepSeek-V3/GPT-4o,图像生成使用DALL-E 3,视频合成选用Stable Video Diffusion,语音合成采用MiniMax TTS 系统架构设计:基于Celery分布式任务队列的编排层,分解任务至各功能模块

huanghm88的专栏 642

173、NPU的编译器开发:开源社区贡献指南

本文分享了在NPU编译器开源社区贡献的经验心得。作者通过实际案例(如卷积维度错误、NaN输出等)阐述了NPU编译器开发的特殊性:硬件迭代快、边界条件复杂、厂商代码不可全信。提出有价值的贡献应聚焦硬件适配测试、性能剖析工具和反模式文档三类内容。强调用实测数据沟通、主动承担维护责任、保持代码通用性等社区协作技巧,并建议通过RFC提前沟通、附硬件实测数据等方式提高PR通过率。最后指出,NPU编译器开发是与聪明人共同填坑的过程,鼓励开发者提交"有诚意的代码"而非完美代码。

m0_50546716的博客 35

MTK启动内存地址TEE,ATF启动地址计算

在移植TEE OS到MTK的过程中,遇到一个ATF,TEE启动地址的运算问题,跟了下代码流程,把大概的过程记录下。1. MTK总main入口Main.c android_mtk_6755_mp\vendor\mediatek\proprietary\bootable\bootloader\preloader\platform\mt6755\src\corestatic int bldr_l...

求变,从思想开始 3466

【Unity】【WebRTC】如何用Unity而不是浏览器接收远程画面

之前几篇我们讨论了如何设置信令服务器,如何发送画面给远端以及如何用浏览器查看同步画面,今天来讨论如何实现Unity内部接收画面。看本篇之前请先看过之前将web服务器设置和基本远程画面功能的几篇博文。在Unity编辑器中打开一个示例项目,点击BroadCast按钮。4. 再点击Receiver按钮,Start。Build一个示例项目,并运行这个项目。启动Web.app。

每日出拳老爷子的博客 1721

MTK tee.img的打包原理介绍

在编译时,会调用到如下路径的makefile文件,在该文件中,将bl31.bin和teei.raw拼在了一起,形成了tee.img vendor/mediatek/proprietary/trustzone/custom/build/Android.mk BUILT_TRUSTZONE_TARGET := $(TRUSTZONE_IMAGE_OUTPUT_PATH)/bin/tee.img //目标文件 $(BUILT_TRUSTZONE_TARGET): $(ATF_COMP_IMAGE_NAME)

baron-周贺贺-代码改变世界ctw 2313

lammps教程:实例讲解npt、nvt系综的选择

对于lammps新手来说,系综的选择令人困惑,到底是应该用nvt系综还是npt系综? 我在初学lammps时就被这个问题困扰了很久。如果去问别人,可能会告诉你一个答案:根据模拟需要确定。 其实和没说一样。 到底如何确定系综,确实不是一句两句能够说清楚的,不同的体系、不同的模拟目的要选择不同的系综。 前几天遇到的一个合金的模拟案例,比较有代表性,分享出来供大家参考。 建模方法和之前介绍过的高熵合金建模方法类似,先建立单晶模型,然后使用替换原子的命令获得合金结构。 建模完成后,按照常规,先上nvt系综进行驰豫

lammps_jiayou的博客 9767

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Google Widevine DRM 认证

Widevine DRM key有两种方式可以获取,一种是通过申请做谷歌GMS认证,需要安卓系统并集成谷歌的GMS套件并测试通过后获得,另一种单独做Widevine认证,只集成Widevine代码且测试部分测试项,可支持Android(Aosp)跟Linux系统认证,以下为单独的Windevine 认证流程。3.搭建测试环境,进行所有测试项的预测试后提供测试结果,如有fail项协助整改,避免样机送到3PL后测试不通过出现额外的测试费用。1.集成Widevine代码并写好KEY,提供样机做测试。

shijiayu1993的博客 1955

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android MTK 10.0动态分区修改super

动态分区是 Android 10 上新功能,是 Android 系统的用户空间分区系统,此功能的优势在于厂商不再需要关心 system,vendor,product 等只读分 区的大小。只需要定义一个 Super 分区和对应大小即可,而 Super 分区的子分区存储空间可以动态调整。 打开动态分区功能MTK_DYNAMIC_PARTITION_SUPPORT = yes mt8168 10.0工程项目的super分区大小配置路径为 device\mediateksample\projectn..

蚁人日记 5994

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Trustonic Tee

(4)Tokenization。国际芯片卡标准化组织EMVCo定义了智能卡支付,也定义了一个Token(即令牌),在实际卡应用中作为代用品。商家可以使用同样的方式处理卡和令牌,这意味着没有必要改变已经部署和安装的PoS(Point of Sale)终端。这种巧妙的处理通过一个令牌服务提供商TSP(Token Service Provider)进行,TSP拥有实际的卡信息。签发令牌Token...

求变,从思想开始 7108

Google Widevine及其工作原理

 点击上方“LiveVideoStack”关注我们翻译、编辑:Alex技术审校:刘姗本文来自OTTVerse,作者为Krishna Rao Vijayanagar。▲扫描图中二维码或点击阅读原文▲了解音视频技术大会更多信息Widevine DRMEasy-Tech#018#Google Widevine是一种常用的DRM解决方案,支持Android操作系统、多种智能电视、浏览器等。Widevine还支持MPEG-DASH、HLS、MSS以及CENC和CMAF,这种广泛的支持使它成为视频传输中非常受

LiveVideoStack 8986

widevine L1 与 widevine L3

摘要:Widevine是谷歌推出的主流数字版权管理(DRM)方案,被Netflix等流媒体平台广泛采用。其L1级通过将DRM密钥预置到TEE安全环境,先传输加密设备密钥和内容密钥再传输加密视频,安全性较高;而L3级密钥通过网络动态传输,存在被截获破解的风险。两种方案在密钥存储方式和传输流程上存在差异,导致安全等级不同,L1可有效防止视频内容被非法破解。

大家好我是nono牛,在安全的世界里面我们一起学习与探讨 997
上一篇: Security | 数字签名和数字证书
下一篇: 内存管理—连续分配
林知共创
博客等级 码龄15年 3435粉丝 97原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值