گواهینامه های تست دستگاه Matter را ایجاد کنید

سناریوهای توسعه خاصی مانند تست OTA نیاز به ایجاد گواهینامه های غیر تولیدی دارند.

برخی از ویژگی‌های اکوسیستم Google، از جمله به‌روزرسانی‌های نرم‌افزار OTA دستگاه را نمی‌توان با استفاده از تست VID/PID انجام داد .

این راهنما نحوه ایجاد و تأیید Matter غیر تولیدی را برای استفاده در آزمایش توضیح می‌دهد. انواع گواهینامه ها عبارتند از:

  1. بیانیه گواهینامه ( CD )
  2. گواهینامه گواهی محصول میانی ( PAI )
  3. گواهی تأیید دستگاه ( DAC )

در طول فرآیند راه اندازی، یک دستگاه دارای گواهینامه Matter باید خود را تأیید کند ، یعنی ثابت کند که یک محصول واقعی دارای گواهی Matter است. مدارک مورد استفاده توسط دستگاه های Matter برای تأیید عبارتند از:

  1. یک جفت کلید تصدیق
  2. یک زنجیره گواهی

گواهی تأیید دستگاه (DAC) اولین پیوند زنجیره گواهی است و توسط گواهی میانی گواهی محصول (PAI) تأیید می شود که به نوبه خود توسط مرجع تأیید محصول (PAA) تأیید می شود.

گواهینامه ها همزمان با ایجاد جفت کلید گواهی امضا می شوند و با استفاده از کلید خصوصی مرجع صدور گواهی یک سطح بالاتر امضا می شوند و زنجیره ای از اعتماد را تشکیل می دهند. بنابراین، یک گواهی DAC توسط یک کلید PAI و یک گواهی PAI توسط یک کلید PAA امضا می شود. گواهینامه های PAA به عنوان بالای زنجیره، خود امضا هستند. این زنجیره اعتماد یک ساختار PAA فدرال را تشکیل می دهد که توسط دفتر کل انطباق توزیع شده (DCL) همگام سازی می شود.

اطلاعات بیشتر در مورد فرآیند تأیید و اظهارنامه های گواهی (CD) را می توان در اسناد و پیام های تأییدیه اضافی و در مشخصات موضوع یافت.

Matter SDK را نصب کنید

این دستورالعمل‌ها فرض می‌کنند که Matter SDK را نصب کرده‌اید. لطفاً به مستندات آن در Github مراجعه کنید یا برای اطلاعات بیشتر به شروع با Matter مراجعه کنید.

اگر برنامه hexdump xxd را ندارید آن را نصب کنید. این ابزار برای چاپ اعتبارنامه ها در قالب C-style مفید است:

sudo apt-get install xxd

ساخت chip-cert

  1. مطمئن شوید که روی نسخه اخیر SDK کار می کنید. این رویه‌ها در Github SHA 0b17bce8 ، در v1.0-branch آزمایش شدند:

    $ cd connectedhomeip
    $ git checkout v1.0-branch
    $ git pull
    
  2. Build chip-cert ، که ابزاری است که برای چندین عملیات روی اعتبارنامه‌های دستگاه‌های Matter استفاده می‌شود:

    1. پیکربندی ساخت:

      $ cd src/credentials
      $ source ../../scripts/activate.sh
      $ gn gen out
      

      نمونه خروجی gn :

      Done. Made 5774 targets from 289 files in 658ms
      
    2. ساخت را اجرا کنید:

      $ ninja -C out
      

      نمونه خروجی ninja :

      ninja: Entering directory `out'
      [2000/2000] stamp obj/default.stamp
      

گواهی های خود را ضرب کنید

VID/PID سفارشی خود را به عنوان متغیرهای محیطی صادر کنید تا احتمال خطای اداری هنگام ویرایش آرگومان های فرمان کاهش یابد:

$ cd ../..
$ export VID=hexVendorId
$ export PID=hexProductId

یک سی دی تولید کنید

  1. سی دی را با استفاده از chip-cert تولید کنید. در حال حاضر کمیسیونر فقط تأیید می‌کند که VID و PID با داده‌هایی که در مکان‌های دیگر توسط دستگاه در معرض دید قرار می‌گیرند مطابقت دارند: خوشه اطلاعات پایه، مبدا DAC و DAC (در صورت داشتن آن). می توانید سایر قسمت ها را بدون تغییر رها کنید:

    $ src/credentials/out/chip-cert gen-cd \
      --key credentials/test/certification-declaration/Chip-Test-CD-Signing-Key.pem \
      --cert credentials/test/certification-declaration/Chip-Test-CD-Signing-Cert.pem \
      --out credentials/test/certification-declaration/Chip-Test-CD-${VID}-${PID}.der \
      --format-version "1" \
      --vendor-id "${VID}" \
      --product-id "${PID}" \
      --device-type-id "0x1234" \
      --certificate-id "ZIG20141ZB330001-24" \
      --security-level "0" \
      --security-info "0" \
      --version-number "9876" \
      --certification-type "0"
    
  2. سی دی را تایید کنید. مطمئن شوید که حاوی VID/PID شما (در قالب اعشار) است:

    $ src/credentials/out/chip-cert print-cd credentials/test/certification-declaration/Chip-Test-CD-${VID}-${PID}.der
    

    خروجی نمونه:

    SignerKeyId value: hex:62FA823359ACFAA9963E1CFA140ADDF504F37160
    0x01, tag[Anonymous]: 0xffffffff, type: Structure (0x15), container:
    0x04,     tag[Context Specific]: 0x0, type: Unsigned Fixed Point (0x04), value: 1
    0x08,     tag[Context Specific]: 0x1, type: Unsigned Fixed Point (0x04), value: XXXXX // <- VID
    0x0A,     tag[Context Specific]: 0x2, type: Array (0x16), container:
    0x0D,         tag[Anonymous]: 0xffffffff, type: Unsigned Fixed Point (0x04), value: XXXXX // <- PID
    0x12,     tag[Context Specific]: 0x3, type: Unsigned Fixed Point (0x04), value: 4660
    0x15,     tag[Context Specific]: 0x4, type: UTF-8 String (0x0c), length: 19, value: "ZIG20141ZB330001-24"
    0x2B,     tag[Context Specific]: 0x5, type: Unsigned Fixed Point (0x04), value: 0
    0x2E,     tag[Context Specific]: 0x6,type: Unsigned Fixed Point (0x04), value: 0
    0x32,     tag[Context Specific]: 0x7, type: Unsigned Fixed Point (0x04), value: 39030
    0x35,     tag[Context Specific]: 0x8, type: Unsigned Fixed Point (0x04), value: 0
    

یک PAI و DAC ایجاد کنید

در این مثال، از گواهینامه مرجع تأیید محصول آزمایشی خود Matter (PAA) و امضای کلید Chip-Test-PAA-NoVID به عنوان گواهی ریشه استفاده می کنیم. ما از آن به عنوان CA ریشه برای تولید PAI و DAC خود استفاده خواهیم کرد.

  1. PAI را با استفاده از PAA ایجاد کنید. شما ممکن است به صورت اختیاری اطلاعات PID را در PAI قرار دهید، اما حذف آن به شما انعطاف بیشتری برای آزمایش می دهد. اگر برای PID های اضافی به DAC نیاز دارید، می توانید فقط مرحله تولید DAC را اجرا کنید:

    $ src/credentials/out/chip-cert gen-att-cert --type i \
      --subject-cn "Matter Test PAI" \
      --subject-vid "${VID}" \
      --valid-from "2021-06-28 14:23:43" \
      --lifetime "4294967295" \
      --ca-key credentials/test/attestation/Chip-Test-PAA-NoVID-Key.pem \
      --ca-cert credentials/test/attestation/Chip-Test-PAA-NoVID-Cert.pem \
      --out-key credentials/test/attestation/"test-PAI-${VID}-key".pem \
      --out credentials/test/attestation/"test-PAI-${VID}-cert".pem
    
  2. DAC را با استفاده از PAI تولید کنید:

    $ src/credentials/out/chip-cert gen-att-cert --type d \
      --subject-cn "Matter Test DAC 0" \
      --subject-vid "${VID}" \
      --subject-pid "${PID}" \
      --valid-from "2021-06-28 14:23:43" \
      --lifetime "4294967295" \
      --ca-key credentials/test/attestation/"test-PAI-${VID}-key".pem \
      --ca-cert credentials/test/attestation/"test-PAI-${VID}-cert".pem \
      --out-key credentials/test/attestation/"test-DAC-${VID}-${PID}-key".pem \
      --out credentials/test/attestation/"test-DAC-${VID}-${PID}-cert".pem
    
  3. زنجیره DAC، PAI و PAA را تأیید کنید. اگر هیچ خطایی در خروجی ظاهر نشود، به این معنی است که زنجیره گواهی گواهی با موفقیت تأیید شده است:

    $ src/credentials/out/chip-cert validate-att-cert \
    --dac credentials/test/attestation/"test-DAC-${VID}-${PID}-cert".pem \
    --pai credentials/test/attestation/"test-PAI-${VID}-cert".pem \
    --paa credentials/test/attestation/Chip-Test-PAA-NoVID-Cert.pem
    
  4. می توانید کلیدهای خود را با استفاده از openssl بررسی کنید:

    $ openssl ec -noout -text -in \
      credentials/test/attestation/test-DAC-${VID}-${PID}-key.pem
    

    خروجی نمونه:

    read EC key
    Private-Key: (256 bit)
    priv:
        c9:f2:b3:04:b2:db:0d:6f:cd:c6:be:f3:7b:76:8d:
        8c:01:4e:0b:9e:ce:3e:72:49:3c:0e:35:63:7c:6c:
        6c:d6
    pub:
        04:4f:93:ba:3b:bf:63:90:73:98:76:1e:af:87:79:
        11:e6:77:e8:e2:df:a7:49:f1:7c:ac:a8:a6:91:76:
        08:5b:39:ce:6c:72:db:6d:9a:92:b3:ba:05:b0:e8:
        31:a0:bf:36:50:2b:5c:72:55:7f:11:c8:01:ff:3a:
        46:b9:19:60:28
    ASN1 OID: prime256v1
    NIST CURVE: P-256
    
  5. همچنین می توانید openssl برای بازرسی گواهی های تولید شده خود استفاده کنید:

    $ openssl x509 -noout -text -in \
      credentials/test/attestation/test-DAC-${VID}-${PID}-cert.pem
    

    خروجی نمونه:

    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number: 2875998130766646679 (0x27e9990fef088d97)
            Signature Algorithm: ecdsa-with-SHA256
            Issuer: CN = Matter Test PAI, 1.3.6.1.4.1.37244.2.1 = hexVendorId
            Validity
                Not Before: Jun 28 14:23:43 2021 GMT
                Not After : Dec 31 23:59:59 9999 GMT
            Subject: CN = Matter Test DAC 0, 1.3.6.1.4.1.37244.2.1 = hexVendorId, 1.3.6.1.4.1.37244.2.2 = hexProductId
            Subject Public Key Info:
                Public Key Algorithm: id-ecPublicKey
                    Public-Key: (256 bit)
                    pub:
                        04:4f:93:ba:3b:bf:63:90:73:98:76:1e:af:87:79:
                        11:e6:77:e8:e2:df:a7:49:f1:7c:ac:a8:a6:91:76:
                        08:5b:39:ce:6c:72:db:6d:9a:92:b3:ba:05:b0:e8:
                        31:a0:bf:36:50:2b:5c:72:55:7f:11:c8:01:ff:3a:
                        46:b9:19:60:28
                    ASN1 OID: prime256v1
                    NIST CURVE: P-256
            X509v3 extensions:
                X509v3 Basic Constraints: critical
                    CA:FALSE
                X509v3 Key Usage: critical
                    Digital Signature
                X509v3 Subject Key Identifier:
                    21:0A:CA:B1:B6:5F:17:65:D8:61:19:73:84:1A:9D:52:81:19:C5:39
                X509v3 Authority Key Identifier:
                    37:7F:24:9A:73:41:4B:16:6E:6A:42:6E:F5:E8:89:FB:75:F8:77:BB
        Signature Algorithm: ecdsa-with-SHA256
        Signature Value:
            30:45:02:20:38:8f:c5:0d:3e:90:95:dd:7d:7c:e9:5a:05:19:
            1f:2d:14:08:a3:d7:0e:b5:15:6d:d3:b0:0b:f7:b8:28:4d:bf:
            02:21:00:d4:05:30:43:a6:05:00:0e:b9:99:0d:34:3d:75:fe:
            d3:c1:4e:73:ff:e7:05:64:7a:62:8d:2d:38:8f:fd:4d:ad
    

PAA

یک فرآیند مشابه می تواند برای تولید یک PAA با امضای خود استفاده شود، اما انجام این کار ضروری نیست.

در عوض، کاری که ما در اینجا انجام داده‌ایم استفاده از PAA توسعه‌ای با امضای خود است که شامل اطلاعات VID نمی‌شود.

برای مثال‌های بیشتر از تولید CD، به credentials/test/gen-test-cds.sh و برای مثال‌های بیشتر از تولید PAA، PAI، و DAC، به credentials/test/gen-test-attestation-certs.sh مراجعه کنید.

گواهی ها را جایگزین کنید

PAA و PAI را جایگزین کنید

  1. اسکریپت کمکی زیر را اجرا کنید که از ابزار CHIP Certificate Tool ( chip-cert ) برای تولید آرایه های به سبک C از گواهی های شما استفاده می کند.

اسکریپت Embeddable Certificates Helper را دانلود کنید

#!/bin/bash

#
# generate-embeddable-certs.sh script
# —----------------------------------
#
# This script generates self-minted DAC and PAI.
# The output may easily be included in your C++ source code.
#

# Edit this information with your paths and certificates
folder="credentials/test/attestation"
chip_cert_tool="src/credentials/out/chip-cert"
cert_file_der="${folder}/test-PAI-${VID}-cert.der"
cert_file_pem="${folder}/test-PAI-${VID}-cert.pem"
key_file_pem="${folder}/test-PAI-${VID}-key.pem"

type="Pai"

printf "namespace chip {\n"
printf "namespace DevelopmentCerts {\n\n"
printf "#if CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID == ${PID}\n\n"

printcert() {
  # convert cert to DER
  if [ -f "${cert_file_der}" ]; then
      rm "${cert_file_der}"
  fi
  "${chip_cert_tool}" convert-cert "${cert_file_pem}" "${cert_file_der}" --x509-der

  printf "// ------------------------------------------------------------ \n"
  printf "// ${type} CERTIFICATE ${cert_file_der} \n\n"

  printf "constexpr uint8_t ${type}_Cert_Array[] = {\n"
  less -f "${cert_file_der}" | od -t x1 -An | sed 's/\/,/g' | sed 's/^/   /g'
  printf "};\n\n"
  printf "ByteSpan k${type}Cert = ByteSpan(${type}_Cert_Array);\n\n"

  printf "// ${type} PUBLIC KEY FROM ${key_file_pem} \n\n"

  printf "constexpr uint8_t ${type}_PublicKey_Array[] = {\n"
  openssl ec -text -noout -in "${key_file_pem}" 2>/dev/null | sed '/ASN1 OID/d' | sed '/NIST CURVE/d' | sed -n '/pub:/,$p' | sed '/pub:/d' | sed 's/\([0-9a-fA-F][0-9a-fA-F]\)/0x\1/g' | sed 's/:/, /g'
  printf "};\n\n"
  printf "ByteSpan k${type}PublicKey = ByteSpan(${type}_PublicKey_Array);\n\n"

  printf "// ${type} PRIVATE KEY FROM ${key_file_pem} \n\n"

  printf "constexpr uint8_t ${type}_PrivateKey_Array[] = {\n"
  openssl ec -text -noout -in "${key_file_pem}" 2>/dev/null | sed '/read EC key/d' | sed '/Private-Key/d' | sed '/priv:/d' | sed '/pub:/,$d' | sed 's/\([0-9a-fA-F][0-9a-fA-F]\)/0x\1/g' | sed 's/:/, /g'
  printf "};\n\n"
  printf "ByteSpan k${type}PrivateKey = ByteSpan(${type}_PrivateKey_Array);\n\n"
}

# generates PAI
printcert

type="Dac"
cert_file_der="${folder}/test-DAC-${VID}-${PID}-cert.der"
cert_file_pem="${folder}/test-DAC-${VID}-${PID}-cert.pem"
key_file_pem="${folder}/test-DAC-${VID}-${PID}-key.pem"

# generates DAC
printcert

printf "#endif // CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID\n"
printf "} // namespace DevelopmentCerts\n"
printf "} // namespace chip\n"


  1. محتویات خروجی PAI و DAC را در پیاده سازی DeviceAttestationCredentialsProvider::GetProductAttestationIntermediateCert کپی کنید.

    در دستگاه های تولیدی، PAI و DAC در Factory Data هستند، در حالی که CD در خود سیستم عامل تعبیه شده است.

    1. اگر هنوز از داده‌های کارخانه استفاده نمی‌کنید، ممکن است بخواهید PAI خود را در src/credentials/examples/ExampleDACs.cpp قرار دهید. در این مورد، کد تولید شده را به فایل ExampleDACs.cpp خود اضافه کنید:

      ByteSpan kDacCert       = ByteSpan(kDevelopmentDAC_Cert_FFF1_801F);
      ByteSpan kDacPrivateKey = ByteSpan(kDevelopmentDAC_PrivateKey_FFF1_801F);
      ByteSpan kDacPublicKey  = ByteSpan(kDevelopmentDAC_PublicKey_FFF1_801F);
      #endif
      } // namespace DevelopmentCerts
      } // namespace chip
      
      /* ------------------------------------------ */
      /* current end-of-file                        */
      /* ------------------------------------------ */
      
      /* ------------------------------------------ */
      /* output of creds-codelab.sh script          */
      /* ------------------------------------------ */
      
      namespace chip {
      namespace DevelopmentCerts {
      
      #if CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID == hexProductId
      
      ...
      
      ByteSpan kDacPrivateKey = ByteSpan(Dac_PrivateKey_Array);
      
      #endif // CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID
      } // namespace DevelopmentCerts
      } // namespace chip
      
    2. اگر از Factory Data یا یک ارائه‌دهنده اعتبار سفارشی استفاده می‌کنید، مطمئن شوید که اعتبارنامه‌ها را در مکان‌های مناسب وارد کرده‌اید. ممکن است بخواهید با ارائه دهنده SoC خود در مورد مشخصات پلت فرم خود بررسی کنید.

سی دی را تعویض کنید

  1. یک نمایش متنی از محتوای فایل سی دی خود را با استفاده از xxd استخراج کنید:

      $ xxd -i credentials/test/certification-declaration/Chip-Test-CD-${VID}-${PID}.der
    

    خروجی نمونه:

      unsigned char credentials_test_certification_declaration_Chip_Test_CD_hexVendorId_hexProductId_der[] = {
        0x30, 0x81, 0xe9, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
        0x07, 0x02, 0xa0, 0x81, 0xdb, 0x30, 0x81, 0xd8, 0x02, 0x01, 0x03, 0x31,
        0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04,
        0x02, 0x01, 0x30, 0x45, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
        0x01, 0x07, 0x01, 0xa0, 0x38, 0x04, 0x36, 0x15, 0x24, 0x00, 0x01, 0x25,
        0x01, 0xfe, 0xca, 0x36, 0x02, 0x05, 0xce, 0xfa, 0x18, 0x25, 0x03, 0x34,
        0x12, 0x2c, 0x04, 0x13, 0x5a, 0x49, 0x47, 0x32, 0x30, 0x31, 0x34, 0x31,
        0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x31, 0x2d, 0x32, 0x34, 0x24,
        0x05, 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x76, 0x98, 0x24, 0x08, 0x00,
        0x18, 0x31, 0x7d, 0x30, 0x7b, 0x02, 0x01, 0x03, 0x80, 0x14, 0x62, 0xfa,
        0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a,
        0xdd, 0xf5, 0x04, 0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86,
        0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, 0x06, 0x08, 0x2a,
        0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x47, 0x30, 0x45, 0x02,
        0x20, 0x53, 0x25, 0x03, 0x2c, 0x96, 0x50, 0xb6, 0x64, 0xf4, 0x18, 0xbf,
        0x99, 0x47, 0xf8, 0x9d, 0xe6, 0xeb, 0x43, 0x94, 0xf1, 0xce, 0xb2, 0x61,
        0x00, 0xe0, 0xf9, 0x89, 0xa8, 0x71, 0x82, 0x02, 0x0a, 0x02, 0x21, 0x00,
        0xea, 0x0a, 0x40, 0xab, 0x87, 0xad, 0x7e, 0x25, 0xe1, 0xa1, 0x6c, 0xb1,
        0x12, 0xfa, 0x86, 0xfe, 0xea, 0x8a, 0xaf, 0x4b, 0xc1, 0xf3, 0x6f, 0x09,
        0x85, 0x46, 0x50, 0xb6, 0xd0, 0x55, 0x40, 0xe2
      };
      unsigned int credentials_test_certification_declaration_Chip_Test_CD_hexVendorId_hexProductId_der_len = 236;
      ```
    
  2. متنی را که در مرحله قبل استخراج کردید در فایلی که برای تعریف سی دی استفاده شده است در بیلد خود کپی کنید. همانطور که در مورد PAI و DAC، نحوه انجام این کار بستگی به پلتفرمی دارد که در حال توسعه هستید.

