文档管理中心

证书CMS解封装

本文导读

从API version 22开始,支持证书CMS解封装。

PKCS #7是用于存储签名或加密数据的标准语法。CMS作为PKCS #7的扩展,支持的数据类型包括数据、签名数据、封装数据、签名和封装数据、摘要数据以及加密数据。该标准常用于保护数据的完整性和机密性。

目前仅支持CMS签名数据和封装数据。

开发步骤

  1. 导入证书模块

    收起
    自动换行
    深色代码主题
    复制
    1. import { cert } from '@kit.DeviceCertificateKit';
  2. 调用证书CMS封装进行CMS数据封装。

  3. 调用cert.createCmsParser创建CmsParser对象。

  4. 调用cmsParser.setRawData设置CMS数据。

  5. 调用cmsParser.decryptEnvelopedData解密封装数据。

解封装示例:

收起
自动换行
深色代码主题
复制
  1. import { cert } from '@kit.DeviceCertificateKit';
  2. let ECC_256_PUBKEY: string =
  3. '-----BEGIN CERTIFICATE-----\n' +
  4. 'MIICGDCCAb6gAwIBAgIGAXKnJjrAMAoGCCqGSM49BAMCMFcxCzAJBgNVBAYTAkNO\n' +
  5. 'MQ8wDQYDVQQIDAbpmZXopb8xDzANBgNVBAcMBuilv+WuiTEPMA0GA1UECgwG5rWL\n' +
  6. '6K+VMRUwEwYDVQQDDAzkuK3mlofmtYvor5UwHhcNMjUwOTE2MDY0MTMwWhcNMzUw\n' +
  7. 'OTE0MDY0MTMwWjBXMQswCQYDVQQGEwJDTjEPMA0GA1UECAwG6ZmV6KW/MQ8wDQYD\n' +
  8. 'VQQHDAbopb/lrokxDzANBgNVBAoMBua1i+ivlTEVMBMGA1UEAwwM5Lit5paH5rWL\n' +
  9. '6K+VMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEB06h4SzOryi3d7PW9yN2wACC\n' +
  10. 'VxlduBQjVLWZlDKhFKkdZjve8mUyytSSbBj/rrzR2XmzUzofuNkUbAtje3DDJqN2\n' +
  11. 'MHQwHQYDVR0OBBYEFNtUldgBESf31bwTnYtApIctaSdtMB8GA1UdIwQYMBaAFNtU\n' +
  12. 'ldgBESf31bwTnYtApIctaSdtMAsGA1UdDwQEAwIBBjAJBgNVHREEAjAAMAkGA1Ud\n' +
  13. 'EgQCMAAwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNIADBFAiEAzxzaG2vR\n' +
  14. 'zUnFFL3X3lRQ0IOJrb6cvkSZuaFd4bW2lgUCIHW6QGGnECDFMbDNz7Og9kjkt+3k\n' +
  15. 'FmEJWqEMYudBH3Ul\n' +
  16. '-----END CERTIFICATE-----';
  17. let ECC_256_PRIVATE: string =
  18. '-----BEGIN PRIVATE KEY-----\n' +
  19. 'MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgOYwEyIw3ZNIAL4xO\n' +
  20. 'pP6eVcQYcrL2sfnt6vB0z9tKmMmhRANCAAQHTqHhLM6vKLd3s9b3I3bAAIJXGV24\n' +
  21. 'FCNUtZmUMqEUqR1mO97yZTLK1JJsGP+uvNHZebNTOh+42RRsC2N7cMMm\n' +
  22. '-----END PRIVATE KEY-----';
  23. // string转Uint8Array。
  24. function stringToUint8Array(str: string): Uint8Array {
  25. let arr: number[] = [];
  26. for (let i = 0, j = str.length; i < j; i++) {
  27. arr.push(str.charCodeAt(i));
  28. };
  29. return new Uint8Array(arr);
  30. }
  31. async function createX509Cert(inStream: string): Promise<cert.X509Cert> {
  32. let encodingBlob: cert.EncodingBlob = {
  33. data: stringToUint8Array(inStream),
  34. encodingFormat: cert.EncodingFormat.FORMAT_PEM
  35. };
  36. let x509Cert: cert.X509Cert = {} as cert.X509Cert;
  37. try {
  38. x509Cert = await cert.createX509Cert(encodingBlob);
  39. } catch (error) {
  40. console.error(`createX509Cert failed: errCode: ${error.code}, message: ${error.message}`);
  41. }
  42. return x509Cert;
  43. }
  44. async function testCmsDecryptTest() {
  45. try {
  46. let plainText: Uint8Array = new Uint8Array([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]);
  47. let x509CertEc: cert.X509Cert = await createX509Cert(ECC_256_PUBKEY);
  48. let cms: cert.CmsGenerator = cert.createCmsGenerator(cert.CmsContentType.ENVELOPED_DATA);
  49. let option: cert.CmsGeneratorOptions = {
  50. outFormat: cert.CmsFormat.PEM
  51. };
  52. cms.setRecipientEncryptionAlgorithm(cert.CmsRecipientEncryptionAlgorithm.AES_128_GCM);
  53. let recipientInfo: cert.CmsRecipientInfo = {
  54. keyAgreeInfo: {
  55. cert: x509CertEc,
  56. digestAlgorithm: cert.CmsKeyAgreeRecipientDigestAlgorithm.SHA256
  57. }
  58. };
  59. await cms.addRecipientInfo(recipientInfo);
  60. console.info('add recipient result: success, digestAlgorithm = ' + recipientInfo.keyAgreeInfo?.digestAlgorithm);
  61. let envelopeData = await cms.doFinal(plainText, option);
  62. console.info('doFinal result: success, envelopeData = ' + envelopeData);
  63. let cipherText = await cms.getEncryptedContentData();
  64. console.info('getEncryptedContentData result: success, cipherText = ' + cipherText);
  65. let config: cert.CmsEnvelopedDecryptionConfig = {
  66. keyInfo: {
  67. key: ECC_256_PRIVATE
  68. },
  69. };
  70. let cmsDecrypt: cert.CmsParser = cert.createCmsParser();
  71. await cmsDecrypt.setRawData(envelopeData, cert.CmsFormat.PEM);
  72. let decPlainText: Uint8Array = await cmsDecrypt.decryptEnvelopedData(config);
  73. console.info('decryptEnvelopedData result: success, decPlainText = ' + decPlainText);
  74. console.info('decryptEnvelopedData result: success.');
  75. } catch (error) {
  76. console.error(`decryptEnvelopedData failed: errCode: ${error.code}, message: ${error.message}`);
  77. }
  78. }
在 指南 中进行搜索
请输入您想要搜索的关键词