Форматы зашифрованных объектов

Удостоверительные данные

Устройства Android используют библиотеку учетных данных удостоверений для безопасного управления учетными данными на устройстве. Библиотека идентификационных учетных данных предлагает ряд функций безопасности, которые эмитент должен использовать, чтобы обеспечить максимально безопасную интеграцию с Google.

Подписанный одноразовый номер

Библиотека идентификационных данных принимает « вызов » (называемый в этом API одноразовым номером) при получении сертификата идентификации устройства, отправленного эмитенту в RegisterDeviceRequest . Этот одноразовый номер подписывается и внедряется в расширение аттестации сертификата идентификации устройства. Это позволяет эмитенту быть уверенным в актуальности сертификата и аттестации и в том, что они не воспроизводятся сервером в процессе обмена данными.

Профили контроля доступа

Профили контроля доступа — это способ для эмитента точно указать, как они хотят защитить данные, хранящиеся в Identity Credential. Эмитент может указать, требуется ли аутентификация пользователя для доступа к элементу данных и как долго пользователь должен выполнять аутентификацию. Будущие (в настоящее время не поддерживаемые) варианты использования этой функции включают ограничение доступа читателей к элементу данных. Подробную информацию о форматировании профилей управления доступом можно найти в формате объекта Credential.

Подтверждение предоставления

Подтверждение предоставления объекта — это способ для эмитентов узнать, что учетные данные были успешно сохранены в Identity Credential. Эмитент не должен выдавать MSO для получения учетных данных до тех пор, пока он не получит и не проверит подтверждение предоставления. Подробнее этот объект описан в документации Identity Credential .

Форматы объектов

Каждый из этих объектов подвергается сквозному шифрованию между устройством и эмитентом. В результате серверы Google не имеют возможности нормализовать эти объекты, и некоторые из этих объектов могут иметь форматы, отличные от форматов остальных объектов API. Например, учетные данные форматируются в формате CBOR, а не в формате JSON, поскольку именно это ожидается на уровне Android.

Полномочия

Учетные данные содержат элементы данных и способы доступа к ним. Он содержит два основных объекта: provisionedData и accessControlProfiles . provisionedData содержит все пространства имен, соответствующие любому типу учетных данных. Например, для мобильных водительских прав это будут org.iso.18013.5.1 и org.aamva.18013.5.1 . Записи данных и значения внутри пространств имен определяют соответствующие профили управления доступом. Это делается в виде списка идентификаторов, где идентификатор соответствует профилю управления доступом в списке accessControlProfiles . В приведенном ниже примере [0] в каждой записи данных относится к профилю управления доступом с идентификатором 0, а не индексом 0.

Ниже приведен пример незакодированного элемента данных карты CBOR.

{
  "provisionedData": {
      "org.iso.18013.5.1": [
          {
              "name": "family_name",
              "value": "Smith",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "given_name",
              "value": "Stewart",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "birth_date",
              "value": {
                  "tag": 1004,
                  "value": "1965-09-01"
              },
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "issue_date",
              "value": {
                  "tag": 1004,
                  "value": "2022-08-01"
              },
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "expiry_date",
              "value": {
                  "tag": 1004,
                  "value": "2027-08-01"
              },
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "issuing_authority",
              "value": "IA",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "issuing_country",
              "value": "US",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "document_number",
              "value": "D04320785",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "portrait",
              "value": {
                  "type": "Buffer",
                  "data": [
                      167,
                      30,
                      148,
                      218,
                      204,
                      75,
                      112,
                      162,
                      138,
                      40,
                      52,
                      63,
                      255
                  ]
              },
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "un_distinguishing_sign",
              "value": "USA",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "driving_privileges",
              "value": [
                  {
                      "expiry_date": {
                          "tag": 1004,
                          "value": "2027-08-01"
                      },
                      "issue_date": {
                          "tag": 1004,
                          "value": "2022-08-01"
                      },
                      "vehicle_category_code": "B"
                  }
              ],
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "sex",
              "value": 1,
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "height",
              "value": 170,
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "weight",
              "value": 79,
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "eye_colour",
              "value": "Blue",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "hair_colour",
              "value": "Gray",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "age_in_years",
              "value": 57,
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "age_over_18",
              "value": true,
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "age_over_21",
              "value": true,
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "resident_address",
              "value": "1600 Amphitheatre Pkwy ",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "issuing_jurisdiction",
              "value": "US-CA",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "resident_city",
              "value": "Mountain View",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "resident_state",
              "value": "CA",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "resident_postal_code",
              "value": "94043",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "resident_country",
              "value": "US",
              "accessControlProfiles": [
                  1
              ]
          }
      ],
      "org.iso.18013.5.1.aamva": [
          {
              "name": "DHS_compliance",
              "value": "F",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "domestic_driving_privileges",
              "value": [
                  {
                      "domestic_vehicle_class": {
                          "domestic_vehicle_class_code": "D",
                          "domestic_vehicle_class_description": "Operator",
                          "expiry_date": {
                              "tag": 1004,
                              "value": "2027-08-01"
                          },
                          "issue_date": {
                              "tag": 1004,
                              "value": "2022-08-01"
                          }
                      },
                      "domestic_vehicle_restrictions": [
                          {
                              "domestic_vehicle_restriction_code": "B",
                              "domestic_vehicle_restriction_description": "Corrective lenses (also automated - vision screening)"
                          }
                      ]
                  }
              ],
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "aamva_version",
              "value": "1",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "family_name_truncation",
              "value": "N",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "given_name_truncation",
              "value": "N",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "organ_donor",
              "value": true,
              "accessControlProfiles": [
                  1
              ]
          }
      ]
  },
  "accessControlProfiles": [
      {
          "id": 1,
          "userAuthenticationRequired": true,
          "timeoutMillis": 10000
      }
  ]
}