اگر از نمونه های اعتبار استفاده می کنید، احتمالاً می خواهید محتوای kCdForAllExamples را در ExampleDACProvider::GetCertificationDeclaration در src/credentials/examples/DeviceAttestationCredsExample.cpp جایگزین کنید:

    const uint8_t kCdForAllExamples[] = {
            0x30, 0x81, 0xe9, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
            0x07, 0x02, 0xa0, 0x81, 0xdb, 0x30, 0x81, 0xd8, 0x02, 0x01, 0x03, 0x31,
            0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04,
            0x02, 0x01, 0x30, 0x45, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
            0x01, 0x07, 0x01, 0xa0, 0x38, 0x04, 0x36, 0x15, 0x24, 0x00, 0x01, 0x25,
            0x01, 0xfe, 0xca, 0x36, 0x02, 0x05, 0xce, 0xfa, 0x18, 0x25, 0x03, 0x34,
            0x12, 0x2c, 0x04, 0x13, 0x5a, 0x49, 0x47, 0x32, 0x30, 0x31, 0x34, 0x31,
            0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x31, 0x2d, 0x32, 0x34, 0x24,
            0x05, 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x76, 0x98, 0x24, 0x08, 0x00,
            0x18, 0x31, 0x7d, 0x30, 0x7b, 0x02, 0x01, 0x03, 0x80, 0x14, 0x62, 0xfa,
            0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a,
            0xdd, 0xf5, 0x04, 0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86,
            0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, 0x06, 0x08, 0x2a,
            0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x47, 0x30, 0x45, 0x02,
            0x20, 0x53, 0x25, 0x03, 0x2c, 0x96, 0x50, 0xb6, 0x64, 0xf4, 0x18, 0xbf,
            0x99, 0x47, 0xf8, 0x9d, 0xe6, 0xeb, 0x43, 0x94, 0xf1, 0xce, 0xb2, 0x61,
            0x00, 0xe0, 0xf9, 0x89, 0xa8, 0x71, 0x82, 0x02, 0x0a, 0x02, 0x21, 0x00,
            0xea, 0x0a, 0x40, 0xab, 0x87, 0xad, 0x7e, 0x25, 0xe1, 0xa1, 0x6c, 0xb1,
            0x12, 0xfa, 0x86, 0xfe, 0xea, 0x8a, 0xaf, 0x4b, 0xc1, 0xf3, 0x6f, 0x09,
            0x85, 0x46, 0x50, 0xb6, 0xd0, 0x55, 0x40, 0xe2
        };

هدف را بسازید

هدف خود را با استفاده از اعتبارنامه‌های تازه استخراج شده خود بسازید و فلش کنید. این بخش به پلتفرم وابسته است. برای اطلاعات بیشتر به اسناد SoC یا دستگاه های پشتیبانی شده خود مراجعه کنید.

دستگاه را راه اندازی کنید

اکنون می‌توانید مراحلی را که قبلاً در Pair a Matter توضیح داده شده است، دنبال کنید تا دستگاه Matter خود را در Google Home platform راه اندازی کنید.

اشکال زدایی با استفاده از chip-tool

chip-tool می تواند ابزار ارزشمندی برای بررسی اینکه آیا دستگاه شما گواهینامه های صحیح را ارسال می کند یا خیر. برای ساختن آن:

$ cd examples/chip-tool
$ gn gen out/debug
Done. Made 114 targets from 112 files in 157ms
$ ninja -C out/debug
ninja: Entering directory `out/debug'
$ cd ../..

برای فعال کردن گزارش‌های اضافی، هر زمان که chip-tool را اجرا می‌کنید، حتماً پرچم --trace_decode 1 را ارسال کنید. علاوه بر این، این یک تمرین خوب است که مسیر فایل PAA خود را با پرچم --paa-trust-store-path عبور دهید.

بنابراین برای راه اندازی یک دستگاه Thread با استفاده از BLE، می توانید اجرا کنید:

```
$ examples/chip-tool/out/debug/chip-tool pairing ble-thread 1 \
  hex:Thread_credentials \
  pairing_code \
  discriminator \
  --paa-trust-store-path <path to PAA folder> \
  --trace_decode 1
