Criptografia de ponta a ponta

Visão geral da HPKE

A criptografia de chave pública híbrida (HPKE, na sigla em inglês) é um mecanismo criptográfico usado para criptografar um payload em uma chave pública. Ela é chamada de "híbrida" porque o payload em si é criptografado com uma chave simétrica, e a HPKE deriva essa chave simétrica usando uma troca de chaves Diffie-Hellman.

Modos HPKE

  • Base:o modo mais comum.
  • Auth:usa a chave privada do remetente para autenticação.
  • PSK: usa uma chave pré-compartilhada de alta entropia para autenticação.
  • AuthPSK: combina a chave privada do remetente e uma chave pré-compartilhada de alta entropia para autenticação.

Interação no modo base (dispositivo e órgão emissor)

Confira um fluxo de alto nível que descreve um cenário em que um dispositivo quer enviar dados confidenciais a um órgão emissor.

Etapa 1: geração e troca de chaves

  • O órgão emissor cria um par de chaves de criptografia: IE₍ₚₖ, ₛₖ₎, em que ₚₖ é a chave pública e ₛₖ é a chave privada.
  • O órgão emissor envia e compartilha a chave pública (IEₚₖ) com o dispositivo.

Etapa 2: criptografar e enviar

O dispositivo executa Hybrid-Encrypt(Data, IEₚₖ, Context).

  • O dispositivo gera um par de chaves assimétricas temporárias para criptografia: ₍Eₚₖ, Eₛₖ₎.
  • Ele deriva uma chave AES simétrica, conhecida como chave secreta compartilhada (SS), usando a fórmula: SS = ExtractAndExpand(Diffie-Hellman(IEₚₖ, Eₛₖ), _Context).
  • O dispositivo criptografa os dados usando essa chave secreta compartilhada para produzir encData.
  • Ele compartilha { encData, Eₚₖ } e envia para o órgão emissor.

Etapa 3: descriptografar

O órgão emissor tem IE₍ₚₖ, ₛₖ₎ e o { encData, Eₚₖ } recebido. Ele executa Hybrid-Decrypt(encData, Eₚₖ, IEₛₖ, Context).

  • Ele deriva a chave AES simétrica (chave secreta compartilhada, SS) usando a fórmula: SS = ExtractAndExpand(Diffie-Hellman(IEₛₖ, Eₚₖ), _Context).
  • Ele descriptografa o encData usando SS.

Terminologia

Termo Definição e detalhes
DIₚₖ Cadeia de certificados de chave de credencial (certificados de identidade do dispositivo): uma cadeia de certificados X.509 para a CredentialKey que identifica a credencial para o órgão emissor.
  • Contém uma extensão de atestado do Android Keystore que descreve a chave e o hardware de segurança.
  • Usado para comprovar a propriedade da credencial.
  • O emissor PRECISA examinar cuidadosamente essa cadeia de certificados (por exemplo, verificar se o certificado raiz é conhecido, a presença de Tag::IDENTITY_CREDENTIAL_KEY, a presença de desafio, o Tag::ATTESTATION_APPLICATION_ID correto, a inicialização verificada ativada e o status de assinatura/revogação).
Aₚₖ Chaves de autenticação:chaves de autenticação X.509 dinâmicas que exigem certificação, cada uma assinada pela CredentialKey.
  • O emissor gera dados de autenticação estáticos para cada chave, envia para o dispositivo, e o dispositivo armazena esses dados usando storeStaticAuthenticationData.
  • Essa chave é um payload que será criptografado, não usado diretamente para a criptografia de ponta a ponta.
  • Os campos X.509 não opcionais incluem: versão (INTEGER 2), serialNumber (INTEGER 1), assinatura (ECDSA), assunto (CN definido como "Chave de autenticação de credencial de identidade do Android"), emissor (CN definido como "Chave de credencial de identidade do Android"), validade (hora atual até 365 dias no futuro) e subjectPublicKeyInfo (precisa conter a chave pública atestada).
