文档管理中心
我的
您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录
指南系统安全Device Security Kit(设备安全服务)可信应用服务安全图像压缩、裁剪场景

安全图像压缩、裁剪场景

场景介绍

在安全图像支持压缩、裁剪场景中,通过创建证明密钥、打开证明会话的方式,对从安全摄像头获取的图像数据进行压缩、裁剪处理并重新签名,降低安全摄像头的原始图像大小,同时也能确保图像数据的真实性和完整性。

约束与限制

该特性需要设备支持安全摄像头功能,其支持的设备范围与安全摄像头场景保持一致。开发者可以参考安全摄像头场景的约束与限制,判断设备是否支持安全摄像头。

业务流程

接口说明

接口及使用方法请参见API参考。

展开
接口名 描述
createAttestKey(options: AttestOptions): Promise<void> 创建证明密钥。
initializeAttestContext(userData: string, options: AttestOptions): Promise<AttestReturnResult> 初始化证明会话。
finalizeAttestContext(options: AttestOptions): Promise<void> 结束证明会话。
destroyAttestKey(): Promise<void> 销毁证明密钥。
procSecImageTransform(srcSecImage: ArrayBuffer, Options: SecImageProcOptions): Promise<SecImageBuffer> 处理安全图像压缩、裁剪操作。