```

در مورد دستگاه های آزمایشی، <PAIRING CODE> 20202021 و <DISCRIMINATOR> 3840 است.

برای دریافت اعتبار Thread از Google Nest Hub (2nd gen) ، می‌توانید این موارد را اجرا کنید:

$ adb connect border_router_ip_address
$ adb -e shell ot-ctl dataset active -x
$ adb disconnect

و برای راه اندازی دستگاه Wi-Fi، می توانید از گزینه ble-wifi استفاده کنید:

$ examples/chip-tool/out/debug/chip-tool pairing ble-wifi 1 "SSID" SSID_password pairing_code discriminator
،

سناریوهای توسعه خاصی مانند تست OTA نیاز به ایجاد گواهینامه های غیر تولیدی دارند.

برخی از ویژگی‌های اکوسیستم Google، از جمله به‌روزرسانی‌های نرم‌افزار OTA دستگاه را نمی‌توان با استفاده از تست VID/PID انجام داد .

این راهنما نحوه ایجاد و تأیید Matter غیر تولیدی را برای استفاده در آزمایش توضیح می‌دهد. انواع گواهینامه ها عبارتند از:

  1. بیانیه گواهینامه ( CD )
  2. گواهینامه گواهی محصول میانی ( PAI )
  3. گواهی تأیید دستگاه ( DAC )

در طول فرآیند راه اندازی، یک دستگاه دارای گواهینامه Matter باید خود را تأیید کند ، یعنی ثابت کند که یک محصول واقعی دارای گواهی Matter است. مدارک مورد استفاده توسط دستگاه های Matter برای تأیید عبارتند از:

  1. یک جفت کلید تصدیق
  2. یک زنجیره گواهی

گواهی تأیید دستگاه (DAC) اولین پیوند زنجیره گواهی است و توسط گواهی میانی گواهی محصول (PAI) تأیید می شود که به نوبه خود توسط مرجع تأیید محصول (PAA) تأیید می شود.

گواهینامه ها همزمان با ایجاد جفت کلید گواهی امضا می شوند و با استفاده از کلید خصوصی مرجع صدور گواهی یک سطح بالاتر امضا می شوند و زنجیره ای از اعتماد را تشکیل می دهند. بنابراین، یک گواهی DAC توسط یک کلید PAI و یک گواهی PAI توسط یک کلید PAA امضا می شود. گواهینامه های PAA به عنوان بالای زنجیره، خود امضا هستند. این زنجیره اعتماد یک ساختار PAA فدرال را تشکیل می دهد که توسط دفتر کل انطباق توزیع شده (DCL) همگام سازی می شود.

اطلاعات بیشتر در مورد فرآیند تأیید و اظهارنامه های گواهی (CD) را می توان در اسناد و پیام های تأییدیه اضافی و در مشخصات موضوع یافت.

Matter SDK را نصب کنید

این دستورالعمل‌ها فرض می‌کنند که Matter SDK را نصب کرده‌اید. لطفاً به مستندات آن در Github مراجعه کنید یا برای اطلاعات بیشتر به شروع با Matter مراجعه کنید.

اگر برنامه hexdump xxd را ندارید آن را نصب کنید. این ابزار برای چاپ اعتبارنامه ها در قالب C-style مفید است:

sudo apt-get install xxd

ساخت chip-cert

  1. مطمئن شوید که روی نسخه اخیر SDK کار می کنید. این رویه‌ها در Github SHA 0b17bce8 ، در v1.0-branch آزمایش شدند:

    $ cd connectedhomeip
    $ git checkout v1.0-branch
    $ git pull
    
  2. Build chip-cert ، که ابزاری است که برای چندین عملیات روی اعتبارنامه‌های دستگاه‌های Matter استفاده می‌شود:

    1. پیکربندی ساخت:

      $ cd src/credentials
      $ source ../../scripts/activate.sh
      $ gn gen out
      

      نمونه خروجی gn :

      Done. Made 5774 targets from 289 files in 658ms
      
    2. ساخت را اجرا کنید:

      $ ninja -C out
      

      نمونه خروجی ninja :

      ninja: Entering directory `out'
      [2000/2000] stamp obj/default.stamp
      

گواهی های خود را ضرب کنید

VID/PID سفارشی خود را به عنوان متغیرهای محیطی صادر کنید تا احتمال خطای اداری هنگام ویرایش آرگومان های فرمان کاهش یابد:

$ cd ../..
$ export VID=hexVendorId
$ export PID=hexProductId

یک سی دی تولید کنید

  1. سی دی را با استفاده از chip-cert تولید کنید. در حال حاضر کمیسیونر فقط تأیید می‌کند که VID و PID با داده‌هایی که در مکان‌های دیگر توسط دستگاه در معرض دید قرار می‌گیرند مطابقت دارند: خوشه اطلاعات پایه، مبدا DAC و DAC (در صورت داشتن آن). می توانید سایر قسمت ها را بدون تغییر رها کنید:

    $ src/credentials/out/chip-cert gen-cd \
      --key credentials/test/certification-declaration/Chip-Test-CD-Signing-Key.pem \
      --cert credentials/test/certification-declaration/Chip-Test-CD-Signing-Cert.pem \
      --out credentials/test/certification-declaration/Chip-Test-CD-${VID}-${PID}.der \
      --format-version "1" \
      --vendor-id "${VID}" \
      --product-id "${PID}" \
      --device-type-id "0x1234" \
      --certificate-id "ZIG20141ZB330001-24" \
      --security-level "0" \
      --security-info "0" \
      --version-number "9876" \
      --certification-type "0"
    
  2. سی دی را تایید کنید. مطمئن شوید که حاوی VID/PID شما (در قالب اعشار) است:

    $ src/credentials/out/chip-cert print-cd credentials/test/certification-declaration/Chip-Test-CD-${VID}-${PID}.der
    

    خروجی نمونه:

    SignerKeyId value: hex:62FA823359ACFAA9963E1CFA140ADDF504F37160
    0x01, tag[Anonymous]: 0xffffffff, type: Structure (0x15), container:
    0x04,     tag[Context Specific]: 0x0, type: Unsigned Fixed Point (0x04), value: 1
    0x08,     tag[Context Specific]: 0x1, type: Unsigned Fixed Point (0x04), value: XXXXX // <- VID
    0x0A,     tag[Context Specific]: 0x2, type: Array (0x16), container:
    0x0D,         tag[Anonymous]: 0xffffffff, type: Unsigned Fixed Point (0x04), value: XXXXX // <- PID
    0x12,     tag[Context Specific]: 0x3, type: Unsigned Fixed Point (0x04), value: 4660
    0x15,     tag[Context Specific]: 0x4, type: UTF-8 String (0x0c), length: 19, value: "ZIG20141ZB330001-24"
    0x2B,     tag[Context Specific]: 0x5, type: Unsigned Fixed Point (0x04), value: 0
    0x2E,     tag[Context Specific]: 0x6,type: Unsigned Fixed Point (0x04), value: 0
    0x32,     tag[Context Specific]: 0x7, type: Unsigned Fixed Point (0x04), value: 39030
    0x35,     tag[Context Specific]: 0x8, type: Unsigned Fixed Point (0x04), value: 0
    

یک PAI و DAC ایجاد کنید

در این مثال، از گواهینامه مرجع تأیید محصول آزمایشی خود Matter (PAA) و امضای کلید Chip-Test-PAA-NoVID به عنوان گواهی ریشه استفاده می کنیم. ما از آن به عنوان CA ریشه برای تولید PAI و DAC خود استفاده خواهیم کرد.

  1. PAI را با استفاده از PAA ایجاد کنید. شما ممکن است به صورت اختیاری اطلاعات PID را در PAI قرار دهید، اما حذف آن به شما انعطاف بیشتری برای آزمایش می دهد. اگر برای PID های اضافی به DAC نیاز دارید، می توانید فقط مرحله تولید DAC را اجرا کنید:

    $ src/credentials/out/chip-cert gen-att-cert --type i \
      --subject-cn "Matter Test PAI" \
      --subject-vid "${VID}" \
      --valid-from "2021-06-28 14:23:43" \
      --lifetime "4294967295" \
      --ca-key credentials/test/attestation/Chip-Test-PAA-NoVID-Key.pem \
      --ca-cert credentials/test/attestation/Chip-Test-PAA-NoVID-Cert.pem \
      --out-key credentials/test/attestation/"test-PAI-${VID}-key".pem \
      --out credentials/test/attestation/"test-PAI-${VID}-cert".pem
    
  2. DAC را با استفاده از PAI تولید کنید:

    $ src/credentials/out/chip-cert gen-att-cert --type d \
      --subject-cn "Matter Test DAC 0" \
      --subject-vid "${VID}" \
      --subject-pid "${PID}" \
      --valid-from "2021-06-28 14:23:43" \
      --lifetime "4294967295" \
      --ca-key credentials/test/attestation/"test-PAI-${VID}-key".pem \
      --ca-cert credentials/test/attestation/"test-PAI-${VID}-cert".pem \
      --out-key credentials/test/attestation/"test-DAC-${VID}-${PID}-key".pem \
      --out credentials/test/attestation/"test-DAC-${VID}-${PID}-cert".pem
    
  3. زنجیره DAC، PAI و PAA را تأیید کنید. اگر هیچ خطایی در خروجی ظاهر نشود، به این معنی است که زنجیره گواهی گواهی با موفقیت تأیید شده است:

    $ src/credentials/out/chip-cert validate-att-cert \
    --dac credentials/test/attestation/"test-DAC-${VID}-${PID}-cert".pem \
    --pai credentials/test/attestation/"test-PAI-${VID}-cert".pem \
    --paa credentials/test/attestation/Chip-Test-PAA-NoVID-Cert.pem
    
  4. می توانید کلیدهای خود را با استفاده از openssl بررسی کنید:

    $ openssl ec -noout -text -in \
      credentials/test/attestation/test-DAC-${VID}-${PID}-key.pem
    

    خروجی نمونه:

    read EC key
    Private-Key: (256 bit)
    priv:
        c9:f2:b3:04:b2:db:0d:6f:cd:c6:be:f3:7b:76:8d:
        8c:01:4e:0b:9e:ce:3e:72:49:3c:0e:35:63:7c:6c:
        6c:d6
    pub:
        04:4f:93:ba:3b:bf:63:90:73:98:76:1e:af:87:79:
        11:e6:77:e8:e2:df:a7:49:f1:7c:ac:a8:a6:91:76:
        08:5b:39:ce:6c:72:db:6d:9a:92:b3:ba:05:b0:e8:
        31:a0:bf:36:50:2b:5c:72:55:7f:11:c8:01:ff:3a:
        46:b9:19:60:28
    ASN1 OID: prime256v1
    NIST CURVE: P-256
    
  5. همچنین می توانید openssl برای بازرسی گواهی های تولید شده خود استفاده کنید:

    $ openssl x509 -noout -text -in \
      credentials/test/attestation/test-DAC-${VID}-${PID}-cert.pem
    

    خروجی نمونه:

    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number: 2875998130766646679 (0x27e9990fef088d97)
            Signature Algorithm: ecdsa-with-SHA256
            Issuer: CN = Matter Test PAI, 1.3.6.1.4.1.37244.2.1 = hexVendorId
            Validity
                Not Before: Jun 28 14:23:43 2021 GMT
                Not After : Dec 31 23:59:59 9999 GMT
            Subject: CN = Matter Test DAC 0, 1.3.6.1.4.1.37244.2.1 = hexVendorId, 1.3.6.1.4.1.37244.2.2 = hexProductId
            Subject Public Key Info:
                Public Key Algorithm: id-ecPublicKey
                    Public-Key: (256 bit)
                    pub:
                        04:4f:93:ba:3b:bf:63:90:73:98:76:1e:af:87:79:
                        11:e6:77:e8:e2:df:a7:49:f1:7c:ac:a8:a6:91:76:
                        08:5b:39:ce:6c:72:db:6d:9a:92:b3:ba:05:b0:e8:
                        31:a0:bf:36:50:2b:5c:72:55:7f:11:c8:01:ff:3a:
                        46:b9:19:60:28
                    ASN1 OID: prime256v1
                    NIST CURVE: P-256
            X509v3 extensions:
                X509v3 Basic Constraints: critical
                    CA:FALSE
                X509v3 Key Usage: critical
                    Digital Signature
                X509v3 Subject Key Identifier:
                    21:0A:CA:B1:B6:5F:17:65:D8:61:19:73:84:1A:9D:52:81:19:C5:39
                X509v3 Authority Key Identifier:
                    37:7F:24:9A:73:41:4B:16:6E:6A:42:6E:F5:E8:89:FB:75:F8:77:BB
        Signature Algorithm: ecdsa-with-SHA256
        Signature Value:
            30:45:02:20:38:8f:c5:0d:3e:90:95:dd:7d:7c:e9:5a:05:19:
            1f:2d:14:08:a3:d7:0e:b5:15:6d:d3:b0:0b:f7:b8:28:4d:bf:
            02:21:00:d4:05:30:43:a6:05:00:0e:b9:99:0d:34:3d:75:fe:
            d3:c1:4e:73:ff:e7:05:64:7a:62:8d:2d:38:8f:fd:4d:ad
    

PAA

یک فرآیند مشابه می تواند برای تولید یک PAA با امضای خود استفاده شود، اما انجام این کار ضروری نیست.

در عوض، کاری که ما در اینجا انجام داده‌ایم استفاده از PAA توسعه‌ای با امضای خود است که شامل اطلاعات VID نمی‌شود.

برای مثال‌های بیشتر از تولید CD، به credentials/test/gen-test-cds.sh و برای مثال‌های بیشتر از تولید PAA، PAI، و DAC، به credentials/test/gen-test-attestation-certs.sh مراجعه کنید.