IE₍ₛₖ,ₚₖ₎ Par de chaves de criptografia do emissor: uma chave assimétrica gerada pelo emissor. O dispositivo usa essa chave para realizar a criptografia híbrida para o emissor.
II₍ₛₖ,ₚₖ₎ Par de chaves de identidade do emissor: uma chave assimétrica gerada pelo emissor. O dispositivo usa essa chave para verificar a identidade do emissor.
DE₍ₛₖ,ₚₖ₎ Par de chaves de criptografia do dispositivo: uma chave assimétrica temporária gerada pelo dispositivo por solicitação. O emissor usa essa chave para realizar a criptografia híbrida para o dispositivo.
FE₍ₛₖ,ₚₖ₎ Chave de criptografia de campo: uma chave assimétrica temporária gerada por campo durante a criptografia híbrida.

Criptografia de ponta a ponta na API Provisioning Google Digital Identity

Etapa 1: receber a chave de identidade e a chave de criptografia do emissor

  • Endpoints da API: /getIdentityKey, /getHybridEncryptionKey.
  • Retorna: IIₚₖ, IEₚₖ.

Etapa 2: receber o nonce de registro do dispositivo

  • Gere um ID de referência do dispositivo (deviceReferenceId).
  • Endpoint da API: chame /getDeviceRegistrationNonce(deviceReferenceId).
  • Retorna: nonce.

Etapa 3: registrar o dispositivo

  • Configure a credencial de identidade do Android.
  • Chame IC.getCredentialKeyCertificateChain(nonce), que retorna um DIₚₖ incorporado ao nonce.
  • Endpoint da API: chame /registerDevice(deviceReferenceId, DIₚₖ).
  • O órgão emissor precisa examinar cuidadosamente essa cadeia de certificados para garantir que o certificado raiz seja conhecido, o desafio esteja presente, o ATTESTATION_APPLICATION_ID corresponda ao app esperado, a inicialização verificada esteja ativada, e as assinaturas ou revogações sejam válidas.
  • Retorna: ack.

Etapa 4a: enviar a solicitação de comprovação

  • Para cada campo:
    • Execute Hybrid-Encrypt(Data, IEₚₖ, Context=FieldName) para gerar encData e FEₚₖ.
    • Chame IC.proveOwnership(SHA-256(Data + IEₚₖ)) para receber sigData (uma estrutura de dados COSE_Sign1 assinada pela CredentialKey, com o payload definido como ProofofOwnership).
  • Endpoint da API: chame /proofUser([encData, sigData, FEₚₖ]).
  • O órgão emissor verifica sigData usando DIₚₖ.
  • O órgão emissor executa Hybrid-Decrypt(encData, FEₚₖ, IEₛₖ, Context=FieldName) para gerar Data.
  • Retorna: ack.

Etapa 4b: atualização do status de comprovação

  • Notifique o Google sobre uma atualização do status de comprovação usando deviceReferenceId e proofingId.
  • Endpoint da API: chame /notifyProofingStatusUpdateAvailable(...).
  • Os servidores do Google buscam o status de comprovação do emissor chamando /getProofingStatus(deviceReferenceId, proofingId).