Затем этот объект следует закодировать в формате CBOR, зашифровать, а затем закодировать в Base64. Если в тестовой среде данные не шифруются, их следует закодировать в формате CBOR, а затем закодировать в формате Base64.

Обратите внимание, что приведенный выше пример представляет собой незакодированную карту CBOR, а не JSON. Если строка JSON закодирована в CBOR, она не будет правильно проанализирована устройством Android.

Объекты мобильной безопасности

ISO/IEC 18013-5 определяет объект мобильной безопасности (MSO), гарантирующий, что данные mDL не будут подделаны и что они были выданы доверенным органом.

MSO содержит следующее:

  • Значения дайджеста : это уникальные значения, которые генерируются для каждого элемента данных в учетных данных mDL. Они используются для проверки того, что данные не были изменены с момента подписания MSO.
  • Ключ устройства : это уникальный ключ, который создается для каждого мобильного устройства, на котором хранятся учетные данные. Он используется для привязки MSO к устройству и предотвращения его использования на других устройствах.
  • Информация о сроке действия : сюда входят даты начала и окончания действия MSO.
  • Подпись IA : это цифровая подпись, созданная органом выдачи (IA) с использованием его закрытого ключа. Он используется для проверки того, что MSO был выдан доверенным органом.

MSO имеет следующую структуру CCDL:

   MobileSecurityObjectBytes = #6.24(bstr .cbor MobileSecurityObject)
   MobileSecurityObject = {
      "digestAlgorithm" : tstr,        ; Message digest algorithm used
      "valueDigests" : ValueDigests,   ; Array of digests of all data elements
      "deviceKeyInfo" : DeviceKeyInfo,
      "docType" : tstr,                ; DocType as used in Documents
      "validityInfo" : ValidityInfo
   }
   DeviceKeyInfo = {
      "deviceKey" : DeviceKey
      ? "keyAuthorizations" : KeyAuthorizations,
      ? "keyInfo" : KeyInfo
   }
   DeviceKey = COSE_Key                ; Device key in COSE_Key as defined in RFC 8152
   KeyAuthorizations = {
      ? "nameSpaces" : AuthorizedNameSpaces
      ? "dataElements" : AuthorizedDataElements
   }
   AuthorizedNameSpaces = [+ NameSpace]
   AuthorizedDataElements = {+ NameSpace => DataElementsArray}
   DataElementsArray = [+ DataElementIdentifier]
   KeyInfo = { * int => any}           ; Positive integers are RFU, negative integers may be used for proprietary use
   ValueDigests = {
      "nameSpaces" : NameSpacesDigests
   }
   NameSpacesDigests = {
      + NameSpace => DigestIDs
   }
   DigestIDs = {
      + DigestID => Digest
   }
   ValidityInfo = {
      "signed" : tdate,
      "validFrom" : tdate,
      "validUntil" : tdate,
      ? "expectedUpdate" : tdate
   }
   NameSpace = tstr                    ; NameSpace as used in IssuerSigned
   DigestID = uint                     ; DigestID as used in IssuerSig

Статические данные аутентификации

Статические данные аутентификации, которые включают в себя digestIdMapping , так и issuerAuth , должны быть созданы эмитентом.

digestIdMapping для определенного пространства имен состоит из массива экземпляров IssuerSignedItem , каждый из которых имеет нулевое значение для свойства elementValue . Кроме того, issuerAuth генерируется путем подписания MobileSecurityObjectBytes с помощью COSE_Sign1 .

   StaticAuthDataBytes = (bstr .cbor StaticAuthData)
   StaticAuthData = {
      "digestIdMapping" : DigestIdMapping,
      "issuerAuth" : IssuerAuth
   }
   DigestIdMapping = {
      NameSpace => [ + IssuerSignedItemBytes ]
   }
   ; Defined in ISO 18013-5
   ;
   NameSpace = String
   DataElementIdentifier = String
   DigestID = uint
   IssuerAuth = COSE_Sign1 ; The payload is MobileSecurityObjectBytes
   IssuerSignedItemBytes = #6.24(bstr .cbor IssuerSignedItem)
   IssuerSignedItem = {
      "digestID" : uint,                           ; Digest ID for issuer data auth
      "random" : bstr,                             ; Random value for issuer data auth
      "elementIdentifier" : DataElementIdentifier, ; Data element identifier
      "elementValue" : DataElementValue            ; Data element value
   }

При вызове конечной точки /provisionMobileSecurityObjects StaticAuthDataBytes шифруется с помощью HPKE и передается как часть ответа.

Ниже приведен пример кода для создания MSO и статических данных аутентификации.