گواهی ها را جایگزین کنید

PAA و PAI را جایگزین کنید

  1. اسکریپت کمکی زیر را اجرا کنید که از ابزار CHIP Certificate Tool ( chip-cert ) برای تولید آرایه های به سبک C از گواهی های شما استفاده می کند.

اسکریپت Embeddable Certificates Helper را دانلود کنید

#!/bin/bash

#
# generate-embeddable-certs.sh script
# —----------------------------------
#
# This script generates self-minted DAC and PAI.
# The output may easily be included in your C++ source code.
#

# Edit this information with your paths and certificates
folder="credentials/test/attestation"
chip_cert_tool="src/credentials/out/chip-cert"
cert_file_der="${folder}/test-PAI-${VID}-cert.der"
cert_file_pem="${folder}/test-PAI-${VID}-cert.pem"
key_file_pem="${folder}/test-PAI-${VID}-key.pem"

type="Pai"

printf "namespace chip {\n"
printf "namespace DevelopmentCerts {\n\n"
printf "#if CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID == ${PID}\n\n"

printcert() {
  # convert cert to DER
  if [ -f "${cert_file_der}" ]; then
      rm "${cert_file_der}"
  fi
  "${chip_cert_tool}" convert-cert "${cert_file_pem}" "${cert_file_der}" --x509-der

  printf "// ------------------------------------------------------------ \n"
  printf "// ${type} CERTIFICATE ${cert_file_der} \n\n"

  printf "constexpr uint8_t ${type}_Cert_Array[] = {\n"
  less -f "${cert_file_der}" | od -t x1 -An | sed 's/\/,/g' | sed 's/^/   /g'
  printf "};\n\n"
  printf "ByteSpan k${type}Cert = ByteSpan(${type}_Cert_Array);\n\n"

  printf "// ${type} PUBLIC KEY FROM ${key_file_pem} \n\n"

  printf "constexpr uint8_t ${type}_PublicKey_Array[] = {\n"
  openssl ec -text -noout -in "${key_file_pem}" 2>/dev/null | sed '/ASN1 OID/d' | sed '/NIST CURVE/d' | sed -n '/pub:/,$p' | sed '/pub:/d' | sed 's/\([0-9a-fA-F][0-9a-fA-F]\)/0x\1/g' | sed 's/:/, /g'
  printf "};\n\n"
  printf "ByteSpan k${type}PublicKey = ByteSpan(${type}_PublicKey_Array);\n\n"

  printf "// ${type} PRIVATE KEY FROM ${key_file_pem} \n\n"

  printf "constexpr uint8_t ${type}_PrivateKey_Array[] = {\n"
  openssl ec -text -noout -in "${key_file_pem}" 2>/dev/null | sed '/read EC key/d' | sed '/Private-Key/d' | sed '/priv:/d' | sed '/pub:/,$d' | sed 's/\([0-9a-fA-F][0-9a-fA-F]\)/0x\1/g' | sed 's/:/, /g'
  printf "};\n\n"
  printf "ByteSpan k${type}PrivateKey = ByteSpan(${type}_PrivateKey_Array);\n\n"
}

# generates PAI
printcert

type="Dac"
cert_file_der="${folder}/test-DAC-${VID}-${PID}-cert.der"
cert_file_pem="${folder}/test-DAC-${VID}-${PID}-cert.pem"
key_file_pem="${folder}/test-DAC-${VID}-${PID}-key.pem"

# generates DAC
printcert

printf "#endif // CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID\n"
printf "} // namespace DevelopmentCerts\n"
printf "} // namespace chip\n"


  1. محتویات خروجی PAI و DAC را در پیاده سازی DeviceAttestationCredentialsProvider::GetProductAttestationIntermediateCert کپی کنید.

    در دستگاه های تولیدی، PAI و DAC در Factory Data هستند، در حالی که CD در خود سیستم عامل تعبیه شده است.

    1. اگر هنوز از داده‌های کارخانه استفاده نمی‌کنید، ممکن است بخواهید PAI خود را در src/credentials/examples/ExampleDACs.cpp قرار دهید. در این مورد، کد تولید شده را به فایل ExampleDACs.cpp خود اضافه کنید:

      ByteSpan kDacCert       = ByteSpan(kDevelopmentDAC_Cert_FFF1_801F);
      ByteSpan kDacPrivateKey = ByteSpan(kDevelopmentDAC_PrivateKey_FFF1_801F);
      ByteSpan kDacPublicKey  = ByteSpan(kDevelopmentDAC_PublicKey_FFF1_801F);
      #endif
      } // namespace DevelopmentCerts
      } // namespace chip
      
      /* ------------------------------------------ */
      /* current end-of-file                        */
      /* ------------------------------------------ */
      
      /* ------------------------------------------ */
      /* output of creds-codelab.sh script          */
      /* ------------------------------------------ */
      
      namespace chip {
      namespace DevelopmentCerts {
      
      #if CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID == hexProductId
      
      ...
      
      ByteSpan kDacPrivateKey = ByteSpan(Dac_PrivateKey_Array);
      
      #endif // CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID
      } // namespace DevelopmentCerts
      } // namespace chip
      
    2. اگر از Factory Data یا یک ارائه‌دهنده اعتبار سفارشی استفاده می‌کنید، مطمئن شوید که اعتبارنامه‌ها را در مکان‌های مناسب وارد کرده‌اید. ممکن است بخواهید با ارائه دهنده SoC خود در مورد مشخصات پلت فرم خود بررسی کنید.

سی دی را تعویض کنید

  1. یک نمایش متنی از محتوای فایل سی دی خود را با استفاده از xxd استخراج کنید:

      $ xxd -i credentials/test/certification-declaration/Chip-Test-CD-${VID}-${PID}.der
    

    خروجی نمونه:

      unsigned char credentials_test_certification_declaration_Chip_Test_CD_hexVendorId_hexProductId_der[] = {
        0x30, 0x81, 0xe9, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
        0x07, 0x02, 0xa0, 0x81, 0xdb, 0x30, 0x81, 0xd8, 0x02, 0x01, 0x03, 0x31,
        0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04,
        0x02, 0x01, 0x30, 0x45, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
        0x01, 0x07, 0x01, 0xa0, 0x38, 0x04, 0x36, 0x15, 0x24, 0x00, 0x01, 0x25,
        0x01, 0xfe, 0xca, 0x36, 0x02, 0x05, 0xce, 0xfa, 0x18, 0x25, 0x03, 0x34,
        0x12, 0x2c, 0x04, 0x13, 0x5a, 0x49, 0x47, 0x32, 0x30, 0x31, 0x34, 0x31,
        0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x31, 0x2d, 0x32, 0x34, 0x24,
        0x05, 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x76, 0x98, 0x24, 0x08, 0x00,
        0x18, 0x31, 0x7d, 0x30, 0x7b, 0x02, 0x01, 0x03, 0x80, 0x14, 0x62, 0xfa,
        0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a,
        0xdd, 0xf5, 0x04, 0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86,
        0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, 0x06, 0x08, 0x2a,
        0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x47, 0x30, 0x45, 0x02,
        0x20, 0x53, 0x25, 0x03, 0x2c, 0x96, 0x50, 0xb6, 0x64, 0xf4, 0x18, 0xbf,
        0x99, 0x47, 0xf8, 0x9d, 0xe6, 0xeb, 0x43, 0x94, 0xf1, 0xce, 0xb2, 0x61,
        0x00, 0xe0, 0xf9, 0x89, 0xa8, 0x71, 0x82, 0x02, 0x0a, 0x02, 0x21, 0x00,
        0xea, 0x0a, 0x40, 0xab, 0x87, 0xad, 0x7e, 0x25, 0xe1, 0xa1, 0x6c, 0xb1,
        0x12, 0xfa, 0x86, 0xfe, 0xea, 0x8a, 0xaf, 0x4b, 0xc1, 0xf3, 0x6f, 0x09,
        0x85, 0x46, 0x50, 0xb6, 0xd0, 0x55, 0x40, 0xe2
      };
      unsigned int credentials_test_certification_declaration_Chip_Test_CD_hexVendorId_hexProductId_der_len = 236;
      ```
    
  2. متنی را که در مرحله قبل استخراج کردید در فایلی که برای تعریف سی دی استفاده شده است در بیلد خود کپی کنید. همانطور که در مورد PAI و DAC، نحوه انجام این کار بستگی به پلتفرمی دارد که در حال توسعه هستید.

اگر از نمونه های اعتبار استفاده می کنید، احتمالاً می خواهید محتوای kCdForAllExamples را در ExampleDACProvider::GetCertificationDeclaration در src/credentials/examples/DeviceAttestationCredsExample.cpp جایگزین کنید:

    const uint8_t kCdForAllExamples[] = {
            0x30, 0x81, 0xe9, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
            0x07, 0x02, 0xa0, 0x81, 0xdb, 0x30, 0x81, 0xd8, 0x02, 0x01, 0x03, 0x31,
            0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04,
            0x02, 0x01, 0x30, 0x45, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
            0x01, 0x07, 0x01, 0xa0, 0x38, 0x04, 0x36, 0x15, 0x24, 0x00, 0x01, 0x25,
            0x01, 0xfe, 0xca, 0x36, 0x02, 0x05, 0xce, 0xfa, 0x18, 0x25, 0x03, 0x34,
            0x12, 0x2c, 0x04, 0x13, 0x5a, 0x49, 0x47, 0x32, 0x30, 0x31, 0x34, 0x31,
            0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x31, 0x2d, 0x32, 0x34, 0x24,
            0x05, 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x76, 0x98, 0x24, 0x08, 0x00,
            0x18, 0x31, 0x7d, 0x30, 0x7b, 0x02, 0x01, 0x03, 0x80, 0x14, 0x62, 0xfa,
            0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a,
            0xdd, 0xf5, 0x04, 0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86,
            0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, 0x06, 0x08, 0x2a,
            0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x47, 0x30, 0x45, 0x02,
            0x20, 0x53, 0x25, 0x03, 0x2c, 0x96, 0x50, 0xb6, 0x64, 0xf4, 0x18, 0xbf,
            0x99, 0x47, 0xf8, 0x9d, 0xe6, 0xeb, 0x43, 0x94, 0xf1, 0xce, 0xb2, 0x61,
            0x00, 0xe0, 0xf9, 0x89, 0xa8, 0x71, 0x82, 0x02, 0x0a, 0x02, 0x21, 0x00,
            0xea, 0x0a, 0x40, 0xab, 0x87, 0xad, 0x7e, 0x25, 0xe1, 0xa1, 0x6c, 0xb1,
            0x12, 0xfa, 0x86, 0xfe, 0xea, 0x8a, 0xaf, 0x4b, 0xc1, 0xf3, 0x6f, 0x09,
            0x85, 0x46, 0x50, 0xb6, 0xd0, 0x55, 0x40, 0xe2
        };

هدف را بسازید

هدف خود را با استفاده از اعتبارنامه‌های تازه استخراج شده خود بسازید و فلش کنید. این بخش به پلتفرم وابسته است. برای اطلاعات بیشتر به اسناد SoC یا دستگاه های پشتیبانی شده خود مراجعه کنید.

دستگاه را راه اندازی کنید

اکنون می‌توانید مراحلی را که قبلاً در Pair a Matter توضیح داده شده است، دنبال کنید تا دستگاه Matter خود را در Google Home platform راه اندازی کنید.

اشکال زدایی با استفاده از chip-tool

chip-tool می تواند ابزار ارزشمندی برای بررسی اینکه آیا دستگاه شما گواهینامه های صحیح را ارسال می کند یا خیر. برای ساختن آن:

$ cd examples/chip-tool
$ gn gen out/debug
Done. Made 114 targets from 112 files in 157ms
$ ninja -C out/debug
ninja: Entering directory `out/debug'
$ cd ../..

برای فعال کردن گزارش‌های اضافی، هر زمان که chip-tool را اجرا می‌کنید، حتماً پرچم --trace_decode 1 را ارسال کنید. علاوه بر این، این یک تمرین خوب است که مسیر فایل PAA خود را با پرچم --paa-trust-store-path عبور دهید.

بنابراین برای راه اندازی یک دستگاه Thread با استفاده از BLE، می توانید اجرا کنید:

```
$ examples/chip-tool/out/debug/chip-tool pairing ble-thread 1 \
  hex:Thread_credentials \
  pairing_code \
  discriminator \
  --paa-trust-store-path <path to PAA folder> \
  --trace_decode 1
```

در مورد دستگاه های آزمایشی، <PAIRING CODE> 20202021 و <DISCRIMINATOR> 3840 است.

برای دریافت اعتبار Thread از Google Nest Hub (2nd gen) ، می‌توانید این موارد را اجرا کنید:

$ adb connect border_router_ip_address
$ adb -e shell ot-ctl dataset active -x
$ adb disconnect

و برای راه اندازی دستگاه Wi-Fi، می توانید از گزینه ble-wifi استفاده کنید:

$ examples/chip-tool/out/debug/chip-tool pairing ble-wifi 1 "SSID" SSID_password pairing_code discriminator
،