Etapa 5: provisionar a credencial

  • Chame IC.proveOwnership(SHA-256(DEₚₖ)) para receber sigDEₚₖ (estrutura COSE_Sign1 assinada pela CredentialKey/DIₛₖ com o payload ProofofOwnership).
  • Endpoint da API: envie deviceReferenceId, proofingId, credentialId, e sigDEₚₖ ao emissor usando /provisionCredential(dRId, pId, cId, DEₚₖ, sigDEₚₖ).
  • Lado do emissor:
    • Verifique sigDEₚₖ com DIₚₖ.
    • Criptografe a credencial (PersonalizationData + AccessControlProfiles).
    • Execute Hybrid-Encrypt(Cred, DEₚₖ, Context=FieldName) para gerar encCred e FEₚₖ.
    • Crie sigCred assinando COSE_Sign1 SHA-256(Cred + DEₚₖ) com IIₛₖ.
    • Retorne encCred, sigCred, FEₚₖ.
  • Lado do dispositivo:
    • Verifique sigCred usando IIₚₖ.
    • Execute Hybrid-Decrypt(encCred, FEₚₖ, DEₛₖ, Context=FieldName) para extrair Cred.
    • Chame WC.personalize(Cred) para receber sigCredReceipt (COSE_Sign1 assinado pela CredentialKey, payload ProofOfProvisioning).
    • Execute Hybrid-Encrypt(sigCredReceipt, DEₛₖ, Context=FieldName) gerando encReceipt e FE1ₚₖ.
    • Chame IC.proveOwnership(SHA-256(encReceipt + IEₚₖ)) para receber sigReceipt (COSE_Sign1 assinado pela CredentialKey, payload ProofofOwnership).
    • Gere chaves de autenticação [Aₚₖ].

Etapa 6: gerar MSO e StaticAuthData

  • Lado do dispositivo:
    • Para cada chave de autenticação: execute Hybrid-Encrypt(AuthKey, IEₚₖ, Context=FieldName) para gerar encAuthKey e FEₚₖ.
    • Chame IC.proveOwnership(SHA-256(AuthKey + IEₚₖ)) para receber sigAuthKey.
    • Endpoint da API: chame /provisionMSOs(.., encReceipt, sigReceipt, [encAuthKey, sigAuthKey, FEₚₖ], DEₚₖ, sigDEₚₖ).
  • Lado do emissor:
    • Verifique sigReceipt e sigDEₚₖ em relação a DIₚₖ para verificar o recibo.
    • Para cada [encAuthKey, sigAuthKey, FEₚₖ]: execute Hybrid-Decrypt(encAuthKey, FEₚₖ, IEₛₖ, Context=FieldName) para extrair o AuthKey.
    • Gere o MSO (incluindo a AuthKey) e gere staticAuthData (SAD), incluindo o digestIdMapping e o issuerAuth.
    • Execute Hybrid-Encrypt(SAD, DEₚₖ, Context=FieldName) para gerar encSAD e FEₚₖ.
    • Assine usando COSE_Sign1 SHA-256(SAD + DEₚₖ) com IIₛₖ para produzir sigSAD.
    • Retorne [encSAD, sigSAD, FEₚₖ].
  • Lado do dispositivo (final)
    • Para cada encSAD, sigSAD, FEₚₖ retornado: verifique sigSAD com IIₚₖ.
    • Execute Hybrid-Decrypt(encSAD, FEₚₖ, DEₛₖ, Context=FieldName) para extrair SAD.
    • Chame storeStaticAuthenticationData com SAD para concluir o processo.

Requisitos de rotação

A chave de identidade do emissor precisa ser alterada uma vez por ano. Durante o período de rotação, o emissor precisa hospedar a chave antiga e a nova, e o dispositivo vai confiar nas duas. Depois que o emissor passar a usar completamente a nova chave de identidade, ele não vai mais hospedar a chave antiga e o dispositivo não vai confiar mais nela.

A chave de criptografia híbrida do emissor precisa ser alterada uma vez a cada três meses. Durante o período de rotação, o emissor vai hospedar apenas a chave nova, e o dispositivo vai começar a criptografar usando ela. O emissor precisa ser compatível com a descriptografia usando a chave antiga e a nova por um período razoável para evitar inatividade.

Valores de AAD

Use os seguintes valores de contexto para AAD.

Campos Valores de contexto
preAuthorizationCode PreAuthorizationCode

Para valores de AAD de outros tipos de evidência, entre em contato com seu representante do Google.

Vetores de teste para a criptografia de ponta a ponta de credenciais digitais