开发步骤

  1. 导入trustedAppService模块和相关依赖模块。

    收起
    自动换行
    深色代码主题
    复制
    1. import { trustedAppService } from '@kit.DeviceSecurityKit';
    2. import { BusinessError } from '@kit.BasicServicesKit';
    3. import hilog from '@ohos.hilog';
    4. import { cryptoFramework } from '@kit.CryptoArchitectureKit';
    5. import { util } from '@kit.ArkTS';
    6. import { cert } from '@kit.DeviceCertificateKit';
  2. 参考安全摄像头开发指导,获取安全图像。

  3. 创建证明密钥和初始化证明会话。

    说明
    • 只有创建证明密钥成功后,才能初始化证明会话。

    • 证明密钥的有效期为7天,为了避免反复创建证明密钥,建议先调用初始化证明会话,如果初始化失败,再去销毁、创建证明密钥,然后重新初始化证明密钥。

    • 调用initializeAttestContext初始化证明会话时,userData的长度必须在16到127 Bytes之间。

    • 创建安全图像压缩、裁剪场景的证明密钥:
      收起
      自动换行
      深色代码主题
      复制
      1. private async creatSecureImageProcAttestKey(): Promise<void> {
      2. // 创建证明密钥的参数
      3. const createProperties: Array<trustedAppService.AttestParam> = [
      4. {
      5. tag: trustedAppService.AttestTag.ATTEST_TAG_ALGORITHM,
      6. value: trustedAppService.AttestKeyAlg.ATTEST_ALG_ECC
      7. },
      8. {
      9. tag: trustedAppService.AttestTag.ATTEST_TAG_KEY_SIZE,
      10. value: trustedAppService.AttestKeySize.ATTEST_ECC_KEY_SIZE_256
      11. }
      12. ];
      13. const createOptions: trustedAppService.AttestOptions = {
      14. properties: createProperties
      15. };
      16. // 创建证明密钥
      17. try {
      18. await trustedAppService.createAttestKey(createOptions);
      19. hilog.info(0x0000, 'TrustedAppService', 'createAttestKey successfully');
      20. } catch (error) {
      21. const err = error as BusinessError;
      22. hilog.error(0x0000, 'trustedappservice', `createattestkey failed, errCode: ${err.code}, errMsg: ${err.message}`);
      23. throw new Error(err.message);
      24. }
      25. }
    • 初始化安全图像压缩、裁剪场景的证明会话:
      收起
      自动换行
      深色代码主题
      复制
      1. private async initSecureImageProcAttestContext(): Promise<number> {
      2. try {
      3. // 初始化证明会话的参数
      4. const deviceId = 0;
      5. const initProperties: Array<trustedAppService.AttestParam> = [
      6. {
      7. tag: trustedAppService.AttestTag.ATTEST_TAG_DEVICE_TYPE,
      8. value: trustedAppService.AttestType.ATTEST_TYPE_SECIMAGE_PROCESS
      9. },
      10. {
      11. tag: trustedAppService.AttestTag.ATTEST_TAG_DEVICE_ID,
      12. value: BigInt(deviceId) // 此参数在安全图像压缩、裁剪场景下不生效
      13. }
      14. ];
      15. const initOptions: trustedAppService.AttestOptions = {
      16. properties: initProperties
      17. };
      18. let userData = 'trusted_app_service_default_userdata'; // 示例值,实际值请自行生成,长度在16到127 Bytes之间
      19. // 初始化话证明会话
      20. const certChainResult = await trustedAppService.initializeAttestContext(userData, initOptions);
      21. if (certChainResult.certChains.length < 1) {
      22. throw new Error('empty returned cert chain');
      23. }
      24. // ...
      25. return 0;
      26. } catch (err) {
      27. const businessError = err as BusinessError;
      28. hilog.error(0x0000, 'TrustedAppService',
      29. `initializeAttestContext failed. errCode: ${businessError.code}, errMsg: ${businessError.message}`);
      30. const finalNumericCode = Number(String(businessError.code ?? '').replace('n', '').trim());
      31. return Number.isNaN(finalNumericCode) ? -1 : finalNumericCode;
      32. }
      33. }
  4. 请求对安全图像进行压缩、裁剪处理

    • 以压缩场景为例:

      收起
      自动换行
      深色代码主题
      复制
      1. private async procSecImageCompression(compressQuality: number, srcSecureImage: ArrayBuffer): Promise<ArrayBuffer> {
      2. try {
      3. let properties: Array<trustedAppService.SecImageProcParams> = [
      4. {
      5. tag: trustedAppService.SecImageProcTag.SECIMAGE_TAG_PROC_OPERATION,
      6. value: trustedAppService.SecImageProcOperation.SECIMAGE_COMPRESSION,
      7. },
      8. {
      9. tag: trustedAppService.SecImageProcTag.SECIMAGE_TAG_SRC_IMAGE_FORMAT,
      10. value: trustedAppService.SecImageProcFormat.SECIMAGE_FORMAT_YUV_NV21, // 安全图像压缩、裁剪命令输入的原始图像格式都为:YUV420 NV21 格式
      11. },
      12. {
      13. tag: trustedAppService.SecImageProcTag.SECIMAGE_TAG_DEST_IMAGE_FORMAT,
      14. value: trustedAppService.SecImageProcFormat.SECIMAGE_FORMAT_JPEG, // 安全图像压缩命令返回的图像格式为:JPEG 格式
      15. },
      16. {
      17. tag: trustedAppService.SecImageProcTag.SECIMAGE_TAG_COMPRESSION_QUALITY,
      18. value: compressQuality, // 实际使用请替换为业务场景需要的压缩质量
      19. },
      20. ];
      21. const procParams: trustedAppService.SecImageProcParamsArray = {
      22. properties: properties
      23. };
      24. // srcSecureImage:实际使用请替换为Camera Kit获取到的安全图像buffer
      25. return (await trustedAppService.procSecImageTransform(srcSecureImage, procParams)).secImage;
      26. } catch (err) {
      27. const businessError = err as BusinessError;
      28. hilog.error(0x0000, 'TrustedAppService',
      29. `procSecImageTransform failed, code: ${businessError.code}, msg: ${businessError.message}`);
      30. throw new Error(businessError.message);
      31. }
      32. }
    • 以裁剪场景为例:

      收起
      自动换行
      深色代码主题
      复制
      1. private async procSecImageCropping(cropRegion: trustedAppService.CropRegion,
      2. srcSecureImage: ArrayBuffer): Promise<ArrayBuffer> {
      3. try {
      4. let properties: Array<trustedAppService.SecImageProcParams> = [
      5. {
      6. tag: trustedAppService.SecImageProcTag.SECIMAGE_TAG_PROC_OPERATION,
      7. value: trustedAppService.SecImageProcOperation.SECIMAGE_CROPPING,
      8. },
      9. {
      10. tag: trustedAppService.SecImageProcTag.SECIMAGE_TAG_SRC_IMAGE_FORMAT,
      11. value: trustedAppService.SecImageProcFormat.SECIMAGE_FORMAT_YUV_NV21, // 安全图像压缩、裁剪命令输入的原始图像格式都为:YUV420 NV21 格式
      12. },
      13. {
      14. tag: trustedAppService.SecImageProcTag.SECIMAGE_TAG_DEST_IMAGE_FORMAT,
      15. value: trustedAppService.SecImageProcFormat.SECIMAGE_FORMAT_YUV_NV21, // 安全图像裁剪命令返回的图像格式为:YUV420 NV21 格式
      16. },
      17. {
      18. tag: trustedAppService.SecImageProcTag.SECIMAGE_TAG_CROP_REGION,
      19. value: {
      20. // 实际使用请替换为业务场景需要的裁剪区域范围
      21. x: cropRegion.x,
      22. y: cropRegion.y,
      23. width: cropRegion.width,
      24. height: cropRegion.height
      25. },
      26. },
      27. ];
      28. let procParams: trustedAppService.SecImageProcParamsArray = {
      29. properties: properties,
      30. };
      31. // srcSecureImage:实际使用请替换为Camera Kit获取到的安全图像buffer
      32. return (await trustedAppService.procSecImageTransform(srcSecureImage, procParams)).secImage;
      33. } catch (err) {
      34. const businessError = err as BusinessError;
      35. hilog.error(0x0000, 'TrustedAppService',
      36. `procSecImageTransform failed, code: ${businessError.code}, msg: ${businessError.message}`);
      37. throw new Error(businessError.message);
      38. }
      39. }
  5. 结束证明会话。

    收起
    自动换行
    深色代码主题
    复制
    1. private async finalizeSecureImageProcAttestContext(): Promise<void> {
    2. // 结束证明会话的参数
    3. const finalProperties: Array<trustedAppService.AttestParam> = [
    4. {
    5. tag: trustedAppService.AttestTag.ATTEST_TAG_DEVICE_TYPE,
    6. value: trustedAppService.AttestType.ATTEST_TYPE_SECIMAGE_PROCESS
    7. }
    8. ];
    9. const finalOptions: trustedAppService.AttestOptions = {
    10. properties: finalProperties,
    11. };
    12. // 结束证明会话
    13. try {
    14. await trustedAppService.finalizeAttestContext(finalOptions);
    15. } catch (err) {
    16. const error = err as BusinessError;
    17. hilog.error(0x0000, 'TrustedAppService',
    18. `Failed to finalize attest context, code:${error.code}, message:${error.message}`);
    19. }
    20. }

    如果需要销毁证明密钥,请在结束证明会话后,调用destroyAttestKey接口。由于安全摄像头、安全地理位置和安全图像压缩、裁剪共用同一个证明密钥,销毁前需要保证其余场景功能未在使用该证明密钥。