سناریوهای توسعه خاصی مانند تست OTA نیاز به ایجاد گواهینامه های غیر تولیدی دارند.

برخی از ویژگی‌های اکوسیستم Google، از جمله به‌روزرسانی‌های نرم‌افزار OTA دستگاه را نمی‌توان با استفاده از تست VID/PID انجام داد .

این راهنما نحوه ایجاد و تأیید Matter غیر تولیدی را برای استفاده در آزمایش توضیح می‌دهد. انواع گواهینامه ها عبارتند از:

  1. بیانیه گواهینامه ( CD )
  2. گواهینامه گواهی محصول میانی ( PAI )
  3. گواهی تأیید دستگاه ( DAC )

در طول فرآیند راه اندازی، یک دستگاه دارای گواهینامه Matter باید خود را تأیید کند ، یعنی ثابت کند که یک محصول واقعی دارای گواهی Matter است. مدارک مورد استفاده توسط دستگاه های Matter برای تأیید عبارتند از:

  1. یک جفت کلید تصدیق
  2. یک زنجیره گواهی

گواهی تأیید دستگاه (DAC) اولین پیوند زنجیره گواهی است و توسط گواهی میانی گواهی محصول (PAI) تأیید می شود که به نوبه خود توسط مرجع تأیید محصول (PAA) تأیید می شود.

گواهینامه ها همزمان با ایجاد جفت کلید گواهی امضا می شوند و با استفاده از کلید خصوصی مرجع صدور گواهی یک سطح بالاتر امضا می شوند و زنجیره ای از اعتماد را تشکیل می دهند. بنابراین، یک گواهی DAC توسط یک کلید PAI و یک گواهی PAI توسط یک کلید PAA امضا می شود. گواهینامه های PAA به عنوان بالای زنجیره، خود امضا هستند. این زنجیره اعتماد یک ساختار PAA فدرال را تشکیل می دهد که توسط دفتر کل انطباق توزیع شده (DCL) همگام سازی می شود.

اطلاعات بیشتر در مورد فرآیند تأیید و اظهارنامه های گواهی (CD) را می توان در اسناد و پیام های تأییدیه اضافی و در مشخصات موضوع یافت.

Matter SDK را نصب کنید

این دستورالعمل‌ها فرض می‌کنند که Matter SDK را نصب کرده‌اید. لطفاً به مستندات آن در Github مراجعه کنید یا برای اطلاعات بیشتر به شروع با Matter مراجعه کنید.

اگر برنامه hexdump xxd را ندارید آن را نصب کنید. این ابزار برای چاپ اعتبارنامه ها در قالب C-style مفید است:

sudo apt-get install xxd

ساخت chip-cert

  1. مطمئن شوید که روی نسخه اخیر SDK کار می کنید. این رویه‌ها در Github SHA 0b17bce8 ، در v1.0-branch آزمایش شدند:

    $ cd connectedhomeip
    $ git checkout v1.0-branch
    $ git pull
    
  2. Build chip-cert ، که ابزاری است که برای چندین عملیات روی اعتبارنامه‌های دستگاه‌های Matter استفاده می‌شود:

    1. پیکربندی ساخت:

      $ cd src/credentials
      $ source ../../scripts/activate.sh
      $ gn gen out
      

      نمونه خروجی gn :

      Done. Made 5774 targets from 289 files in 658ms
      
    2. ساخت را اجرا کنید:

      $ ninja -C out
      

      نمونه خروجی ninja :

      ninja: Entering directory `out'
      [2000/2000] stamp obj/default.stamp
      

گواهی های خود را ضرب کنید

VID/PID سفارشی خود را به عنوان متغیرهای محیطی صادر کنید تا احتمال خطای اداری هنگام ویرایش آرگومان های فرمان کاهش یابد:

$ cd ../..
$ export VID=hexVendorId
$ export PID=hexProductId

یک سی دی تولید کنید

  1. سی دی را با استفاده از chip-cert تولید کنید. در حال حاضر کمیسیونر فقط تأیید می‌کند که VID و PID با داده‌هایی که در مکان‌های دیگر توسط دستگاه در معرض دید قرار می‌گیرند مطابقت دارند: خوشه اطلاعات پایه، مبدا DAC و DAC (در صورت داشتن آن). می توانید سایر قسمت ها را بدون تغییر رها کنید:

    $ src/credentials/out/chip-cert gen-cd \
      --key credentials/test/certification-declaration/Chip-Test-CD-Signing-Key.pem \
      --cert credentials/test/certification-declaration/Chip-Test-CD-Signing-Cert.pem \
      --out credentials/test/certification-declaration/Chip-Test-CD-${VID}-${PID}.der \
      --format-version "1" \
      --vendor-id "${VID}" \
      --product-id "${PID}" \
      --device-type-id "0x1234" \
      --certificate-id "ZIG20141ZB330001-24" \
      --security-level "0" \
      --security-info "0" \
      --version-number "9876" \
      --certification-type "0"
    
  2. سی دی را تایید کنید. مطمئن شوید که حاوی VID/PID شما (در قالب اعشار) است:

    $ src/credentials/out/chip-cert print-cd credentials/test/certification-declaration/Chip-Test-CD-${VID}-${PID}.der
    

    خروجی نمونه:

    SignerKeyId value: hex:62FA823359ACFAA9963E1CFA140ADDF504F37160
    0x01, tag[Anonymous]: 0xffffffff, type: Structure (0x15), container:
    0x04,     tag[Context Specific]: 0x0, type: Unsigned Fixed Point (0x04), value: 1
    0x08,     tag[Context Specific]: 0x1, type: Unsigned Fixed Point (0x04), value: XXXXX // <- VID
    0x0A,     tag[Context Specific]: 0x2, type: Array (0x16), container:
    0x0D,         tag[Anonymous]: 0xffffffff, type: Unsigned Fixed Point (0x04), value: XXXXX // <- PID
    0x12,     tag[Context Specific]: 0x3, type: Unsigned Fixed Point (0x04), value: 4660
    0x15,     tag[Context Specific]: 0x4, type: UTF-8 String (0x0c), length: 19, value: "ZIG20141ZB330001-24"
    0x2B,     tag[Context Specific]: 0x5, type: Unsigned Fixed Point (0x04), value: 0
    0x2E,     tag[Context Specific]: 0x6,type: Unsigned Fixed Point (0x04), value: 0
    0x32,     tag[Context Specific]: 0x7, type: Unsigned Fixed Point (0x04), value: 39030
    0x35,     tag[Context Specific]: 0x8, type: Unsigned Fixed Point (0x04), value: 0
    

یک PAI و DAC ایجاد کنید

در این مثال، از گواهینامه مرجع تأیید محصول آزمایشی خود Matter (PAA) و امضای کلید Chip-Test-PAA-NoVID به عنوان گواهی ریشه استفاده می کنیم. ما از آن به عنوان CA ریشه برای تولید PAI و DAC خود استفاده خواهیم کرد.

  1. PAI را با استفاده از PAA ایجاد کنید. شما ممکن است به صورت اختیاری اطلاعات PID را در PAI قرار دهید، اما حذف آن به شما انعطاف بیشتری برای آزمایش می دهد. اگر برای PID های اضافی به DAC نیاز دارید، می توانید فقط مرحله تولید DAC را اجرا کنید:

    $ src/credentials/out/chip-cert gen-att-cert --type i \
      --subject-cn "Matter Test PAI" \
      --subject-vid "${VID}" \
      --valid-from "2021-06-28 14:23:43" \
      --lifetime "4294967295" \
      --ca-key credentials/test/attestation/Chip-Test-PAA-NoVID-Key.pem \
      --ca-cert credentials/test/attestation/Chip-Test-PAA-NoVID-Cert.pem \
      --out-key credentials/test/attestation/"test-PAI-${VID}-key".pem \
      --out credentials/test/attestation/"test-PAI-${VID}-cert".pem
    
  2. DAC را با استفاده از PAI تولید کنید:

    $ src/credentials/out/chip-cert gen-att-cert --type d \
      --subject-cn "Matter Test DAC 0" \
      --subject-vid "${VID}" \
      --subject-pid "${PID}" \
      --valid-from "2021-06-28 14:23:43" \
      --lifetime "4294967295" \
      --ca-key credentials/test/attestation/"test-PAI-${VID}-key".pem \
      --ca-cert credentials/test/attestation/"test-PAI-${VID}-cert".pem \
      --out-key credentials/test/attestation/"test-DAC-${VID}-${PID}-key".pem \
      --out credentials/test/attestation/"test-DAC-${VID}-${PID}-cert".pem
    
  3. زنجیره DAC، PAI و PAA را تأیید کنید. اگر هیچ خطایی در خروجی ظاهر نشود، به این معنی است که زنجیره گواهی گواهی با موفقیت تأیید شده است:

    $ src/credentials/out/chip-cert validate-att-cert \
    --dac credentials/test/attestation/"test-DAC-${VID}-${PID}-cert".pem \
    --pai credentials/test/attestation/"test-PAI-${VID}-cert".pem \
    --paa credentials/test/attestation/Chip-Test-PAA-NoVID-Cert.pem
    
  4. می توانید کلیدهای خود را با استفاده از openssl بررسی کنید:

    $ openssl ec -noout -text -in \
      credentials/test/attestation/test-DAC-${VID}-${PID}-key.pem
    

    خروجی نمونه:

    read EC key
    Private-Key: (256 bit)
    priv:
        c9:f2:b3:04:b2:db:0d:6f:cd:c6:be:f3:7b:76:8d:
        8c:01:4e:0b:9e:ce:3e:72:49:3c:0e:35:63:7c:6c:
        6c:d6
    pub:
        04:4f:93:ba:3b:bf:63:90:73:98:76:1e:af:87:79:
        11:e6:77:e8:e2:df:a7:49:f1:7c:ac:a8:a6:91:76:
        08:5b:39:ce:6c:72:db:6d:9a:92:b3:ba:05:b0:e8:
        31:a0:bf:36:50:2b:5c:72:55:7f:11:c8:01:ff:3a:
        46:b9:19:60:28
    ASN1 OID: prime256v1
    NIST CURVE: P-256
    
  5. همچنین می توانید openssl برای بازرسی گواهی های تولید شده خود استفاده کنید:

    $ openssl x509 -noout -text -in \
      credentials/test/attestation/test-DAC-${VID}-${PID}-cert.pem
    

    خروجی نمونه:

    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number: 2875998130766646679 (0x27e9990fef088d97)
            Signature Algorithm: ecdsa-with-SHA256
            Issuer: CN = Matter Test PAI, 1.3.6.1.4.1.37244.2.1 = hexVendorId
            Validity
                Not Before: Jun 28 14:23:43 2021 GMT
                Not After : Dec 31 23:59:59 9999 GMT
            Subject: CN = Matter Test DAC 0, 1.3.6.1.4.1.37244.2.1 = hexVendorId, 1.3.6.1.4.1.37244.2.2 = hexProductId
            Subject Public Key Info:
                Public Key Algorithm: id-ecPublicKey
                    Public-Key: (256 bit)
                    pub:
                        04:4f:93:ba:3b:bf:63:90:73:98:76:1e:af:87:79:
                        11:e6:77:e8:e2:df:a7:49:f1:7c:ac:a8:a6:91:76:
                        08:5b:39:ce:6c:72:db:6d:9a:92:b3:ba:05:b0:e8:
                        31:a0:bf:36:50:2b:5c:72:55:7f:11:c8:01:ff:3a:
                        46:b9:19:60:28
                    ASN1 OID: prime256v1
                    NIST CURVE: P-256
            X509v3 extensions:
                X509v3 Basic Constraints: critical
                    CA:FALSE
                X509v3 Key Usage: critical
                    Digital Signature
                X509v3 Subject Key Identifier:
                    21:0A:CA:B1:B6:5F:17:65:D8:61:19:73:84:1A:9D:52:81:19:C5:39
                X509v3 Authority Key Identifier:
                    37:7F:24:9A:73:41:4B:16:6E:6A:42:6E:F5:E8:89:FB:75:F8:77:BB
        Signature Algorithm: ecdsa-with-SHA256
        Signature Value:
            30:45:02:20:38:8f:c5:0d:3e:90:95:dd:7d:7c:e9:5a:05:19:
            1f:2d:14:08:a3:d7:0e:b5:15:6d:d3:b0:0b:f7:b8:28:4d:bf:
            02:21:00:d4:05:30:43:a6:05:00:0e:b9:99:0d:34:3d:75:fe:
            d3:c1:4e:73:ff:e7:05:64:7a:62:8d:2d:38:8f:fd:4d:ad
    

PAA

یک فرآیند مشابه می تواند برای تولید یک PAA با امضای خود استفاده شود، اما انجام این کار ضروری نیست.

در عوض، کاری که ما در اینجا انجام داده‌ایم استفاده از PAA توسعه‌ای با امضای خود است که شامل اطلاعات VID نمی‌شود.

برای مثال‌های بیشتر از تولید CD، به credentials/test/gen-test-cds.sh و برای مثال‌های بیشتر از تولید PAA، PAI، و DAC، به credentials/test/gen-test-attestation-certs.sh مراجعه کنید.

گواهی ها را جایگزین کنید

PAA و PAI را جایگزین کنید

  1. اسکریپت کمکی زیر را اجرا کنید که از ابزار CHIP Certificate Tool ( chip-cert ) برای تولید آرایه های به سبک C از گواهی های شما استفاده می کند.

اسکریپت Embeddable Certificates Helper را دانلود کنید

#!/bin/bash

#
# generate-embeddable-certs.sh script
# —----------------------------------
#
# This script generates self-minted DAC and PAI.
# The output may easily be included in your C++ source code.
#

# Edit this information with your paths and certificates
folder="credentials/test/attestation"
chip_cert_tool="src/credentials/out/chip-cert"
cert_file_der="${folder}/test-PAI-${VID}-cert.der"
cert_file_pem="${folder}/test-PAI-${VID}-cert.pem"
key_file_pem="${folder}/test-PAI-${VID}-key.pem"

type="Pai"

printf "namespace chip {\n"
printf "namespace DevelopmentCerts {\n\n"
printf "#if CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID == ${PID}\n\n"

printcert() {
  # convert cert to DER
  if [ -f "${cert_file_der}" ]; then
      rm "${cert_file_der}"
  fi
  "${chip_cert_tool}" convert-cert "${cert_file_pem}" "${cert_file_der}" --x509-der

  printf "// ------------------------------------------------------------ \n"
  printf "// ${type} CERTIFICATE ${cert_file_der} \n\n"

  printf "constexpr uint8_t ${type}_Cert_Array[] = {\n"
  less -f "${cert_file_der}" | od -t x1 -An | sed 's/\/,/g' | sed 's/^/   /g'
  printf "};\n\n"
  printf "ByteSpan k${type}Cert = ByteSpan(${type}_Cert_Array);\n\n"

  printf "// ${type} PUBLIC KEY FROM ${key_file_pem} \n\n"

  printf "constexpr uint8_t ${type}_PublicKey_Array[] = {\n"
  openssl ec -text -noout -in "${key_file_pem}" 2>/dev/null | sed '/ASN1 OID/d' | sed '/NIST CURVE/d' | sed -n '/pub:/,$p' | sed '/pub:/d' | sed 's/\([0-9a-fA-F][0-9a-fA-F]\)/0x\1/g' | sed 's/:/, /g'
  printf "};\n\n"
  printf "ByteSpan k${type}PublicKey = ByteSpan(${type}_PublicKey_Array);\n\n"

  printf "// ${type} PRIVATE KEY FROM ${key_file_pem} \n\n"

  printf "constexpr uint8_t ${type}_PrivateKey_Array[] = {\n"
  openssl ec -text -noout -in "${key_file_pem}" 2>/dev/null | sed '/read EC key/d' | sed '/Private-Key/d' | sed '/priv:/d' | sed '/pub:/,$d' | sed 's/\([0-9a-fA-F][0-9a-fA-F]\)/0x\1/g' | sed 's/:/, /g'
  printf "};\n\n"
  printf "ByteSpan k${type}PrivateKey = ByteSpan(${type}_PrivateKey_Array);\n\n"
}

# generates PAI
printcert

type="Dac"
cert_file_der="${folder}/test-DAC-${VID}-${PID}-cert.der"
cert_file_pem="${folder}/test-DAC-${VID}-${PID}-cert.pem"
key_file_pem="${folder}/test-DAC-${VID}-${PID}-key.pem"

# generates DAC
printcert

printf "#endif // CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID\n"
printf "} // namespace DevelopmentCerts\n"
printf "} // namespace chip\n"


  1. محتویات خروجی PAI و DAC را در پیاده سازی DeviceAttestationCredentialsProvider::GetProductAttestationIntermediateCert کپی کنید.

    در دستگاه های تولیدی، PAI و DAC در Factory Data هستند، در حالی که CD در خود سیستم عامل تعبیه شده است.

    1. اگر هنوز از داده‌های کارخانه استفاده نمی‌کنید، ممکن است بخواهید PAI خود را در src/credentials/examples/ExampleDACs.cpp قرار دهید. در این مورد، کد تولید شده را به فایل ExampleDACs.cpp خود اضافه کنید:

      ByteSpan kDacCert       = ByteSpan(kDevelopmentDAC_Cert_FFF1_801F);
      ByteSpan kDacPrivateKey = ByteSpan(kDevelopmentDAC_PrivateKey_FFF1_801F);
      ByteSpan kDacPublicKey  = ByteSpan(kDevelopmentDAC_PublicKey_FFF1_801F);
      #endif
      } // namespace DevelopmentCerts
      } // namespace chip
      
      /* ------------------------------------------ */
      /* current end-of-file                        */
      /* ------------------------------------------ */
      
      /* ------------------------------------------ */
      /* output of creds-codelab.sh script          */
      /* ------------------------------------------ */
      
      namespace chip {
      namespace DevelopmentCerts {
      
      #if CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID == hexProductId
      
      ...
      
      ByteSpan kDacPrivateKey = ByteSpan(Dac_PrivateKey_Array);
      
      #endif // CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID
      } // namespace DevelopmentCerts
      } // namespace chip
      
    2. اگر از Factory Data یا یک ارائه‌دهنده اعتبار سفارشی استفاده می‌کنید، مطمئن شوید که اعتبارنامه‌ها را در مکان‌های مناسب وارد کرده‌اید. ممکن است بخواهید با ارائه دهنده SoC خود در مورد مشخصات پلت فرم خود بررسی کنید.

سی دی را تعویض کنید

  1. یک نمایش متنی از محتوای فایل سی دی خود را با استفاده از xxd استخراج کنید:

      $ xxd -i credentials/test/certification-declaration/Chip-Test-CD-${VID}-${PID}.der
    

    خروجی نمونه:

      unsigned char credentials_test_certification_declaration_Chip_Test_CD_hexVendorId_hexProductId_der[] = {
        0x30, 0x81, 0xe9, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
        0x07, 0x02, 0xa0, 0x81, 0xdb, 0x30, 0x81, 0xd8, 0x02, 0x01, 0x03, 0x31,
        0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04,
        0x02, 0x01, 0x30, 0x45, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
        0x01, 0x07, 0x01, 0xa0, 0x38, 0x04, 0x36, 0x15, 0x24, 0x00, 0x01, 0x25,
        0x01, 0xfe, 0xca, 0x36, 0x02, 0x05, 0xce, 0xfa, 0x18, 0x25, 0x03, 0x34,
        0x12, 0x2c, 0x04, 0x13, 0x5a, 0x49, 0x47, 0x32, 0x30, 0x31, 0x34, 0x31,
        0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x31, 0x2d, 0x32, 0x34, 0x24,
        0x05, 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x76, 0x98, 0x24, 0x08, 0x00,
        0x18, 0x31, 0x7d, 0x30, 0x7b, 0x02, 0x01, 0x03, 0x80, 0x14, 0x62, 0xfa,
        0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a,
        0xdd, 0xf5, 0x04, 0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86,
        0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, 0x06, 0x08, 0x2a,
        0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x47, 0x30, 0x45, 0x02,
        0x20, 0x53, 0x25, 0x03, 0x2c, 0x96, 0x50, 0xb6, 0x64, 0xf4, 0x18, 0xbf,
        0x99, 0x47, 0xf8, 0x9d, 0xe6, 0xeb, 0x43, 0x94, 0xf1, 0xce, 0xb2, 0x61,
        0x00, 0xe0, 0xf9, 0x89, 0xa8, 0x71, 0x82, 0x02, 0x0a, 0x02, 0x21, 0x00,
        0xea, 0x0a, 0x40, 0xab, 0x87, 0xad, 0x7e, 0x25, 0xe1, 0xa1, 0x6c, 0xb1,
        0x12, 0xfa, 0x86, 0xfe, 0xea, 0x8a, 0xaf, 0x4b, 0xc1, 0xf3, 0x6f, 0x09,
        0x85, 0x46, 0x50, 0xb6, 0xd0, 0x55, 0x40, 0xe2
      };
      unsigned int credentials_test_certification_declaration_Chip_Test_CD_hexVendorId_hexProductId_der_len = 236;
      ```
    
  2. متنی را که در مرحله قبل استخراج کردید در فایلی که برای تعریف سی دی استفاده شده است در بیلد خود کپی کنید. همانطور که در مورد PAI و DAC، نحوه انجام این کار بستگی به پلتفرمی دارد که در حال توسعه هستید.