Os vetores de teste para a criptografia de ponta a ponta de IDs digitais são um conjunto de mensagens predefinidas e versões criptografadas delas que são usadas para testar a integridade do algoritmo de criptografia.

Parâmetros de criptografia HPKE:

  KEM = DHKEM(P-256, HKDF-SHA256), id = 0x0010
  KDF = HKDF-SHA256, id = 0x0001
  AEAD = AES-256-GCM, id = 0x0002
  • Os dados associados adicionais (AAD, na sigla em inglês) são uma entrada para HPKE CtxInfo, Os AAD para criptografia AES (simétrica) são NULL (vazios).
  • Os dados binários nas estruturas JSON são codificados em Base64. Os valores intermediários neste documento são codificados em hexadecimal.
  • Formato de assinatura nesta documentação:
    • Dispositivo → Emissor, Emissor → Dispositivo: COSE_Sign1

Cliente → Emissor, Emissor → Cliente

Exemplo de comunicação nas duas direções.

Exemplo de campo de solicitação criptografada

Texto simples = "Hello, world!", associated-data = "field1"

{
  "field1": {
    "encryptedValue": "yGFWT9MkgV6/IZfYUZjqGEf3k2M/HQhz9XnKWyI\u003d",
    "encapsulatedKey": "BOpBC2LGh1RWk99iIm6ISsaPbtrNnu9hIgHeby5khXY6PG+ZmDOYmorEUne7uzhDmD6JCVYyME1+A8ueJ0CZvAI\u003d",
    "signature": "hEOhASagWE+EcFByb29mT2ZPd25lcnNoaXB4GG9yZy5pc28uMTgwMTMtNS4yMDE5Lm1kbFggTOsHXzsgDgh/2chekltve8rJsFFb6DTtBjY98H58gjb0WEBUnwNT3gvbavE8QoaAKaELqF7JKqh0+ivPisQg6RerTmx8Zsk/tCjW/y1cxhGKatl2EjASemns67r1/lZumEqZ",
    "recipientKeyId": "4D7E5D8B9460810A"
  }
}

Análise detalhada:

>> plaintext = "Hello, world!"
48656C6C6F2C20776F726C6421

>> associated-data = "field1"
6669656C6431

## AES key = 
2831F07355FEAB3A8654EADEEC2E2D497B9FD3C76CB8B5E776DB03583F302332

## AES initialization vector = 
64620929032C85B352156528

## AES associated data (empty) = 

>> encrypted-value = HPKE(plaintext, associated-data)
C861564FD324815EBF2197D85198EA1847F793633F1D0873F579CA5B22

>> encapsulated-key (ephemeral) =
04EA410B62C687545693DF62226E884AC68F6EDACD9EEF612201DE6F2E648576
3A3C6F999833989A8AC45277BBBB3843983E89095632304D7E03CB9E274099BC
02

>> tbs-data = plaintext || issuer-encryption-key
48656C6C6F2C20776F726C6421044F1FC726AFFFC32EAA1275B5B49D67018ADE
7D8599DE53FE049996C0EC45D26EA3375BF467B631CF8AB0F284E4B628E287C8
99107465529DCA93DCF5F7A7EA5F

>> sha-256(tbs-data)
4CEB075F3B200E087FD9C85E925B6F7BCAC9B0515BE834ED06363DF07E7C8236

>> proof-of-ownership (cbor array)
847050726F6F664F664F776E65727368697078186F72672E69736F2E31383031
332D352E323031392E6D646C58204CEB075F3B200E087FD9C85E925B6F7BCAC9
B0515BE834ED06363DF07E7C8236F4

>> signature (cose_sign1)
8443A10126A0584F847050726F6F664F664F776E65727368697078186F72672E
69736F2E31383031332D352E323031392E6D646C58204CEB075F3B200E087FD9
C85E925B6F7BCAC9B0515BE834ED06363DF07E7C8236F45840549F0353DE0BDB
6AF13C42868029A10BA85EC92AA874FA2BCF8AC420E917AB4E6C7C66C93FB428
D6FF2D5CC6118A6AD9761230127A69ECEBBAF5FE566E984A99