اگر از نمونه های اعتبار استفاده می کنید، احتمالاً می خواهید محتوای kCdForAllExamples را در ExampleDACProvider::GetCertificationDeclaration در src/credentials/examples/DeviceAttestationCredsExample.cpp جایگزین کنید:

    const uint8_t kCdForAllExamples[] = {
            0x30, 0x81, 0xe9, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
            0x07, 0x02, 0xa0, 0x81, 0xdb, 0x30, 0x81, 0xd8, 0x02, 0x01, 0x03, 0x31,
            0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04,
            0x02, 0x01, 0x30, 0x45, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
            0x01, 0x07, 0x01, 0xa0, 0x38, 0x04, 0x36, 0x15, 0x24, 0x00, 0x01, 0x25,
            0x01, 0xfe, 0xca, 0x36, 0x02, 0x05, 0xce, 0xfa, 0x18, 0x25, 0x03, 0x34,
            0x12, 0x2c, 0x04, 0x13, 0x5a, 0x49, 0x47, 0x32, 0x30, 0x31, 0x34, 0x31,
            0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x31, 0x2d, 0x32, 0x34, 0x24,
            0x05, 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x76, 0x98, 0x24, 0x08, 0x00,
            0x18, 0x31, 0x7d, 0x30, 0x7b, 0x02, 0x01, 0x03, 0x80, 0x14, 0x62, 0xfa,
            0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a,
            0xdd, 0xf5, 0x04, 0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86,
            0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, 0x06, 0x08, 0x2a,
            0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x47, 0x30, 0x45, 0x02,
            0x20, 0x53, 0x25, 0x03, 0x2c, 0x96, 0x50, 0xb6, 0x64, 0xf4, 0x18, 0xbf,
            0x99, 0x47, 0xf8, 0x9d, 0xe6, 0xeb, 0x43, 0x94, 0xf1, 0xce, 0xb2, 0x61,
            0x00, 0xe0, 0xf9, 0x89, 0xa8, 0x71, 0x82, 0x02, 0x0a, 0x02, 0x21, 0x00,
            0xea, 0x0a, 0x40, 0xab, 0x87, 0xad, 0x7e, 0x25, 0xe1, 0xa1, 0x6c, 0xb1,
            0x12, 0xfa, 0x86, 0xfe, 0xea, 0x8a, 0xaf, 0x4b, 0xc1, 0xf3, 0x6f, 0x09,
            0x85, 0x46, 0x50, 0xb6, 0xd0, 0x55, 0x40, 0xe2
        };

هدف را بسازید

هدف خود را با استفاده از اعتبارنامه‌های تازه استخراج شده خود بسازید و فلش کنید. این بخش به پلتفرم وابسته است. برای اطلاعات بیشتر به اسناد SoC یا دستگاه های پشتیبانی شده خود مراجعه کنید.

دستگاه را راه اندازی کنید

اکنون می‌توانید مراحلی را که قبلاً در Pair a Matter توضیح داده شده است، دنبال کنید تا دستگاه Matter خود را در Google Home platform راه اندازی کنید.

اشکال زدایی با استفاده از chip-tool

chip-tool می تواند ابزار ارزشمندی برای بررسی اینکه آیا دستگاه شما گواهینامه های صحیح را ارسال می کند یا خیر. برای ساختن آن:

$ cd examples/chip-tool
$ gn gen out/debug
Done. Made 114 targets from 112 files in 157ms
$ ninja -C out/debug
ninja: Entering directory `out/debug'
$ cd ../..

برای فعال کردن گزارش‌های اضافی، هر زمان که chip-tool را اجرا می‌کنید، حتماً پرچم --trace_decode 1 را ارسال کنید. علاوه بر این، این یک تمرین خوب است که مسیر فایل PAA خود را با پرچم --paa-trust-store-path عبور دهید.

بنابراین برای راه اندازی یک دستگاه Thread با استفاده از BLE، می توانید اجرا کنید:

```
$ examples/chip-tool/out/debug/chip-tool pairing ble-thread 1 \
  hex:Thread_credentials \
  pairing_code \
  discriminator \
  --paa-trust-store-path <path to PAA folder> \
  --trace_decode 1
```

در مورد دستگاه های آزمایشی، <PAIRING CODE> 20202021 و <DISCRIMINATOR> 3840 است.

برای دریافت اعتبار Thread از Google Nest Hub (2nd gen) ، می‌توانید این موارد را اجرا کنید:

$ adb connect border_router_ip_address
$ adb -e shell ot-ctl dataset active -x
$ adb disconnect

و برای راه اندازی دستگاه Wi-Fi، می توانید از گزینه ble-wifi استفاده کنید:

$ examples/chip-tool/out/debug/chip-tool pairing ble-wifi 1 "SSID" SSID_password pairing_code discriminator
،

سناریوهای توسعه خاصی مانند تست OTA نیاز به ایجاد گواهینامه های غیر تولیدی دارند.

برخی از ویژگی‌های اکوسیستم Google، از جمله به‌روزرسانی‌های نرم‌افزار OTA دستگاه را نمی‌توان با استفاده از تست VID/PID انجام داد .

این راهنما نحوه ایجاد و تأیید Matter غیر تولیدی را برای استفاده در آزمایش توضیح می‌دهد. انواع گواهینامه ها عبارتند از:

  1. بیانیه گواهینامه ( CD )
  2. گواهینامه گواهی محصول میانی ( PAI )
  3. گواهی تأیید دستگاه ( DAC )

در طول فرآیند راه اندازی، یک دستگاه دارای گواهینامه Matter باید خود را تأیید کند ، یعنی ثابت کند که یک محصول واقعی دارای گواهی Matter است. مدارک مورد استفاده توسط دستگاه های Matter برای تأیید عبارتند از:

  1. یک جفت کلید تصدیق
  2. یک زنجیره گواهی

گواهی تأیید دستگاه (DAC) اولین پیوند زنجیره گواهی است و توسط گواهی میانی گواهی محصول (PAI) تأیید می شود که به نوبه خود توسط مرجع تأیید محصول (PAA) تأیید می شود.

گواهینامه ها همزمان با ایجاد جفت کلید گواهی امضا می شوند و با استفاده از کلید خصوصی مرجع صدور گواهی یک سطح بالاتر امضا می شوند و زنجیره ای از اعتماد را تشکیل می دهند. بنابراین، یک گواهی DAC توسط یک کلید PAI و یک گواهی PAI توسط یک کلید PAA امضا می شود. گواهینامه های PAA به عنوان بالای زنجیره، خود امضا هستند. این زنجیره اعتماد یک ساختار PAA فدرال را تشکیل می دهد که توسط دفتر کل انطباق توزیع شده (DCL) همگام سازی می شود.

اطلاعات بیشتر در مورد فرآیند تأیید و اظهارنامه های گواهی (CD) را می توان در اسناد و پیام های تأییدیه اضافی و در مشخصات موضوع یافت.

Matter SDK را نصب کنید

این دستورالعمل‌ها فرض می‌کنند که Matter SDK را نصب کرده‌اید. لطفاً به مستندات آن در Github مراجعه کنید یا برای اطلاعات بیشتر به شروع با Matter مراجعه کنید.

اگر برنامه hexdump xxd را ندارید آن را نصب کنید. این ابزار برای چاپ اعتبارنامه ها در قالب C-style مفید است:

sudo apt-get install xxd

ساخت chip-cert

  1. مطمئن شوید که روی نسخه اخیر SDK کار می کنید. این رویه‌ها در Github SHA 0b17bce8 ، در v1.0-branch آزمایش شدند:

    $ cd connectedhomeip
    $ git checkout v1.0-branch
    $ git pull
    
  2. Build chip-cert ، که ابزاری است که برای چندین عملیات روی اعتبارنامه‌های دستگاه‌های Matter استفاده می‌شود:

    1. پیکربندی ساخت:

      $ cd src/credentials
      $ source ../../scripts/activate.sh
      $ gn gen out
      

      نمونه خروجی gn :

      Done. Made 5774 targets from 289 files in 658ms
      
    2. ساخت را اجرا کنید:

      $ ninja -C out
      

      نمونه خروجی ninja :

      ninja: Entering directory `out'
      [2000/2000] stamp obj/default.stamp
      

گواهی های خود را ضرب کنید

VID/PID سفارشی خود را به عنوان متغیرهای محیطی صادر کنید تا احتمال خطای اداری هنگام ویرایش آرگومان های فرمان کاهش یابد:

$ cd ../..
$ export VID=hexVendorId
$ export PID=hexProductId

یک سی دی تولید کنید

  1. سی دی را با استفاده از chip-cert تولید کنید. در حال حاضر کمیسیونر فقط تأیید می‌کند که VID و PID با داده‌هایی که در مکان‌های دیگر توسط دستگاه در معرض دید قرار می‌گیرند مطابقت دارند: خوشه اطلاعات پایه، مبدا DAC و DAC (در صورت داشتن آن). می توانید سایر قسمت ها را بدون تغییر رها کنید:

    $ src/credentials/out/chip-cert gen-cd \
      --key credentials/test/certification-declaration/Chip-Test-CD-Signing-Key.pem \
      --cert credentials/test/certification-declaration/Chip-Test-CD-Signing-Cert.pem \
      --out credentials/test/certification-declaration/Chip-Test-CD-${VID}-${PID}.der \
      --format-version "1" \
      --vendor-id "${VID}" \
      --product-id "${PID}" \
      --device-type-id "0x1234" \
      --certificate-id "ZIG20141ZB330001-24" \
      --security-level "0" \
      --security-info "0" \
      --version-number "9876" \
      --certification-type "0"
    
  2. سی دی را تایید کنید. مطمئن شوید که حاوی VID/PID شما (در قالب اعشار) است:

    $ src/credentials/out/chip-cert print-cd credentials/test/certification-declaration/Chip-Test-CD-${VID}-${PID}.der
    

    خروجی نمونه:

    SignerKeyId value: hex:62FA823359ACFAA9963E1CFA140ADDF504F37160
    0x01, tag[Anonymous]: 0xffffffff, type: Structure (0x15), container:
    0x04,     tag[Context Specific]: 0x0, type: Unsigned Fixed Point (0x04), value: 1
    0x08,     tag[Context Specific]: 0x1, type: Unsigned Fixed Point (0x04), value: XXXXX // <- VID
    0x0A,     tag[Context Specific]: 0x2, type: Array (0x16), container:
    0x0D,         tag[Anonymous]: 0xffffffff, type: Unsigned Fixed Point (0x04), value: XXXXX // <- PID
    0x12,     tag[Context Specific]: 0x3, type: Unsigned Fixed Point (0x04), value: 4660
    0x15,     tag[Context Specific]: 0x4, type: UTF-8 String (0x0c), length: 19, value: "ZIG20141ZB330001-24"
    0x2B,     tag[Context Specific]: 0x5, type: Unsigned Fixed Point (0x04), value: 0
    0x2E,     tag[Context Specific]: 0x6,type: Unsigned Fixed Point (0x04), value: 0
    0x32,     tag[Context Specific]: 0x7, type: Unsigned Fixed Point (0x04), value: 39030
    0x35,     tag[Context Specific]: 0x8, type: Unsigned Fixed Point (0x04), value: 0
    

یک PAI و DAC ایجاد کنید

در این مثال، از گواهینامه مرجع تأیید محصول آزمایشی خود Matter (PAA) و امضای کلید Chip-Test-PAA-NoVID به عنوان گواهی ریشه استفاده می کنیم. ما از آن به عنوان CA ریشه برای تولید PAI و DAC خود استفاده خواهیم کرد.

  1. PAI را با استفاده از PAA ایجاد کنید. شما ممکن است به صورت اختیاری اطلاعات PID را در PAI قرار دهید، اما حذف آن به شما انعطاف بیشتری برای آزمایش می دهد. اگر برای PID های اضافی به DAC نیاز دارید، می توانید فقط مرحله تولید DAC را اجرا کنید:

    $ src/credentials/out/chip-cert gen-att-cert --type i \
      --subject-cn "Matter Test PAI" \
      --subject-vid "${VID}" \
      --valid-from "2021-06-28 14:23:43" \
      --lifetime "4294967295" \
      --ca-key credentials/test/attestation/Chip-Test-PAA-NoVID-Key.pem \
      --ca-cert credentials/test/attestation/Chip-Test-PAA-NoVID-Cert.pem \
      --out-key credentials/test/attestation/"test-PAI-${VID}-key".pem \
      --out credentials/test/attestation/"test-PAI-${VID}-cert".pem
    
  2. DAC را با استفاده از PAI تولید کنید:

    $ src/credentials/out/chip-cert gen-att-cert --type d \
      --subject-cn "Matter Test DAC 0" \
      --subject-vid "${VID}" \
      --subject-pid "${PID}" \
      --valid-from "2021-06-28 14:23:43" \
      --lifetime "4294967295" \
      --ca-key credentials/test/attestation/"test-PAI-${VID}-key".pem \
      --ca-cert credentials/test/attestation/"test-PAI-${VID}-cert".pem \
      --out-key credentials/test/attestation/"test-DAC-${VID}-${PID}-key".pem \
      --out credentials/test/attestation/"test-DAC-${VID}-${PID}-cert".pem
    
  3. زنجیره DAC، PAI و PAA را تأیید کنید. اگر هیچ خطایی در خروجی ظاهر نشود، به این معنی است که زنجیره گواهی گواهی با موفقیت تأیید شده است:

    $ src/credentials/out/chip-cert validate-att-cert \
    --dac credentials/test/attestation/"test-DAC-${VID}-${PID}-cert".pem \
    --pai credentials/test/attestation/"test-PAI-${VID}-cert".pem \
    --paa credentials/test/attestation/Chip-Test-PAA-NoVID-Cert.pem
    
  4. می توانید کلیدهای خود را با استفاده از openssl بررسی کنید:

    $ openssl ec -noout -text -in \
      credentials/test/attestation/test-DAC-${VID}-${PID}-key.pem
    

    خروجی نمونه:

    read EC key
    Private-Key: (256 bit)
    priv:
        c9:f2:b3:04:b2:db:0d:6f:cd:c6:be:f3:7b:76:8d:
        8c:01:4e:0b:9e:ce:3e:72:49:3c:0e:35:63:7c:6c:
        6c:d6
    pub:
        04:4f:93:ba:3b:bf:63:90:73:98:76:1e:af:87:79:
        11:e6:77:e8:e2:df:a7:49:f1:7c:ac:a8:a6:91:76:
        08:5b:39:ce:6c:72:db:6d:9a:92:b3:ba:05:b0:e8:
        31:a0:bf:36:50:2b:5c:72:55:7f:11:c8:01:ff:3a:
        46:b9:19:60:28
    ASN1 OID: prime256v1
    NIST CURVE: P-256
    
  5. همچنین می توانید openssl برای بازرسی گواهی های تولید شده خود استفاده کنید:

    $ openssl x509 -noout -text -in \
      credentials/test/attestation/test-DAC-${VID}-${PID}-cert.pem
    

    خروجی نمونه:

    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number: 2875998130766646679 (0x27e9990fef088d97)
            Signature Algorithm: ecdsa-with-SHA256
            Issuer: CN = Matter Test PAI, 1.3.6.1.4.1.37244.2.1 = hexVendorId
            Validity
                Not Before: Jun 28 14:23:43 2021 GMT
                Not After : Dec 31 23:59:59 9999 GMT
            Subject: CN = Matter Test DAC 0, 1.3.6.1.4.1.37244.2.1 = hexVendorId, 1.3.6.1.4.1.37244.2.2 = hexProductId
            Subject Public Key Info:
                Public Key Algorithm: id-ecPublicKey
                    Public-Key: (256 bit)
                    pub:
                        04:4f:93:ba:3b:bf:63:90:73:98:76:1e:af:87:79:
                        11:e6:77:e8:e2:df:a7:49:f1:7c:ac:a8:a6:91:76:
                        08:5b:39:ce:6c:72:db:6d:9a:92:b3:ba:05:b0:e8:
                        31:a0:bf:36:50:2b:5c:72:55:7f:11:c8:01:ff:3a:
                        46:b9:19:60:28
                    ASN1 OID: prime256v1
                    NIST CURVE: P-256
            X509v3 extensions:
                X509v3 Basic Constraints: critical
                    CA:FALSE
                X509v3 Key Usage: critical
                    Digital Signature
                X509v3 Subject Key Identifier:
                    21:0A:CA:B1:B6:5F:17:65:D8:61:19:73:84:1A:9D:52:81:19:C5:39
                X509v3 Authority Key Identifier:
                    37:7F:24:9A:73:41:4B:16:6E:6A:42:6E:F5:E8:89:FB:75:F8:77:BB
        Signature Algorithm: ecdsa-with-SHA256
        Signature Value:
            30:45:02:20:38:8f:c5:0d:3e:90:95:dd:7d:7c:e9:5a:05:19:
            1f:2d:14:08:a3:d7:0e:b5:15:6d:d3:b0:0b:f7:b8:28:4d:bf:
            02:21:00:d4:05:30:43:a6:05:00:0e:b9:99:0d:34:3d:75:fe:
            d3:c1:4e:73:ff:e7:05:64:7a:62:8d:2d:38:8f:fd:4d:ad
    

PAA

یک فرآیند مشابه می تواند برای تولید یک PAA با امضای خود استفاده شود، اما انجام این کار ضروری نیست.

در عوض، کاری که ما در اینجا انجام داده‌ایم استفاده از PAA توسعه‌ای با امضای خود است که شامل اطلاعات VID نمی‌شود.

برای مثال‌های بیشتر از تولید CD، به credentials/test/gen-test-cds.sh و برای مثال‌های بیشتر از تولید PAA، PAI، و DAC، به credentials/test/gen-test-attestation-certs.sh مراجعه کنید.