Exemplo de chave de criptografia do emissor ou do dispositivo

{
  "deviceEncryptionKey": {
    "publicKey": "BP5vgzZ+UTozzb6cmaZ8tkof2nh2Q2oHVAsggvc8V8SR6C9wWU6W9JEq0AmsGbou3jYw4BLftJP2XQeCB3uD/to\u003d",
    "signature": "hEOhASagWE+EcFByb29mT2ZPd25lcnNoaXB4GG9yZy5pc28uMTgwMTMtNS4yMDE5Lm1kbFgg7641tE2UhuT5Tw9p1u9yEDpyYzDf1Jf9m//mIQfd4Kf0WEBB7PvHbfWozCYlFUqMJ6x+QWzoUU/OT10F1J1zoB8MTELPqfC9acF6IX5oMmsgLn2RtPS7QfylRqEAfG0FyYli",
    "keyIdentifier": "F29BA6298BC93156D2D50EA7E2233FC4"
  }
}

Análise detalhada:

>> ec-point
04FE6F83367E513A33CDBE9C99A67CB64A1FDA7876436A07540B2082F73C57C4
91E82F70594E96F4912AD009AC19BA2EDE3630E012DFB493F65D0782077B83FE
DA

>> sha-256(ec-point)
EFAE35B44D9486E4F94F0F69D6EF72103A726330DFD497FD9BFFE62107DDE0A7

>> proof-of-ownership (cbor array)
847050726F6F664F664F776E65727368697078186F72672E69736F2E31383031
332D352E323031392E6D646C5820EFAE35B44D9486E4F94F0F69D6EF72103A72
6330DFD497FD9BFFE62107DDE0A7F4

>> signature (cose_sign1)
8443A10126A0584F847050726F6F664F664F776E65727368697078186F72672E
69736F2E31383031332D352E323031392E6D646C5820EFAE35B44D9486E4F94F
0F69D6EF72103A726330DFD497FD9BFFE62107DDE0A7F4584041ECFBC76DF5A8
CC2625154A8C27AC7E416CE8514FCE4F5D05D49D73A01F0C4C42CFA9F0BD69C1
7A217E68326B202E7D91B4F4BB41FCA546A1007C6D05C98962

Certificados e chaves de teste

Você pode consultar as seguintes chaves de teste durante a implementação.

Chave de identidade (assinatura) do emissor do teste

  • Chave privada

    -----BEGIN PRIVATE KEY-----
    MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCBSDJqogkjkqD7O8mX5
    FcUvwOxFp0CxPOGnMD8BfSbcyw==
    -----END PRIVATE KEY-----

  • Certificado de chave pública

    -----BEGIN CERTIFICATE-----
    MIIBkDCCATegAwIBAgIIIi7oI6UIMEYwCgYIKoZIzj0EAwIwNzE1MDMGA1UEAxMs
    Ly9leHBlcmltZW50YWwvdXNlcnMvaWdhcmlldi9jcnlwdG86U2lnbkNlcnQwHhcN
    MjIxMjEyMjAyNDA0WhcNMjMxMjEyMjAyNDA0WjBSMQ8wDQYDVQQLEwZXYWxsZXQx
    DzANBgNVBAoTBkdvb2dsZTEuMCwGA1UEAxMlVEVTVCBEQVRBIElzc3VlciBJZGVu
    dGl0eSAoU2lnbmF0dXJlKTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHV9uYlT
    wGV3UB+SM62fXcW6QzFfSoxq2gU34xG+XVMjxk9JDP9UTE34zX72WIfZ9nqRN9y/
    SsbSxw5WrSQdGY2jEjAQMA4GA1UdDwEB/wQEAwIHgDAKBggqhkjOPQQDAgNHADBE
    AiBnMgsyJhdfelqpOFvT4H63dWSrNPxyrKEdxTwbYMfCKQIgOh2n2gCETH07tjxR
    l9HQfUcb6vqQY4EoPz2O0wNs6yc=
    -----END CERTIFICATE-----