گواهی ها را جایگزین کنید

PAA و PAI را جایگزین کنید

  1. اسکریپت کمکی زیر را اجرا کنید که از ابزار CHIP Certificate Tool ( chip-cert ) برای تولید آرایه های به سبک C از گواهی های شما استفاده می کند.

اسکریپت Embeddable Certificates Helper را دانلود کنید

#!/bin/bash

#
# generate-embeddable-certs.sh script
# —----------------------------------
#
# This script generates self-minted DAC and PAI.
# The output may easily be included in your C++ source code.
#

# Edit this information with your paths and certificates
folder="credentials/test/attestation"
chip_cert_tool="src/credentials/out/chip-cert"
cert_file_der="${folder}/test-PAI-${VID}-cert.der"
cert_file_pem="${folder}/test-PAI-${VID}-cert.pem"
key_file_pem="${folder}/test-PAI-${VID}-key.pem"

type="Pai"

printf "namespace chip {\n"
printf "namespace DevelopmentCerts {\n\n"
printf "#if CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID == ${PID}\n\n"

printcert() {
  # convert cert to DER
  if [ -f "${cert_file_der}" ]; then
      rm "${cert_file_der}"
  fi
  "${chip_cert_tool}" convert-cert "${cert_file_pem}" "${cert_file_der}" --x509-der

  printf "// ------------------------------------------------------------ \n"
  printf "// ${type} CERTIFICATE ${cert_file_der} \n\n"

  printf "constexpr uint8_t ${type}_Cert_Array[] = {\n"
  less -f "${cert_file_der}" | od -t x1 -An | sed 's/\/,/g' | sed 's/^/   /g'
  printf "};\n\n"
  printf "ByteSpan k${type}Cert = ByteSpan(${type}_Cert_Array);\n\n"

  printf "// ${type} PUBLIC KEY FROM ${key_file_pem} \n\n"

  printf "constexpr uint8_t ${type}_PublicKey_Array[] = {\n"
  openssl ec -text -noout -in "${key_file_pem}" 2>/dev/null | sed '/ASN1 OID/d' | sed '/NIST CURVE/d' | sed -n '/pub:/,$p' | sed '/pub:/d' | sed 's/\([0-9a-fA-F][0-9a-fA-F]\)/0x\1/g' | sed 's/:/, /g'
  printf "};\n\n"
  printf "ByteSpan k${type}PublicKey = ByteSpan(${type}_PublicKey_Array);\n\n"

  printf "// ${type} PRIVATE KEY FROM ${key_file_pem} \n\n"

  printf "constexpr uint8_t ${type}_PrivateKey_Array[] = {\n"
  openssl ec -text -noout -in "${key_file_pem}" 2>/dev/null | sed '/read EC key/d' | sed '/Private-Key/d' | sed '/priv:/d' | sed '/pub:/,$d' | sed 's/\([0-9a-fA-F][0-9a-fA-F]\)/0x\1/g' | sed 's/:/, /g'
  printf "};\n\n"
  printf "ByteSpan k${type}PrivateKey = ByteSpan(${type}_PrivateKey_Array);\n\n"
}

# generates PAI
printcert

type="Dac"
cert_file_der="${folder}/test-DAC-${VID}-${PID}-cert.der"
cert_file_pem="${folder}/test-DAC-${VID}-${PID}-cert.pem"
key_file_pem="${folder}/test-DAC-${VID}-${PID}-key.pem"

# generates DAC
printcert

printf "#endif // CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID\n"
printf "} // namespace DevelopmentCerts\n"
printf "} // namespace chip\n"


  1. محتویات خروجی PAI و DAC را در پیاده سازی DeviceAttestationCredentialsProvider::GetProductAttestationIntermediateCert کپی کنید.

    در دستگاه های تولیدی، PAI و DAC در Factory Data هستند، در حالی که CD در خود سیستم عامل تعبیه شده است.

    1. اگر هنوز از داده‌های کارخانه استفاده نمی‌کنید، ممکن است بخواهید PAI خود را در src/credentials/examples/ExampleDACs.cpp قرار دهید. در این مورد، کد تولید شده را به فایل ExampleDACs.cpp خود اضافه کنید:

      ByteSpan kDacCert       = ByteSpan(kDevelopmentDAC_Cert_FFF1_801F);
      ByteSpan kDacPrivateKey = ByteSpan(kDevelopmentDAC_PrivateKey_FFF1_801F);
      ByteSpan kDacPublicKey  = ByteSpan(kDevelopmentDAC_PublicKey_FFF1_801F);
      #endif
      } // namespace DevelopmentCerts
      } // namespace chip
      
      /* ------------------------------------------ */
      /* current end-of-file                        */
      /* ------------------------------------------ */
      
      /* ------------------------------------------ */
      /* output of creds-codelab.sh script          */
      /* ------------------------------------------ */
      
      namespace chip {
      namespace DevelopmentCerts {
      
      #if CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID == hexProductId
      
      ...
      
      ByteSpan kDacPrivateKey = ByteSpan(Dac_PrivateKey_Array);
      
      #endif // CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID
      } // namespace DevelopmentCerts
      } // namespace chip
      
    2. اگر از Factory Data یا یک ارائه‌دهنده اعتبار سفارشی استفاده می‌کنید، مطمئن شوید که اعتبارنامه‌ها را در مکان‌های مناسب وارد کرده‌اید. ممکن است بخواهید با ارائه دهنده SoC خود در مورد مشخصات پلت فرم خود بررسی کنید.

سی دی را تعویض کنید

  1. یک نمایش متنی از محتوای فایل سی دی خود را با استفاده از xxd استخراج کنید:

      $ xxd -i credentials/test/certification-declaration/Chip-Test-CD-${VID}-${PID}.der
    

    خروجی نمونه:

      unsigned char credentials_test_certification_declaration_Chip_Test_CD_hexVendorId_hexProductId_der[] = {
        0x30, 0x81, 0xe9, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
        0x07, 0x02, 0xa0, 0x81, 0xdb, 0x30, 0x81, 0xd8, 0x02, 0x01, 0x03, 0x31,
        0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04,
        0x02, 0x01, 0x30, 0x45, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
        0x01, 0x07, 0x01, 0xa0, 0x38, 0x04, 0x36, 0x15, 0x24, 0x00, 0x01, 0x25,
        0x01, 0xfe, 0xca, 0x36, 0x02, 0x05, 0xce, 0xfa, 0x18, 0x25, 0x03, 0x34,
        0x12, 0x2c, 0x04, 0x13, 0x5a, 0x49, 0x47, 0x32, 0x30, 0x31, 0x34, 0x31,
        0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x31, 0x2d, 0x32, 0x34, 0x24,
        0x05, 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x76, 0x98, 0x24, 0x08, 0x00,
        0x18, 0x31, 0x7d, 0x30, 0x7b, 0x02, 0x01, 0x03, 0x80, 0x14, 0x62, 0xfa,
        0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a,
        0xdd, 0xf5, 0x04, 0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86,
        0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, 0x06, 0x08, 0x2a,
        0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x47, 0x30, 0x45, 0x02,
        0x20, 0x53, 0x25, 0x03, 0x2c, 0x96, 0x50, 0xb6, 0x64, 0xf4, 0x18, 0xbf,
        0x99, 0x47, 0xf8, 0x9d, 0xe6, 0xeb, 0x43, 0x94, 0xf1, 0xce, 0xb2, 0x61,
        0x00, 0xe0, 0xf9, 0x89, 0xa8, 0x71, 0x82, 0x02, 0x0a, 0x02, 0x21, 0x00,
        0xea, 0x0a, 0x40, 0xab, 0x87, 0xad, 0x7e, 0x25, 0xe1, 0xa1, 0x6c, 0xb1,
        0x12, 0xfa, 0x86, 0xfe, 0xea, 0x8a, 0xaf, 0x4b, 0xc1, 0xf3, 0x6f, 0x09,
        0x85, 0x46, 0x50, 0xb6, 0xd0, 0x55, 0x40, 0xe2
      };
      unsigned int credentials_test_certification_declaration_Chip_Test_CD_hexVendorId_hexProductId_der_len = 236;
      ```
    
  2. متنی را که در مرحله قبل استخراج کردید در فایلی که برای تعریف سی دی استفاده شده است در بیلد خود کپی کنید. همانطور که در مورد PAI و DAC، نحوه انجام این کار بستگی به پلتفرمی دارد که در حال توسعه هستید.

اگر از نمونه های اعتبار استفاده می کنید، احتمالاً می خواهید محتوای kCdForAllExamples را در ExampleDACProvider::GetCertificationDeclaration در src/credentials/examples/DeviceAttestationCredsExample.cpp جایگزین کنید:

    const uint8_t kCdForAllExamples[] = {
            0x30, 0x81, 0xe9, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
            0x07, 0x02, 0xa0, 0x81, 0xdb, 0x30, 0x81, 0xd8, 0x02, 0x01, 0x03, 0x31,
            0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04,
            0x02, 0x01, 0x30, 0x45, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
            0x01, 0x07, 0x01, 0xa0, 0x38, 0x04, 0x36, 0x15, 0x24, 0x00, 0x01, 0x25,
            0x01, 0xfe, 0xca, 0x36, 0x02, 0x05, 0xce, 0xfa, 0x18, 0x25, 0x03, 0x34,
            0x12, 0x2c, 0x04, 0x13, 0x5a, 0x49, 0x47, 0x32, 0x30, 0x31, 0x34, 0x31,
            0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x31, 0x2d, 0x32, 0x34, 0x24,
            0x05, 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x76, 0x98, 0x24, 0x08, 0x00,
            0x18, 0x31, 0x7d, 0x30, 0x7b, 0x02, 0x01, 0x03, 0x80, 0x14, 0x62, 0xfa,
            0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a,
            0xdd, 0xf5, 0x04, 0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86,
            0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, 0x06, 0x08, 0x2a,
            0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x47, 0x30, 0x45, 0x02,
            0x20, 0x53, 0x25, 0x03, 0x2c, 0x96, 0x50, 0xb6, 0x64, 0xf4, 0x18, 0xbf,
            0x99, 0x47, 0xf8, 0x9d, 0xe6, 0xeb, 0x43, 0x94, 0xf1, 0xce, 0xb2, 0x61,
            0x00, 0xe0, 0xf9, 0x89, 0xa8, 0x71, 0x82, 0x02, 0x0a, 0x02, 0x21, 0x00,
            0xea, 0x0a, 0x40, 0xab, 0x87, 0xad, 0x7e, 0x25, 0xe1, 0xa1, 0x6c, 0xb1,
            0x12, 0xfa, 0x86, 0xfe, 0xea, 0x8a, 0xaf, 0x4b, 0xc1, 0xf3, 0x6f, 0x09,
            0x85, 0x46, 0x50, 0xb6, 0xd0, 0x55, 0x40, 0xe2
        };

هدف را بسازید

هدف خود را با استفاده از اعتبارنامه‌های تازه استخراج شده خود بسازید و فلش کنید. این بخش به پلتفرم وابسته است. برای اطلاعات بیشتر به اسناد SoC یا دستگاه های پشتیبانی شده خود مراجعه کنید.

دستگاه را راه اندازی کنید

اکنون می‌توانید مراحلی را که قبلاً در Pair a Matter توضیح داده شده است، دنبال کنید تا دستگاه Matter خود را در Google Home platform راه اندازی کنید.

اشکال زدایی با استفاده از chip-tool

chip-tool می تواند ابزار ارزشمندی برای بررسی اینکه آیا دستگاه شما گواهینامه های صحیح را ارسال می کند یا خیر. برای ساختن آن:

$ cd examples/chip-tool
$ gn gen out/debug
Done. Made 114 targets from 112 files in 157ms
$ ninja -C out/debug
ninja: Entering directory `out/debug'
$ cd ../..

برای فعال کردن گزارش‌های اضافی، هر زمان که chip-tool را اجرا می‌کنید، حتماً پرچم --trace_decode 1 را ارسال کنید. علاوه بر این، این یک تمرین خوب است که مسیر فایل PAA خود را با پرچم --paa-trust-store-path عبور دهید.

بنابراین برای راه اندازی یک دستگاه Thread با استفاده از BLE، می توانید اجرا کنید:

```
$ examples/chip-tool/out/debug/chip-tool pairing ble-thread 1 \
  hex:Thread_credentials \
  pairing_code \
  discriminator \
  --paa-trust-store-path <path to PAA folder> \
  --trace_decode 1
```

در مورد دستگاه های آزمایشی، <PAIRING CODE> 20202021 و <DISCRIMINATOR> 3840 است.

برای دریافت اعتبار Thread از Google Nest Hub (2nd gen) ، می‌توانید این موارد را اجرا کنید:

$ adb connect border_router_ip_address
$ adb -e shell ot-ctl dataset active -x
$ adb disconnect

و برای راه اندازی دستگاه Wi-Fi، می توانید از گزینه ble-wifi استفاده کنید:

$ examples/chip-tool/out/debug/chip-tool pairing ble-wifi 1 "SSID" SSID_password pairing_code discriminator