Testar a chave de criptografia do emissor

  • Chave privada

    -----BEGIN PRIVATE KEY-----
    MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCDZMUnwmygUdKXSujXS
    ye7YbVnk1Zy/qwnQtzlZs3pQFQ==
    -----END PRIVATE KEY-----

  • Certificado de chave pública

    -----BEGIN CERTIFICATE-----
    MIIBpjCCAUygAwIBAgIIIVwLEOrrzm0wCgYIKoZIzj0EAwIwNzE1MDMGA1UEAxMs
    Ly9leHBlcmltZW50YWwvdXNlcnMvaWdhcmlldi9jcnlwdG86U2lnbkNlcnQwHhcN
    MjIxMjIyMjA1NzIzWhcNMjMxMjIyMjA1NzIzWjBIMQ8wDQYDVQQLEwZXYWxsZXQx
    DzANBgNVBAoTBkdvb2dsZTEkMCIGA1UEAxMbVEVTVCBEQVRBIElzc3VlciBFbmNy
    eXB0aW9uMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETx/HJq//wy6qEnW1tJ1n
    AYrefYWZ3lP+BJmWwOxF0m6jN1v0Z7Yxz4qw8oTktijih8iZEHRlUp3Kk9z196fq
    X6MxMC8wDgYDVR0PAQH/BAQDAgMYMB0GA1UdDgQWBBQKFb7K4eZjtp70DLoCHWe7
    v/toXzAKBggqhkjOPQQDAgNIADBFAiEAwN1gOwiSx3999Zxc980eKv3p2H8kA4J6
    9aWH6jiVaGMCIA7lLkebHFhD0fItGqXv1f5fwiMBV0605KZFh5+RBj/W
    -----END CERTIFICATE-----

Chave de identidade (assinatura) do dispositivo, também conhecida como chave de credencial

  • Cadeia de certificados de chave pública (X.509)
    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

Consulte a documentação de atestado de chaves do Android para mais detalhes.

Chave de criptografia do dispositivo

  • Chave privada

    -----BEGIN PRIVATE KEY-----
    MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCBJY8n7A1v+thMM63np
    m0wr+rAoMFEYmMZ+mWzBIj2CiQ==
    -----END PRIVATE KEY-----

  • Certificado de chave pública

    -----BEGIN CERTIFICATE-----
    MIIBhzCCAS2gAwIBAgIIAyJ+NkzueMUwCgYIKoZIzj0EAwIwNzE1MDMGA1UEAxMs
    Ly9leHBlcmltZW50YWwvdXNlcnMvaWdhcmlldi9jcnlwdG86U2lnbkNlcnQwHhcN
    MjMwMTA5MjMwOTIwWhcNMjQwMTA5MjMwOTIwWjBIMQ8wDQYDVQQLEwZXYWxsZXQx
    DzANBgNVBAoTBkdvb2dsZTEkMCIGA1UEAxMbVEVTVCBEQVRBIERldmljZSBFbmNy
    eXB0aW9uMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/m+DNn5ROjPNvpyZpny2
    Sh/aeHZDagdUCyCC9zxXxJHoL3BZTpb0kSrQCawZui7eNjDgEt+0k/ZdB4IHe4P+
    2qMSMBAwDgYDVR0PAQH/BAQDAgMYMAoGCCqGSM49BAMCA0gAMEUCIQD9syewRhvK
    KcyaM7fLwuuCidpiIVd/CZxFCLOo9adCPAIgNd3FMcT710KtYptJBZQ/i7N+C7G5
    pLbHmAUoFwNuB2E=
    -----END CERTIFICATE-----