Operações criptográficas: API GREP11

IBM Cloud® Hyper Protect Crypto Services fornece um conjunto de funções de criptografia que são executadas em um Hardware Security Module(HSM)A physical appliance that provides on-demand encryption, key management, and key storage as a managed service. na nuvem. É possível executar operações criptográficas acessando remotamente essas funções com as chamadas da API do Enterprise PKCS #11 (EP11) sobre gRPC (também referidas como GREP11).

Para obter mais informações sobre como as funções do GREP11 estão relacionadas ao PKCS #11 e ao EP11, consulte Introdução ao GREP11.

A API GREP11 pode processar até 500 solicitações / segundo para uma única unidade criptográfica

Acessando a API

Um terminal de API GREP11, uma chave de API de ID de serviço e um terminal do IAM são necessários para a inicialização antes de você executar quaisquer chamadas de função da API GREP11 Para obter mais informações, consulte Gerando uma solicitação de API do GREP11.

Manipulação de erros

GREP11 conta com a especificação gRPC para manipulação de erro Quando ocorre um erro, os clientes do gRPC recebem um message Status buffer de protocolo

message Status {
    int32 code = 1;
    string message = 2;
    repeated google.protobuf.Any details = 3;
}

Na mensagem de erro,

  • code inclui o código de status, que precisa ser um valor do tipo enumerado (enumeração) do campo google.rpc.Code.
  • message inclui uma mensagem de erro voltada ao desenvolvedor em inglês. Qualquer mensagem de erro direcionada ao usuário precisa ser localizada e enviada no campo google.rpc.Status.details ou localizada pelo usuário.
  • details lista mensagens que transportam os detalhes do erro. Um conjunto comum de tipos de mensagens está disponível para ser usado pela API.

O GREP11 usa o campo Detail para anexar informações de código de erro adicionais.

message Grep11Error {
    uint64 Code = 1;
    string Detail = 2;
    bool Retry = 3;
}

O campo Code pode ser convertido para o valor CK_RV em PKCS #11. Esse campo contém os códigos de erros definidos pela especificação PKCS #11 ou as extensões do fornecedor definidas por EP11. O EP11 usa somente um subconjunto de valores de retorno que o PKCS #11 define. Para obter mais informações, consulte a seção 10.1.6 Valores de retorno na Estrutura de biblioteca do Enterprise PKCS n° 11.

Um exemplo em Golang que lida com erros está disponível..

Lista de funções do GREP11

As funções PKCS #11 que são marcadas com um asterisco (*) na tabela são implementadas por EP11 sobre o gRPC. Outras não são implementadas.

Tabela 1. Descreve as funções implementadas em EP11 sobre gRPC
PKCS nº 11 Enterprise PKCS #11 Enterprise PKCS #11 sobre gRPC Descrição
C_Initialize N/A N/A Inicializa Cryptoki.
C_Finalize N/A N/A Limpa recursos variados associados do Cryptoki.
C_GetInfo N/A N/A Obtém informações gerais sobre Cryptoki.
C_GetFunctionList N/A N/A Obtém pontos de entrada de funções de biblioteca do Cryptoki.
C_GetSlotList N/A N/A Obtém uma lista de intervalos no sistema.
C_GetSlotInfo N/A N/A Obtém informações sobre um intervalo específico.
C_GetTokenInfo N/A N/A Obtém informações sobre um token específico.
C_WaitForSlotEvent N/A N/A Aguarda um evento de slot (inserção de token, remoção de token e assim por diante) ocorrer.
C_GetMechanismList* m_GetMechanismList GetMechanismList Obtém uma lista de mecanismos suportados por um token.
C_GetMechanismInfo* m_GetMechanismInfo GetMechanismInfo Obtém informações sobre um mecanismo específico.
C_InitToken N/A N/A Inicializa um token.
C_InitPIN N/A N/A Inicializa o PIN do usuário normal.
C_SetPIN N/A N/A Modifica o PIN do usuário atual.
C_OpenSession N/A N/A Abre uma conexão entre um aplicativo e um token específico ou configura um retorno de chamada de aplicativo para inserção de token.
C_CloseSession N/A N/A Fecha uma sessão.
C_CloseAllSessions N/A N/A Fecha todas as sessões com um token.
C_GetSessionInfo N/A N/A Obtém informações sobre a sessão.
C_GetOperationState N/A N/A Obtém o estado de operações criptográficas de uma sessão.
C_SetOperationState N/A N/A Configura o estado de operações criptográficas de uma sessão.
C_Login N/A N/A Efetua login em um token.
C_Logout N/A N/A Efetua logout de um token.
C_CreateObject N/A N/A Cria um objeto.
C_CopyObject N/A N/A Cria uma cópia de um objeto.
C_DestroyObject N/A N/A Destrói um objeto.
C_GetObjectSize N/A N/A Obtém o tamanho de um objeto em bytes.
C_GetAttributeValue* m_GetAttributeValue GetAttributeValue Obtém um valor de atributo de um objeto.
C_SetAttributeValue* m_SetAttributeValue SetAttributeValue Modifica um valor de atributo de um objeto. Apenas atributos booleanos podem ser modificados.
C_FindObjectsInit N/A N/A Inicializa uma operação de procura de objeto.
C_FindObjects N/A N/A Continua uma operação de procura de objeto.
C_FindObjectsFinal N/A N/A Conclui uma operação de procura de objeto.
C_EncryptInit* m_EncryptInit EncryptInit Inicializa uma operação de criptografia.
C_Encrypt* m_Encrypt Encrypt Criptografa dados de parte única.
C_EncryptUpdate* m_EncryptUpdate EncryptUpdate Continua uma operação de criptografia de múltiplas partes.
C_EncryptFinal* m_EncryptFinal EncryptFinal Conclui uma operação de criptografia de múltiplas partes.
N/A m_EncryptSingle EncryptSingle Extensão do IBM, variante não padrão de Encrypt. Processa dados em uma passagem, com uma chamada. Não retorna nenhum estado para hospedar diferente dos dados criptografados.
N/A m_ReencryptSingle ReencryptSingle Extensão do IBM, variante não padrão de Encrypt. Decriptografa dados com a chave original e criptografa os dados brutos com uma chave diferente em uma única chamada do HSM em nuvem. Não retorna nenhum estado a ser hospedado, exceto os dados recriptografados.
C_DecryptInit* m_DecryptInit DecryptInit Inicializa uma operação de decriptografia.
C_Decrypt* m_Decrypt Decrypt Decriptografa dados criptografados de parte única.
C_DecryptUpdate* m_DecryptUpdate DecryptUpdate Continua uma operação de decriptografia de múltiplas partes.
C_DecryptFinal* m_DecryptFinal DecryptFinal Conclui uma operação de decriptografia de múltiplas partes.
N/A m_DecryptSingle DecryptSingle Extensão do IBM, variante não padrão de Decrypt. Processa dados em uma passagem, com uma chamada. Não retorna nenhum estado para hospedar diferente de dados decriptografados.
C_DigestInit* m_DigestInit DigestInit Inicializa uma operação de compilação de mensagem.
C_Digest* m_Digest Compilação Compila dados de parte única. O comprimento dos dados de entrada não pode ser zero e o ponteiro que aponta para o local dos dados de entrada não pode ser NULL.
C_DigestUpdate* m_DigestUpdate DigestUpdate Continua uma operação de compilação de múltiplas partes. O comprimento dos dados de entrada não pode ser zero e o ponteiro que aponta para o local dos dados de entrada não pode ser NULL.
C_DigestKey N/A N/A Compila uma chave.
C_DigestFinal* m_DigestFinal DigestFinal Conclui uma operação de compilação de múltiplas partes.
N/A m_DigestSingle DigestSingle Extensão IBM, extensão não padrão, combinação de DigestInit e Digest. Compila dados em uma passagem, com uma chamada, sem construir um estado de compilação intermediário e roundtrips desnecessárias
C_SignInit* m_SignInit SignInit Inicializa uma operação de assinatura.
C_Sign* m_Sign Assinar Assina dados de parte única.
C_SignUpdate* m_SignUpdate SignUpdate Continua uma operação de assinatura de múltiplas partes.
C_SignFinal* m_SignFinal SignFinal Conclui uma operação de assinatura de múltiplas partes.
C_SignRecoverInit N/A N/A Inicializa uma operação de assinatura na qual os dados são recuperados da assinatura.
C_SignRecover N/A N/A Assina dados de parte única, nos quais os dados são recuperados da assinatura.
N/A m_SignSingle SignSingle Extensão IBM, extensão não padrão, combinação de SignInit e Sign. Assinaturas ou dados de MACs em uma passagem, com uma chamada, sem construir o estado de compilação intermediária. Não retorna nenhum estado para hospedar diferente do resultado.
C_VerifyInit* m_VerifyInit VerifyInit Inicializa uma operação de verificação.
C_Verify* m_Verify Verificar Verifica uma assinatura em dados de parte única.
C_VerifyUpdate* m_VerifyUpdate VerifyUpdate Continua uma operação de verificação de múltiplas partes.
C_VerifyFinal* m_VerifyFinal VerifyFinal Conclui uma operação de verificação de múltiplas partes.
C_VerifyRecoverInit N/A N/A Inicializa uma operação de verificação na qual os dados são recuperados da assinatura.
C_VerifyRecover N/A N/A Verifica uma assinatura em dados de parte única, em que os dados são recuperados da assinatura.
N/A m_VerifySingle VerifySingle Extensão IBM, extensão não padrão, combinação de VerifyInit e Verify. Assinaturas ou dados de MACs em uma passagem, com uma chamada, sem construir o estado de compilação intermediária. Não retorna nenhum estado para hospedar diferente do resultado de verificação.
C_DigestEncryptUpdate N/A N/A Continua operações simultâneas de criptografia e de compilação de múltiplas partes.
C_DecryptDigestUpdate N/A N/A Continua operações simultâneas de decriptografia e de compilação de múltiplas partes.
C_SignEncryptUpdate N/A N/A Continua operações simultâneas de assinatura e de criptografia de múltiplas partes.
C_DecryptVerifyUpdate N/A N/A Continua operações simultâneas de decriptografia e de verificação de múltiplas partes.
C_GenerateKey* m_GenerateKey GenerateKey Gera uma chave secreta.
C_GenerateKeyPair* m_GenerateKeyPair GenerateKeyPair Gera um par de chaves publicas e chaves privadas.
C_WrapKey* m_WrapKey WrapKey Agrupa (criptografa) uma chave.
C_UnwrapKey* m_UnwrapKey UnwrapKey Desagrupa (decriptografa) uma chave.
N/A N/A RewrapKeyBlob Transfere a propriedade de um BLOB controlado pela chave mestra atual para a nova chave mestra quando ela é confirmada. Essa função é um comando de administração especial suportado apenas por GREP11.
C_DeriveKey* m_DeriveKey DeriveKey Deriva uma chave de uma chave base.
C_SeedRandom N/A N/A Inclui material de valor inicial no gerador de números aleatórios.
C_GenerateRandom* m_GenerateRandom GenerateRandom Gera dados aleatórios. O comprimento dos dados aleatórios não pode ser zero e o ponteiro que aponta para o local dos dados aleatórios não pode ser NULL. O comprimento máximo dos dados aleatórios que podem ser solicitados é 1 milhão de bytes.
C_GetFunctionStatus N/A N/A Função legada que sempre retorna CKR_FUNCTION_NOT_PARALLEL.
C_CancelFunction N/A N/A Função legada que sempre retorna CKR_FUNCTION_NOT_PARALLEL.

Mecanismos suportados

Um mecanismo é referido como um processo para implementar uma operação criptográfica. Ele pode variar dependendo do nível de firmware no cartão de criptografia. A tabela a seguir mostra os mecanismos que são suportados atualmente e como eles estão relacionados às categorias de funções comuns do GREP11.

Tabela 2. Descreve os mecanismos suportados GREP11
Grupo de funções Mecanismos suportados
Criptografar e decriptografar CKM_RSA_PKCS1, CKM_RSA_PKCS_OAEP1, CKM_AES_ECB, CKM_AES_CBC, CKM_AES_CBC_PAD, CKM_DES3_ECB, CKM_DES3_CBC, CKM_DES3_CBC_PAD
Assinar e verificar CKM_RSA_PKCS1, CKM_RSA_PKCS_PSS1, CKM_RSA_X9_311, CKM_SHA1_RSA_PKCS, CKM_SHA256_RSA_PKCS, CKM_SHA224_RSA_PKCS, CKM_SHA384_RSA_PKCS, CKM_SHA512_RSA_PKCS, CKM_SHA1_RSA_PKCS_PSS, CKM_SHA224_RSA_PKCS_PSS, CKM_SHA256_RSA_PKCS_PSS, CKM_SHA384_RSA_PKCS_PSS, CKM_SHA512_RSA_PKCS_PSS, CKM_SHA1_RSA_X9_31, CKM_DSA1, CKM_DSA_SHA1, CKM_ECDSA1, CKM_ECDSA_SHA1, CKM_ECDSA_SHA224, CKM_ECDSA_SHA256, CKM_ECDSA_SHA384, CKM_ECDSA_SHA512, CKM_SHA1_HMAC, CKM_SHA256_HMAC, CKM_SHA384_HMAC, CKM_SHA512_HMAC, CKM_SHA512_224_HMAC, CKM_SHA512_256_HMAC, CKM_IBM_ED25519_SHA5124, CKM_IBM_ECDSA_OTHER2, CKM_IBM_DILITHIUM3
Compilação CKM_SHA_1, CKM_SHA224, CKM_SHA256, CKM_SHA384, CKM_SHA512, CKM_SHA512_224, CKM_SHA512_256
Gerar chave ou gerar par de chaves CKM_RSA_PKCS_KEY_PAIR_GEN, CKM_RSA_X9_31_KEY_PAIR_GEN, CKM_DSA_KEY_PAIR_GEN, CKM_DSA_PARAMETER_GEN, CKM_EC_KEY_PAIR_GEN (CKM_ECDSA_KEY_PAIR_GEN), CKM_DH_PKCS_KEY_PAIR_GEN, CKM_DH_PKCS_PARAMETER_GEN, CKM_GENERIC_SECRET_KEY_GEN, CKM_AES_KEY_GEN, CKM_DES2_KEY_GEN, CKM_DES3_KEY_GEN, CKM_IBM_DILITHIUM
Agrupar e desagrupar CKM_RSA_PKCS, CKM_RSA_PKCS_OAEP, CKM_AES_ECB, CKM_AES_CBC, CKM_AES_CBC_PAD, CKM_DES3_ECB, CKM_DES3_CBC, CKM_DES3_CBC_PAD
Derivar CKM_ECDH1_DERIVE, CKM_DH_PKCS_DERIVE, CKM_DES3_ECB_ENCRYPT_DATA, CKM_SHA1_KEY_DERIVATION, CKM_SHA224_KEY_DERIVATION, CKM_SHA256_KEY_DERIVATION, CKM_SHA384_KEY_DERIVATION, CKM_SHA512_KEY_DERIVATION, CKM_IBM_BTC_DERIVE

1: este mecanismo suporta apenas operações de parte única que não são capazes de utilizar qualquer uma das funções de atualização do GREP11, como EncryptUpdate, DecryptUpdate e DigestUpdate.

2: este mecanismo está disponível apenas para as operações SignSingle e VerifySingle do GREP11.

3: Esse mecanismo não é suportado pelo cartão de criptografia IBM 4768 e não está disponível para operações SignUpdate e VerifyUpdate.

4: esse mecanismo suporta operações de parte única (SignInit, Sign, VerifyInit, Verify), SignSingle e VerifySingle

Atributos suportados e tipos de chave

Os atributos GREP11 definem características de objeto que configuram como um objeto pode ser usado e acessado. A tabela a seguir mostra os atributos suportados e a sua relação com os vários tipos de chave suportados.

Tabela 3. Descreve os atributos suportados
Atributo Descrição Tipos de chave suportados
CKA_CHECK_VALUE A soma de verificação da chave Chaves do AES, chaves do DES
CKA_COPYABLE Se configurado como CKA_TRUE, o objeto poderá ser copiado usando a função PKCS#11 C_CopyObject Chaves privadas do EC, chaves públicas do EC, chaves privadas do RSA, chaves públicas do RSA, chaves privadas do DH, chaves públicas do DH, chaves privadas do DSA, chaves públicas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_DECRYPT CK_TRUE se a chave suporta decriptografia. Chaves privadas do EC, chaves privadas do RSA, chaves privadas do DH, chaves privadas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_DERIVE CK_TRUE se a chave suporta derivação de chave (outras chaves podem ser derivadas dessa chave). O padrão é CK_FALSE. Chaves privadas do EC, chaves públicas do EC, chaves privadas do RSA, chaves públicas do RSA, chaves privadas do DH, chaves públicas do DH, chaves privadas do DSA, chaves públicas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_EC_PARAMS (CKA_ECDSA_PARAMS) Codificação de DER de um valor dos Parâmetros ANSI X9.62. Chaves privadas do EC, chaves públicas do EC
CKA_ENCRYPT CK_TRUE se a chave der suporte à criptografia. Chaves públicas do EC, chaves públicas do RSA, chaves públicas do DH, chaves públicas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_EXTRACTABLE CK_TRUE se a chave for extraível e puder ser agrupada. Chaves privadas do EC, chaves privadas do RSA, chaves privadas do DH, chaves privadas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_IBM_PQC_PARAMS Parâmetros de apoio para mecanismos de criptografia pós-quantum. No caso do mecanismo Dilithium CKM_IBM_DILITHIUM, ele fornece um identificador de objeto serializado (OID) que representa a intensidade do algoritmo Dilithium a usar. Atualmente, apenas a força de Dilithium 4 round 2 é suportada. Chaves de Dilithium
CKA_KEY_TYPE Tipo de chave. Chaves privadas do EC, chaves públicas do EC, chaves privadas do RSA, chaves públicas do RSA, chaves privadas do DH, chaves públicas do DH, chaves privadas do DSA, chaves públicas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_LOCAL CK_TRUE apenas se a chave foi gerada localmente (no token) com uma chamada de C_GenerateKey ou C_GenerateKeyPair ou criada com uma chamada de C_CopyObject como uma cópia de uma chave, que teve seu atributo CKA_LOCAL configurado como CK_TRUE. Chaves privadas do EC, chaves públicas do EC, chaves privadas do RSA, chaves públicas do RSA, chaves privadas do DH, chaves públicas do DH, chaves privadas do DSA, chaves públicas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_MODIFICÁVEL Configure como CK_TRUE se o objeto pode ser modificado. Chaves privadas do EC, chaves públicas do EC, chaves privadas do RSA, chaves públicas do RSA, chaves privadas do DH, chaves públicas do DH, chaves privadas do DSA, chaves públicas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_MODULUS_BITS Comprimento em bits do módulo n. Chaves públicas do RSA
CKA_PUBLIC_EXPONENT Expoente público e. Chaves privadas do RSA
CKA_PUBLIC_KEY_INFO Codificação DER do SubjectPublicKeyInfo para a chave pública O valor é derivado dos dados de chave pública subjacentes e está vazio por padrão. Chaves públicas RSA, chaves públicas EC
CKA_SIGN CK_TRUE se a chave suporta assinaturas em que a assinatura é um apêndice para os dados. Chaves privadas do EC, chaves privadas do RSA, chaves privadas do DH, chaves privadas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_TRUSTED O certificado ou chave pode ser confiável para o aplicativo que foi criado. Chaves públicas do EC, chaves públicas do RSA, chaves públicas do DH, chaves públicas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_UNWRAP CK_TRUE se a chave suporta desagrupamento (pode ser usado para desagrupar outras chaves). Chaves privadas do EC, chaves privadas do RSA, chaves privadas do DH, chaves privadas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_VALUE_LEN Comprimento em bytes de valor da chave. Chaves do AES
CKA_VERIFY CK_TRUE se a chave suporta verificação em que a assinatura é um apêndice para os dados. Chaves públicas do EC, chaves públicas do RSA, chaves públicas do DH, chaves públicas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_WRAP CK_TRUE se a chave suporta agrupamento (pode ser usado para agrupar outras chaves). Chaves públicas do EC, chaves públicas do RSA, chaves públicas do DH, chaves públicas do DSA, chaves do AES, chaves do DES, chaves genéricas
CKA_WRAP_WITH_TRUSTED CK_TRUE se a chave pode ser agrupada apenas com uma chave de agrupamento que tenha o CKA_TRUSTED configurado para CK_TRUE. O padrão é CK_FALSE. Chaves privadas do EC, chaves privadas do RSA, chaves privadas do DH, chaves privadas do DSA, chaves do AES, chaves do DES, chaves genéricas

Curvas suportadas

A biblioteca do EP11 suporta tipos limitados de curvas para determinados mecanismos. A tabela a seguir lista os nomes de curvas suportadas para diferentes mecanismos. O número no nome da curva significa a contagem principal de bits suportada.

Curvas suportadas para a geração de chaves de Curva Elíptica (CE)

O mecanismo CKM_EC_KEY_PAIR_GEN é suportado quando a função GenerateKeyPair é chamada para gerar chaves de Curva Elíptica (CE). Os parâmetros do nome da curva devem ser especificados como identificadores de objetos (OIDs) usando CKA_EC_PARAMS. É possível obter o OID procurando o nome da curva no repositório OID.

Tabela 4. Tipos de curva suportados para gerar chaves EC
Mecanismo do GREP11 Tipos de curva suportados Nomes de curva suportados
CKM_EC_KEY_PAIR_GEN Curvas do National Institute of Standards and Technology(NIST)
  • P-192, conhecido como secp192r1 e prime192v1.
  • P-224, conhecido como secp224r1.
  • P-256, conhecido como secp256r1 e prime256v1.
  • P-384, conhecido como secp384r1.
  • P-521, conhecido como secp521r.
CKM_EC_KEY_PAIR_GEN Curvas regulares de pool cerebral(BP)
  • BP-160R, conhecido como brainpoolP160r1.
  • BP-192R, conhecido como brainpoolP192r1.
  • BP-224R, conhecido como brainpoolP224r1.
  • BP-256R, conhecido como brainpoolP256r1.
  • BP-320R, conhecido como brainpoolP320r1.
  • BP-384R, conhecido como brainpoolP384r1.
  • BP-512R, conhecido como brainpoolP512r1.
CKM_EC_KEY_PAIR_GEN Twisted Brain pool(BP)curvas
  • BP-160T, conhecido como brainpoolP160t1.
  • BP-192T, conhecido como brainpoolP192t1.
  • BP-224T, conhecido como brainpoolP224t1.
  • BP-256T, conhecido como brainpoolP256t1.
  • BP-320T, conhecido como brainpoolP320t1.
  • BP-384T, conhecido como brainpoolP384t1.
  • BP-512T, conhecido como brainpoolP512t1.
CKM_EC_KEY_PAIR_GEN Curvas de Cryptography Eficiente(SEC)
  • secp256k1
CKM_EC_KEY_PAIR_GEN Curvas de Edwards
  • Ed25519

Curvas suportadas para criptografar ativos digitais e gerar assinaturas

As curvas a seguir são suportadas para mecanismos relacionados ao ativo digital e à assinatura digital.

Tabela 5. Tipos de curva suportados para criptografar ativos digitais e assinaturas
Padrão e esquema Mecanismo do GREP11 Tipos de curva suportados Nomes de curva suportados
BIP32/BIP44 CKM_IBM_BTC_DERIVE Curvas de Cryptography Eficiente(SEC)
  • secp256k1
SLIP10 CKM_IBM_BTC_DERIVE Curvas do National Institute of Standards and Technology(NIST)
  • P-256, também conhecido como secp256r1 e prime256v1
SLIP10 CKM_IBM_BTC_DERIVE Curvas de Cryptography Eficiente(SEC)
  • secp256k1
SLIP10 CKM_IBM_BTC_DERIVE Curvas de Edwards
  • Ed25519
EdDSA CKM_IBM_ED25519_SHA512 Curvas de Edwards
  • Ed25519
Schnorr CKM_IBM_ECDSA_OTHER Curvas de Cryptography Eficiente(SEC)
  • secp256k1
Schnorr CKM_IBM_ECDSA_OTHER Curvas do National Institute of Standards and Technology(NIST)
  • P-256, também conhecido como secp256r1 e prime256v1
Schnorr CKM_IBM_ECDSA_OTHER Curvas regulares de pool cerebral(BP)
  • BP-256R, também conhecido como brainpoolP256r1
Schnorr CKM_IBM_ECDSA_OTHER Twisted Brain pool(BP)curvas
  • BP-256T, também conhecido como brainpoolP256t1
Schnorr ECSG_IBM_ECSDSA_S256
  • secp256r1
  • secp256k1
  • BP-256R, também conhecido como brainpoolP256r1
  • BP-256T, também conhecido como brainpoolP256t1
Schnorr-Zilliqa ECSG_IBM_ECSDSA_COMPR_MULTI
  • secp256r1
  • secp256k1
  • BP-256R, também conhecido como brainpoolP256r1
  • BP-256T, também conhecido como brainpoolP256t1

Executando operações criptográficas com funções do GREP11

É possível realizar operações criptográficas chamando funções do GREP11 que são definidas com base na implementação do EP11 da especificação PKCS n.º 11. As seguintes descrições de função são criadas com base na especificação PKCS #11, com notas específicas para EP11. Todas as definições de parâmetro estão no formulário original do EP11. Para obter mais informações sobre EP11, consulte Enterprise PKCS #11(EP11)Library structure.

Os parâmetros de função do EP11 são mapeados para os tipos de buffer de protocolo que podem ser localizados nas funções a seguir. É possível aprender mais sobre os tipos de buffer de protocolo no Google Developers

Como a biblioteca EP11 é um subconjunto da biblioteca de APIs do PKCS #11, e as funções do GREP11 são variantes das funções do EP11 correspondentes, as funções correspondentes de EP11 e PKCS #11 também são listadas nas tabelas de função do GREP11 para sua referência.

O GREP11 suporta qualquer linguagem de programação com uma biblioteca gRPC. No estágio atual, somente fragmentos de código ou exemplos para Golang e JavaScript estão incluídos na referência de API. O conteúdo é enriquecido em fases posteriores. Os fragmentos de código são baseados nos repositórios do GitHub externos a seguir que fornecem exemplos completos para o uso da API do GREP11. Alguns dos fragmentos de código fazem referência às funções de auxiliar dentro dos repositórios de exemplos.

Recuperando algoritmos criptográficos suportados 

É possível usar as funções a seguir para recuperar algoritmos ou mecanismos criptográficos que são suportados pelo GREP11. Com essas informações, é possível entender os mecanismos específicos que podem ser configurados ao chamar uma função. Para a lista completa de mecanismos suportados, é também possível consultar os mecanismos categorizados por grupos de função.

GetMechanismList

A função GetMechanismList obtém uma lista de tipos de mecanismo que são suportados por um token.

Descrição Liga-se a EP11 m_GetMechanismList, que é uma implementação de C_GetMechanismList de PKCS #11.
Parâmetros
    message GetMechanismListRequest {
    }
    message GetMechanismListResponse {
      repeated uint64 Mechs = 2;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição Implementação de C_GetMechanismList de PKCS #11.
Parâmetros
    CK_RV m_GetMechanismList (
      Intervalo CK_SLOT_ID,
      CK_MECHANISM_TYPE_PTR mechs, CK_ULONG_PTR mechslen,
      destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_GetMechanismList. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_GetMechanismList é usado para obter uma lista de tipos de mecanismos suportados por um token. SlotID é o ID do slot do token e pulCount aponta para o local que recebe o número de mecanismos.

Duas maneiras estão disponíveis para um aplicativo chamar C_GetMechanismList:

  1. Se pMechanismList for NULL_PTR, a única coisa que o C_GetMechanismList fará é retornar (em *pulCount) o número de mecanismos, sem retornar uma lista de mecanismos. O conteúdo de *pulCount na entrada para C_GetMechanismList não tem significado nesse caso e a chamada retorna o valor CKR_OK.
  2. Se pMechanismList não for NULL_PTR, *pulCount deverá conter o tamanho (em termos de elementos CK_MECHANISM_TYPE) do buffer apontado por pMechanismList. Se esse buffer for grande o suficiente para conter a lista de mecanismos, a lista será retornada nele e CKR_OK será retornado. Caso contrário, a chamada para C_GetMechanismList retornará o valor CKR_BUFFER_TOO_SMALL. Em qualquer caso, o valor *pulCount é configurado para conter o número de mecanismos.

Uma vez que C_GetMechanismList não aloca nenhum espaço próprio, um aplicativo muitas vezes chama C_GetMechanismList duas vezes. No entanto, esse comportamento não é necessário.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_GetMechanismList)(
      CK_SLOT_ID slotID,
      CK_MECHANISM_TYPE_PTR pMechanismList,
      CK_ULONG_PTR pulCount
    );
    
Valores de retorno CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_SLOT_ID_INVALID, CKR_TOKEN_NOT_PRESENT, CKR_TOKEN_NOT_RECOGNIZED, CKR_ARGUMENTS_BAD.

Snnipets de código

  • Fragmento de código de Golang

    GetMechanismListRequest := &pb.GetMechanismListRequest {
    }
    
    GetMechanismListResponse, err := cryptoClient.GetMechanismList(context.Background(), GetMechanismListRequest)
    
  • fragmento de código JavaScript

    client.GetMechanismList({}, (err, data) => {
      if (err) throw err;
    
      console.log('MECHANISMS:', data.Mechs);
    });
    

GetMechanismInfo

A função GetMechanismInfo obtém informações sobre um mecanismo específico.

Descrição Liga-se a EP11 m_GetMechanismInfo, que é uma implementação de C_GetMechanismInfo de PKCS #11.
Parâmetros
    message GetMechanismInfoRequest {
      uint64 Mech = 2;
    }
    message GetMechanismInfoResponse {
      MechanismInfo MechInfo = 3;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição Implementação de C_GetMechanismInfo de PKCS #11.
Parâmetros
    CK_RV m_GetMechanismInfo (
      Intervalo CK_SLOT_ID,
      CK_MECHANISM_TYPE mech,
      CK_MECHANISM_INFO_PTR mechInfo,
      destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_GetMechanismInfo. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_GetMechanismInfo obtém informações sobre um determinado mecanismo que pode ser suportado por um token. slotID é o ID do slot do token, type é o tipo de mecanismo, pInfo aponta para o local que recebe as informações do mecanismo.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_GetMechanismInfo)(
      CK_SLOT_ID slotID,
      CK_MECHANISM_TYPE type,
      CK_MECHANISM_INFO_PTR pInfo
    );
    
Valores de retorno CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_MECHANISM_INVALID, CKR_OK, CKR_SLOT_ID_INVALID, CKR_TOKEN_NOT_PRESENT, CKR_TOKEN_NOT_RECOGNIZED, CKR_ARGUMENTS_BAD.

Snnipets de código

  • Fragmento de código de Golang

    GetMechanismInfoRequest := &pb.GetMechanismInfoRequest {
        Mech: ep11.CKM_RSA_PKCS,
    }
    
    GetMechanismInfoResponse, err := cryptoClient.GetMechanismInfo(context.Background(), GetMechanismInfoRequest)
    
  • fragmento de código JavaScript

    client.GetMechanismInfo({
      Mech: ep11.CKM_AES_KEY_GEN
      }, (err, data) => {
        if (err) throw err;
    
        console.log('MECHANISM INFO:', data.MechInfo);
    });
    

Gerando e derivando chaves

O GREP11 fornece as funções a seguir para gerar chaves criptográficas simétricas e assimétricas. Com base no mecanismo e no comprimento de chave que você especificar, é possível gerar vários tipos de chaves para vários usos. Também é possível derivar uma chave de uma chave base para estender chaves para chaves mais longas ou para obter chaves de um formato necessário.

GenerateKey

A função GenerateKey gera uma chave secreta para a criptografia simétrica.

Descrição Liga-se a EP11 m_GenerateKey, que é uma implementação de C_GenerateKey de PKCS #11.
Parâmetros
    message GenerateKeyRequest {
      Mechanism Mech = 1;
      map<uint64,AttributeValue> Template = 6;
    }
    message GenerateKeyResponse {
      bytes KeyBytes = 4;
      bytes CheckSum = 5;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_GenerateKey de PKCS #11.

As chaves do TDES são geradas com paridade adequada, o que não é observável pelo host. Mas é necessário para uma interoperabilidade adequada: outras implementações do PKCS n° 11 precisam rejeitar chaves do DES com problemas de paridade.

Se um objeto estiver vinculado a uma sessão, (pin, plen) ele deve retornar pelo Login a essa sessão. Deixar pinNULL cria um objeto público, não ligado a uma sessão de login.

(key, klen) retorna o blob da chave. (csum, clen) contém a soma de verificação da chave, ou seja, os bytes mais significativos de um bloco all-zero criptografado pela chave. NULL clen é possível, por exemplo, para mecanismos de chave simétricos sem os parâmetros CKA_CHECK_VALUE (como o RC4).

ptempl será usado somente se o comprimento da chave (ou seja, o atributo CKA_VALUE_LEN) for necessário para o mecanismo. Se o mecanismo especificar implicitamente o tamanho da chave, ptempl não será verificado quanto ao tamanho.

A geração de parâmetro DSA e DH ignora (csum, clen), gerando somente estruturas de parâmetro.

Parâmetros DSA, DH (CKM_DSA_PARAMETER_GEN): contagem de bits do módulo aprovado em CKA_PRIME_BITS de atributos. Escreve P, Q, G estrutura como saída de texto cleartext (isto é, não um blob).

O blob pin era saída de: Login.

O PKCS nº11 phKey não está mapeado para nenhum parâmetro EP11. (A biblioteca do host deve ligar a chave agrupada para manipular.)

Parâmetros
    CK_RV m_GenerateKey (
      Mecanismo CK_MECHANISM_PTR,
      Modelo CK_ATTRIBUTE_PTR, CK_ULONG templatelen,
      const unsigned char *pin, size_t pinlen,
      unsigned char * key, size_t * keylen,
      caractere não assinado *checkSum, size_t *checkSumlen,
      destino de target_t
      );
    
Valores de retorno Um subconjunto de valores de retorno C_GenerateKey. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_GenerateKey gera uma chave secreta ou um conjunto de parâmetros de domínio, criando um novo objeto. hSession é o identificador da sessão, pMechanism aponta para o mecanismo de geração, pTemplate aponta para o modelo para a nova chave ou conjunto de parâmetros de domínio, ulCount é o número de atributos no modelo, phKey aponta para o local que recebe o identificador da nova chave ou conjunto de parâmetros de domínio.

Se o mecanismo de geração destinar-se à geração de parâmetro de domínio, o atributo CKA_CLASS terá o valor CKO_DOMAIN_PARAMETERS, caso contrário, ele terá o valor CKO_SECRET_KEY.

Como o tipo de parâmetros de chave ou de domínio a serem gerados é implícito no mecanismo de geração, o modelo não precisa fornecer um tipo de chave. Se ele fornecer um tipo de chave que é inconsistente com o mecanismo de geração, C_GenerateKey falhará e retornará o código de erro CKR_TEMPLATE_INCONSISTENT. O atributo CKA_CLASS é tratado da mesma forma.

Se uma chamada para C_GenerateKey não puder suportar o modelo preciso que é fornecido a ele, ele falha e retorna sem criar um objeto.

O objeto criado por uma chamada bem-sucedida para C_GenerateKey tem o atributo CKA_LOCAL configurado como CK_TRUE.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_GenerateKey)(
      CK_SESSION_HANDLE hSession
      CK_MECHANISM_PTR pMechanism,
      CK_ATTRIBUTE_PTR pTemplate,
      CK_ULONG ulCount,
      CK_OBJECT_HANDLE_PTR phKey
      );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_ATTRIBUTE_READ_ONLY, CKR_ATTRIBUTE_TYPE_INVALID, CKR_ATTRIBUTE_VALUE_INVALID, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_CURVE_NOT_SUPPORTED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SESSION_READ_ONLY, CKR_TEMPLATE_INCOMPLETE, CKR_TEMPLATE_INCONSISTENT, CKR_TOKEN_WRITE_PROTECTED, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    // Setup the AES key's attributes
    keyTemplate := ep11.EP11Attributes{
        ep11.CKA_VALUE_LEN:   keyLen / 8,
        ep11.CKA_WRAP:        false,
        ep11.CKA_UNWRAP:      false,
        ep11.CKA_ENCRYPT:     true,
        ep11.CKA_DECRYPT:     true,
        ep11.CKA_EXTRACTABLE: false,
    }
    
    GenerateKeyRequest := &pb.GenerateKeyRequest{
        Mech:     &pb.Mechanism{Mechanism: ep11.CKM_AES_KEY_GEN},
        Template: util.AttributeMap(keyTemplate),
    }
    
    GenerateKeyResponse, err := cryptoClient.GenerateKey(context.Background(), GenerateKeyRequest)
    
  • fragmento de código JavaScript

    let keyLen = 128;
    
    let keyTemplate = new util.AttributeMap(
      new util.Attribute(ep11.CKA_VALUE_LEN, keyLen / 8),
      new util.Attribute(ep11.CKA_WRAP, false),
      new util.Attribute(ep11.CKA_UNWRAP, false),
      new util.Attribute(ep11.CKA_ENCRYPT, true),
      new util.Attribute(ep11.CKA_DECRYPT, true),
      new util.Attribute(ep11.CKA_EXTRACTABLE, false),
      new util.Attribute(ep11.CKA_TOKEN, true)
      );
    client.GenerateKey({
      Mech: { Mechanism: ep11.CKM_AES_KEY_GEN },
      Template: keyTemplate,
      KeyId: uuidv4()
    }, (err, data={}) => {
      cb(err, data.KeyBytes, data.CheckSum);
    });
    
    

GenerateKeyPair

A função GenerateKeyPair gera um par de chave pública e chave privada.

Descrição Liga-se a EP11 m_GenerateKeyPair, que é uma implementação de C_GenerateKeyPair de PKCS #11.
Parâmetros
    message GenerateKeyPairRequest {
      Mechanism Mech = 1;
      map<uint64,AttributeValue> PrivKeyTemplate = 7;
      map<uint64,AttributeValue> PubKeyTemplate = 8;
      }
    message GenerateKeyPairResponse {
      bytes PrivKeyBytes = 5;
      bytes PubKeyBytes = 6;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_GenerateKeyPair de PKCS #11.

Os parâmetros de par de chaves são recuperados dos parâmetros pmech, ppublic e pprivate. Para chaves RSA, ppublic especifica o tamanho do módulo.

No modo FIPS, são suportados apenas os módulos RSA de 1024 + 256 n bits (número inteiro n). O modo não FIPS pode gerar chaves de qualquer número par de bits entre os limites na lista de parâmetros de mecanismo.

A chave pública é formatada como uma SPKI padrão (informação de chave pública de assunto), legível pela maioria das bibliotecas. Ela é protegida com integridade por um MAC específico de chave de transporte, que não faz parte do SPKI em si. A geração de parâmetro DSA retorna uma estrutura não SPKI no campo de chave pública.

Se um objeto for vinculado a uma sessão, (pin, plen) ele deve retornar pelo Login a essa sessão. Deixar pin NULL cria um objeto público, um que sobrevive à sessão de login.

Retorna a chave privada agrupada para (key, klen), chave pública como uma estrutura ASN.1/DER com MAC executado em (pubkey, pklen).

As combinações de parâmetros suportados a seguir com notas especiais estão além do que são documentadas pelo PKCS n° 11:

As chaves RSA rejeitam os expoentes públicos abaixo de 17 (0x11). Os pontos de controle podem restringir ainda mais o mínimo aceito. O expoente Fermat4, 0x10001, é controlado por um ponto de controle específico, combinando restrições de expoente público de FIPS 186-3 (seção B.3.1).

Chaves EC (CKM_EC_KEY_PAIR_GEN): os parâmetros de curva podem ser especificados como OIDs ou nomes simbólicos (nossa variante do namedCurve). Os nomes simbólicos suportados são "P-nnn" para curvas NIST (nnn é uma contagem principal de bits suportada, 192-521), "BP-nnnnR" para a curva BP regular. (Os nomes devem ser fornecidos como sequências ASCII, sem finalização zero.)

Chaves DSA (CKM_DSA_KEY_PAIR_GEN): transmita a estrutura P, Q, G como o atributo CKA_IBM_STRUCT_PARAMS de atributos públicos. Os parâmetros individuais P, Q, G podem não ser transmitidos por meio de parâmetros regulares do PKCS n° 11, eles devem ser combinados a uma única estrutura.

Chaves DH (CKM_DH_PKCS_KEY_PAIR_GEN): transmita a estrutura P, G como o atributo CKA_IBM_STRUCT_PARAMS de atributos públicos. Os parâmetros individuais P, G podem não ser transmitidos por meio de parâmetros regulares do PKCS n° 11, eles devem ser combinados a uma única estrutura. Ao selecionar uma contagem de bits de chave privada (X), use o atributo XCP_U32_VALUE_BITS. Se não estiver presente ou um 0 explícito for fornecido, a contagem de bits será selecionada com base em contagem de bits P.

Uso do estado de sessão (Login) substitui o uso padrão das sessões. O mapeamento está fora do escopo da biblioteca.

O blob pin era saída de: Login.

O PKCS nº11 hSession não está mapeado para nenhum parâmetro EP11. (A chamada não está associada diretamente a nenhuma sessão.)

phPublicKey de PKCS #11 não está mapeado para nenhum parâmetro EP11. (A biblioteca do host deve associar pubkey (SPKI) com o identificador.)

phPrivateKey de PKCS #11 não está mapeado para nenhum parâmetro EP11. (A biblioteca do host deve associar a chave privada com o identificador.)

Parâmetros
    CK_RV m_GenerateKeyPair (
      Mecanismo CK_MECHANISM_PTR,
      CK_ATTRIBUTE_PTR pubKeyTemplate, CK_ULONG pubKeyTemplatelen,
      CK_ATTRIBUTE_PTR privKeyTemplate, CK_ULONG privKeyTemplatelen,
      const unsigned char *pin, size_t pinlen,
      caractere não assinado *privKey, size_t *privKeylen,
      caractere não assinado *pubKey, size_t *pubKeylen,
      destino de target_t
      );
    
Valores de retorno Um subconjunto de valores de retorno C_GenerateKeyPair. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_GenerateKeyPair gera um par de chaves pública e privada, criando novos objetos chave. hSession é o identificador da sessão, pMechanism aponta para o mecanismo de geração de chaves, pPublicKeyTemplate aponta para o modelo para a chave pública, ulPublicKeyAttributeCount é o número de atributos no modelo de chave pública, pPrivateKeyTemplate aponta para o modelo para a chave privada, ulPrivateKeyAttributeCount é o número de atributos no modelo de chave privada, phPublicKey aponta para o local que recebe o identificador da nova chave pública, phPrivateKey aponta para o local que recebe o identificador da nova chave privada.

Uma vez que os tipos de chaves a serem gerados são implícitos no mecanismo de geração de par de chaves, os modelos não precisam fornecer tipos de chaves. Se um dos modelos fornecer um tipo de chave que seja inconsistente com o mecanismo de geração de chaves, C_GenerateKeyPair falhará e retornará o código de erro CKR_TEMPLATE_INCONSISTENT. O atributo CKA_CLASS é tratado de forma semelhante.

Se uma chamada para C_GenerateKey não puder suportar o modelo preciso que é fornecido-lhe, ele falha e retorna sem criar nenhum objeto.

Uma chamada para C_GenerateKeyPair nunca cria apenas uma chave e retorna. Uma chamada pode falhar e criar nenhuma chave; ou pode ter sucesso e criar um par de chaves públicas e privadas correspondentes.

Os objetos chave criados por uma chamada bem-sucedida para C_GenerateKeyPair possuem os atributos CKA_LOCAL configurados como CK_TRUE.

Observe cuidadosamente a ordem dos argumentos para C_GenerateKeyPair. Os dois últimos argumentos não têm a mesma ordem que tinham no documento original do Cryptoki Versão 1.0. A ordem desses dois argumentos causou alguma infeliz confusão.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_GenerateKeyPair)(
      CK_SESSION_HANDLE hSession,
      CK_MECHANISM_PTR pMechanism,
      CK_ATTRIBUTE_PTR pPublicKeyTemplate,
      CK_ULONG ulPublicKeyAttributeCount,
      CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
      CK_ULONG ulPrivateKeyAttributeCount,
      CK_OBJECT_HANDLE_PTR phPublicKey,
      CK_OBJECT_HANDLE_PTR phPrivateKey
      );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_ATTRIBUTE_READ_ONLY, CKR_ATTRIBUTE_TYPE_INVALID, CKR_ATTRIBUTE_VALUE_INVALID, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_CURVE_NOT_SUPPORTED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_DOMAIN_PARAMS_INVALID, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SESSION_READ_ONLY, CKR_TEMPLATE_INCOMPLETE, CKR_TEMPLATE_INCONSISTENT, CKR_TOKEN_WRITE_PROTECTED, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    // Generate RSA key pair
    publicExponent := []byte{0x11}
    publicKeyTemplate := ep11.EP11Attributes{
        ep11.CKA_ENCRYPT:         true,
        ep11.CKA_VERIFY:          true,
        ep11.CKA_MODULUS_BITS:    2048,
        ep11.CKA_PUBLIC_EXPONENT: publicExponent,
        ep11.CKA_EXTRACTABLE:     false,
    }
    privateKeyTemplate := ep11.EP11Attributes{
        ep11.CKA_PRIVATE:     true,
        ep11.CKA_SENSITIVE:   true,
        ep11.CKA_DECRYPT:     true,
        ep11.CKA_SIGN:        true,
        ep11.CKA_EXTRACTABLE: false,
    }
    GenerateKeypairRequest := &pb.GenerateKeyPairRequest{
        Mech:            &pb.Mechanism{Mechanism: ep11.CKM_RSA_PKCS_KEY_PAIR_GEN},
        PubKeyTemplate:  util.AttributeMap(publicKeyTemplate),
        PrivKeyTemplate: util.AttributeMap(privateKeyTemplate),
    }
    GenerateKeyPairResponse, err := cryptoClient.GenerateKeyPair(context.Background(), GenerateKeypairRequest)
    
  • fragmento de código JavaScript

    const publicKeyTemplate = new util.AttributeMap(
      new util.Attribute(ep11.CKA_ENCRYPT, true),
      new util.Attribute(ep11.CKA_VERIFY, true),
      new util.Attribute(ep11.CKA_MODULUS_BITS, 2048),
      new util.Attribute(ep11.CKA_PUBLIC_EXPONENT, publicExponent),
      new util.Attribute(ep11.CKA_EXTRACTABLE, false)
    );
    
    const privateKeyTemplate = new util.AttributeMap(
      new util.Attribute(ep11.CKA_PRIVATE, true),
      new util.Attribute(ep11.CKA_SENSITIVE, true),
      new util.Attribute(ep11.CKA_DECRYPT, true),
      new util.Attribute(ep11.CKA_SIGN, true),
      new util.Attribute(ep11.CKA_EXTRACTABLE, false),
    );
    
    client.GenerateKeyPair({
      Mech: {
        Mechanism: ep11.CKM_RSA_PKCS_KEY_PAIR_GEN
      },
      PubKeyTemplate: publicKeyTemplate,
      PrivKeyTemplate: privateKeyTemplate,
      PubKeyId: uuidv4(),
      PrivKeyId: uuidv4()
    }, (err, response) => {
      callback(err, response);
    });
    

DeriveKey

A função DeriveKey deriva uma chave de uma chave base.

Descrição Liga-se a EP11 m_DeriveKey, que é uma implementação de C_DeriveKey de PKCS #11.
Parâmetros
    message DeriveKeyRequest {
        Mechanism Mech = 1;
        bytes BaseKey = 3;
        bytes Data = 4;
        map<uint64,AttributeValue> Template = 8;
    }
    message DeriveKeyResponse {
        bytes NewKeyBytes = 6;
        bytes CheckSum = 7;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_DeriveKey de PKCS #11.

O blob basekey,bklen deve ser mapeado por meio do parâmetro hBaseKey de PKCS #11.

O PKCS nº11 hSession não está mapeado para nenhum parâmetro EP11. (A chamada não está associada diretamente a nenhuma sessão.)

O PKCS nº11 phKey não está mapeado para nenhum parâmetro EP11. (A biblioteca do host deve ligar a chave retornada ao identificador.)

Parâmetros
    CK_RV m_DeriveKey (
        Mecanismo CK_MECHANISM_PTR,
        Modelo CK_ATTRIBUTE_PTR, CK_ULONG templatelen,
        const unsigned char *baseKey, size_t baseKeylen,
        const unsigned char *data, size_t datalen,
        const unsigned char *pin, size_t pinlen,
        caractere não assinado *newKey, size_t *newKeylen,
        caractere não assinado *checkSum, size_t *checkSumlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_DeriveKey. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_DeriveKey deriva uma chave de uma chave base, criando um novo objeto chave. hSession é o identificador da sessão, pMechanism aponta para uma estrutura que especifica o mecanismo de derivação de chave, hBaseKey é o identificador da chave base, pTemplate aponta para o modelo para a nova chave, ulAttributeCount é o número de atributos no modelo e phKey aponta para o local que recebe o identificador da chave derivada.

Os valores dos atributos CKA_SENSITIVE, CKA_ALWAYS_SENSITIVE, CKA_EXTRATABLE e KA_NEVER_EXTRACTABLE para a chave base afetam os valores que esses atributos podem reter para a chave recém-derivada. Veja a descrição de cada mecanismo de derivação de chave específico na Seção 5.16.2 da especificação de API PKCS #11 para quaisquer restrições deste tipo.

Se uma chamada para C_GenerateKey não puder suportar o modelo preciso que é fornecido-ele, ele falha e retorna sem criar nenhum objeto.

O objeto de chave criado por uma chamada bem-sucedida para C_GenerateKey tem o atributo CKA_LOCAL configurado como CK_TRUE.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_DeriveKey)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hBaseKey,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulAttributeCount,
        CK_OBJECT_HANDLE_PTR phKey
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_ATTRIBUTE_READ_ONLY, CKR_ATTRIBUTE_TYPE_INVALID, CKR_ATTRIBUTE_VALUE_INVALID, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_CURVE_NOT_SUPPORTED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_DOMAIN_PARAMS_INVALID, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENT, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SESSION_READ_ONLY, CKR_TEMPLATE_INCOMPLETE, CKR_TEMPLATE_INCONSISTENT, CKR_TOKEN_WRITE_PROTECTED, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    // Derive AES key for Alice
    deriveKeyTemplate := ep11.EP11Attributes{
        ep11.CKA_CLASS:     ep11.CKO_SECRET_KEY,
        ep11.CKA_KEY_TYPE:  ep11.CKK_AES,
        ep11.CKA_VALUE_LEN: 128 / 8,
        ep11.CKA_ENCRYPT:   true,
        ep11.CKA_DECRYPT:   true,
    }
    // Extract Bob's EC coordinates
    combinedCoordinates, err := util.GetPubkeyBytesFromSPKI(bobECKeypairResponse.PubKeyBytes)
    if err != nil {
        return nil, fmt.Errorf("Bob's EC public key cannot obtain coordinates: %s", err)
    }
    
    aliceDeriveKeyRequest := &pb.DeriveKeyRequest{
        Mech:     &pb.Mechanism{Mechanism: ep11.CKM_ECDH1_DERIVE, Parameter: util.SetMechParm(combinedCoordinates)},
        Template: util.AttributeMap(deriveKeyTemplate),
        BaseKey:  aliceECKeypairResponse.PrivKeyBytes,
    }
    
    // Derive AES key for Alice
    aliceDeriveKeyResponse, err := cryptoClient.DeriveKey(context.Background(),  aliceDeriveKeyRequest)
    
  • fragmento de código JavaScript

    //results are created through GenerateKeyPair
    const [alice, bob] = results;
    
    const deriveKeyTemplate = new util.AttributeMap(
    new util.Attribute(ep11.CKA_CLASS, ep11.CKO_SECRET_KEY),
    new util.Attribute(ep11.CKA_KEY_TYPE, ep11.CKK_AES),
    new util.Attribute(ep11.CKA_VALUE_LEN, 128/8),
    new util.Attribute(ep11.CKA_ENCRYPT, true),
    new util.Attribute(ep11.CKA_DECRYPT, true),
    );
    
    const derived = [];
    
    async.eachSeries([
    { PubKey: bob.PubKeyBytes, PrivKey: alice.PrivKeyBytes },
    { PubKey: alice.PubKeyBytes, PrivKey: bob.PrivKeyBytes }
    ], (data, cb) => {
    const combinedCoordinates = util.getPubKeyBytesFromSPKI(data.PubKey);
    
    client.DeriveKey({
      Mech: {
        Mechanism: ep11.CKM_ECDH1_DERIVE,
        ParameterB: combinedCoordinates
      },
      Template: deriveKeyTemplate,
      BaseKey: data.PrivKey
    }, (err, data={}) => {
      if (!err) {
        derived.push(data);
      }
    
      cb(err);
    });
    }
    

Protegendo chaves

É possível proteger uma chave agrupando-a e, em seguida, decriptografar a chave chamando o recurso de desagrupamento.

WrapKey

A função WrapKey agrupa (criptografa) uma chave.

Descrição Liga-se a EP11 m_WrapKey, que é uma implementação de C_WrapKey de PKCS #11.
Parâmetros
    message WrapKeyRequest {
        bytes Key = 1;
        bytes KeK = 2;
        bytes MacKey = 3;
        Mechanism Mech = 4;
    }
    message WrapKeyResponse {
        bytes Wrapped = 5;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição Implementação de C_WrapKey de PKCS #11.
Parâmetros
    CK_RV m_WrapKey (
        const unsigned char *key, size_t keylen,
        const unsigned char *keK, size_t keKlen,
        const unsigned char *macKey, size_t macKeylen,
        const mecanismo CK_MECHANISM_PTR,
        CK_BYTE_PTR wrapped, CK_ULONG_PTR wrappedlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_WrapKey. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_WrapKey agrupa (isto é, criptografa) uma chave privada ou secreta. hSession é o identificador da sessão, pMechanism aponta para o mecanismo de agrupamento, hWrappingKey é o identificador da chave de agrupamento, hKey é o identificador da chave a ser agrupada, pWrappedKey aponta para o local que recebe a chave agrupada e pulWrappedKeyLen aponta para o local que recebe o comprimento da chave agrupada.

C_WrapKey usa a convenção que é descrita na Seção 5.2 da especificação de API PKCS #11 sobre a produção de saída.

O atributo CKA_WRAP da chave de agrupamento, que indica se a chave suporta ser agrupada, deve ser CK_TRUE. O atributo CKA_EXTRACTABLE da chave a ser agrupada também deve ser CK_TRUE.

Se a chave a ser agrupada não puder ser agrupada por algum motivo específico do token, apesar de ter seu atributo CKA_EXTRACTABLE configurado como CK_TRUE, C_WrapKey falhará com o código de erro CKR_KEY_NOT_WRAPPABLE. Se ela não puder ser agrupada com a chave de agrupamento especificada e o mecanismo somente por causa de seu comprimento, C_WrapKey falhará com o código de erro CKR_KEY_SIZE_RANGE.

C_WrapKey pode ser usado nas situações a seguir:

  • Para agrupar qualquer chave secreta com uma chave pública que suporte criptografia e decriptografia.
  • Para agrupar qualquer chave secreta com qualquer outra chave secreta. A consideração deve ser dada para o tamanho da chave e a força do mecanismo ou o token pode não permitir a operação.
  • Para agrupar uma chave privada com qualquer chave secreta.

Quais tipos de chaves podem ser agrupados com quais mecanismos variam nos tokens.

Para particionar as chaves de agrupamento para que elas possam agrupar apenas um subconjunto de chaves extraíveis, o atributo CKA_WRAP_TEMPLATE pode ser usado na chave de agrupamento para especificar um conjunto de atributos que pode ser comparado com relação aos atributos da chave a ser agrupada. Se todos os atributos correspondem de acordo com as regras C_FindObject de correspondência de atributo, a operação de agrupamento procede. O valor desse atributo é um modelo de atributo e o tamanho é o número de itens no modelo vezes o tamanho de CK_ATTRIBUTE. Se esse atributo não for fornecido, qualquer modelo será aceitável. Se um atributo não estiver presente, ele não é verificado. Se alguma incompatibilidade de atributo ocorrer em uma tentativa de agrupar uma chave, a função retorna CKR_KEY_HANDLE_INVALID.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_WrapKey)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hWrappingKey,
        CK_OBJECT_HANDLE hKey,
        CK_BYTE_PTR pWrappedKey,
        CK_ULONG_PTR pulWrappedKeyLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_HANDLE_INVALID, CKR_KEY_NOT_WRAPPABLE, CKR_KEY_SIZE_RANGE, CKR_KEY_UNEXTRACTABLE, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN, CKR_WRAPPING_KEY_HANDLE_INVALID, CKR_WRAPPING_KEY_SIZE_RANGE, CKR_WRAPPING_KEY_TYPE_INCONSISTENT.

Snnipets de código

  • Fragmento de código de Golang

    WrapKeyRequest := &pb.WrapKeyRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_RSA_PKCS},
        KeK:  GenerateKeyPairResponse.PubKeyBytes,
        Key:  GenerateKeyResponse.KeyBytes,
    }
    
    WrapKeyResponse, err := cryptoClient.WrapKey(context.Background(), WrapKeyRequest)
    
  • fragmento de código JavaScript

    client.WrapKey({
      Mech: {
        Mechanism: ep11.CKM_RSA_PKCS
      },
      KeK: rsa.PubKeyBytes,
      Key: aes.KeyBytes
    }, (err, data={}) => {
      cb(err, data.Wrapped);
    });
    

UnwrapKey

A função UnwrapKey desagrupa (decriptografa) uma chave.

Descrição Liga-se a EP11 m_UnwrapKey, que é uma implementação de C_UnwrapKey de PKCS #11.
Parâmetros
    message UnwrapKeyRequest {
        bytes Wrapped = 1;
        bytes KeK = 2;
        bytes MacKey = 3;
        Mechanism Mech = 5;
        map<uint64,AttributeValue> Template = 9;
    }
    message UnwrapKeyResponse {
        bytes UnwrappedBytes = 7;
        bytes CheckSum = 8;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_UnwrapKey de PKCS #11.

uwmech especifica o mecanismo de criptografia que é usado para decriptografar dados agrupados. ptempl é uma lista de parâmetros chave(par), que especifica como transformar os dados desagrupados em uma nova chave (deve incluir CKA_KEY_TYPE).

O objeto gerado é retornado em (unwrapped, uwlen) como um blob. As chaves simétricas retornam sua soma de verificação de chave (3 bytes) em (csum, cslen); os objetos de chave pública retornam sua chave pública como um SPKI em (csum, cslen). Ambos os formulários são seguidos por um valor big endian de 4 bytes, codificando a contagem de bits da chave desagrupada.

Quando uma SPKI está sendo transformada em uma SPKI com MAC, deve-se usar CKM_IBM_TRANSPORTKEY como o mecanismo de desagrupamento. Esse modo fornece o SPKI bruto como dados agrupados e ignora o KEK.

UnwrapKey produz chaves de DES ajustadas por paridade (dentro dos blobs), mas tolera entrada com paridade imprópria.

Parâmetros
    CK_RV m_UnwrapKey (
        const CK_BYTE_PTR wrapped, CK_ULONG wrappedlen,
        const unsigned char *keK, size_t keKlen,
        const unsigned char *macKey, size_t macKeylen,
        const unsigned char *pin, size_t pinlen,
        const mecanismo CK_MECHANISM_PTR,
        const CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
        unsigned char * unwrapped, size_t * unwrappedlen,
        CK_BYTE_PTR checkSum, CK_ULONG *checkSumlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_UnwrapKey. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_UnwrapKey desagrupa (isto é, decriptografa) uma chave agrupada, criando um novo objeto de chave privada ou de chave secreta. hSession é o identificador da sessão, pMechanism aponta para o mecanismo de desagrupamento, hUnwrappingKey é o identificador da chave de desagrupamento, pWrappedKey aponta para a chave agrupada, ulWrappedKeyLen é o comprimento da chave agrupada, pTemplate aponta para o modelo para a nova chave, ulAttributeCount é o número de atributos no modelo, phKey aponta para o local que recebe o identificador da chave recuperada.

O atributo CKA_UNWRAP da chave de desagrupamento, que indica se a chave suporta desagrupamento, deve ser CK_TRUE.

A nova chave tem o atributo CKA_ALWAYS_SENSITIVE configurado como CK_FALSE e o atributo CKA_NEVER_EXTRACTABLE configurado como CK_FALSE. O atributo CKA_EXTRACTABLE é, por padrão, configurado como CK_TRUE.

Alguns mecanismos podem ser modificados ou tentam ser modificados. o conteúdo da estrutura pMechanism ao mesmo tempo em que a chave é desagrupada.

Se uma chamada para C_UnwrapKey não puder suportar o modelo preciso que é fornecido-ele, ele falha e retorna sem criar nenhum objeto.

O objeto de chave criado por uma chamada bem-sucedida para C_UnwrapKey tem seu atributo CKA_LOCAL configurado como CK_FALSE.

Para particionar as chaves de desagrupamento para que elas possam desagrupar apenas um subconjunto de chaves, o atributo CKA_UNWRAP_TEMPLATE pode ser usado na chave de desagrupamento para especificar um conjunto de atributos que é incluído nos atributos da chave a ser desagrupada. Se os atributos não entram em conflito com o modelo de atributo fornecido pelo usuário, em pTemplate, a operação de desagrupar procede. O valor desse atributo é um modelo de atributo e o tamanho é o número de itens no modelo vezes o tamanho de CK_ATTRIBUTE. Se esse atributo não estiver presente na chave de desagrupamento, então nenhum atributo extra será incluído Se ocorrer algum conflito de atributo em uma tentativa de desagrupar uma chave, a função retornará CKR_TEMPLATE_INCONSISTENT.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_UnwrapKey)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hUnwrappingKey,
        CK_BYTE_PTR pWrappedKey,
        CK_ULONG ulWrappedKeyLen,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulAttributeCount,
        CK_OBJECT_HANDLE_PTR phKey
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_ATTRIBUTE_READ_ONLY, CKR_ATTRIBUTE_TYPE_INVALID, CKR_ATTRIBUTE_VALUE_INVALID, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_CURVE_NOT_SUPPORTED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_DOMAIN_PARAMS_INVALID, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SESSION_READ_ONLY, CKR_TEMPLATE_INCOMPLETE, CKR_TEMPLATE_INCONSISTENT, CKR_TOKEN_WRITE_PROTECTED, CKR_UNWRAPPING_KEY_HANDLE_INVALID, CKR_UNWRAPPING_KEY_SIZE_RANGE, CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT, CKR_USER_NOT_LOGGED_IN, CKR_WRAPPED_KEY_INVALID, CKR_WRAPPED_KEY_LEN_RANGE.

Snnipets de código

  • Fragmento de código de Golang

    aesUnwrapKeyTemplate := ep11.EP11Attributes{
        ep11.CKA_CLASS:       ep11.CKO_SECRET_KEY,
        ep11.CKA_KEY_TYPE:    ep11.CKK_AES,
        ep11.CKA_VALUE_LEN:   128 / 8,
        ep11.CKA_ENCRYPT:     true,
        ep11.CKA_DECRYPT:     true,
        ep11.CKA_EXTRACTABLE: true, // must be true to be wrapped
    }
    UnwrapKeyRequest := &pb.UnwrapKeyRequest{
        Mech:     &pb.Mechanism{Mechanism: ep11.CKM_RSA_PKCS},
        KeK:      GenerateKeyPairResponse.PrivKeyBytes,
        Wrapped:  WrapKeyResponse.Wrapped,
        Template: util.AttributeMap(aesUnwrapKeyTemplate),
    }
    
    // Unwrap the AES key
    UnwrapKeyResponse, err := cryptoClient.UnwrapKey(context.Background(), UnwrapKeyRequest)
    
  • fragmento de código JavaScript

    const aesUnwrapKeyTemplate = new util.AttributeMap(
    new util.Attribute(ep11.CKA_CLASS, ep11.CKO_SECRET_KEY),
    new util.Attribute(ep11.CKA_KEY_TYPE, ep11.CKK_AES),
    new util.Attribute(ep11.CKA_VALUE_LEN, 128/8),
    new util.Attribute(ep11.CKA_ENCRYPT, true),
    new util.Attribute(ep11.CKA_DECRYPT, true),
    new util.Attribute(ep11.CKA_EXTRACTABLE, true)
    );
    
    client.UnwrapKey({
        Mech: {
            Mechanism: ep11.CKM_RSA_PKCS
        },
        KeK: rsa.PrivKeyBytes,
        Wrapped: wrapped,
        Template: aesUnwrapKeyTemplate
    }, (err, data={}) => {
        cb(err, wrapped, data.UnwrappedBytes, data.CheckSum);
    });
    

RewrapKeyBlob

A função RewrapKeyBlob recriptografa os objetos binários grandes (BLOBs) gerados com a nova chave mestra confirmada que está contida no HSM. As chaves recriptografadas poderão ser usadas somente depois que o HSM for finalizado com a nova chave mestra confirmada.

Essa função é um comando de administração especial suportado apenas por GREP11. Não há uma função EP11 ou PKCS #11 correspondente para RewrapKeyBlob.

Descrição Transfere a propriedade de um BLOB controlado pela chave mestra atual para a nova chave mestra quando ela é confirmada.
Parâmetros
    message RewrapKeyBlobRequest {
    	bytes WrappedKey = 1;
    }
    message RewrapKeyBlobResponse {
    	bytes RewrappedKey = 1;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.

Snnipets de código

  • Fragmento de código de Golang

    RewrapKeyBlobRequest := &pb.RewrapKeyBlobRequest {
        WrappedKey: GenerateKeyResponse.KeyBytes,
    }
    
    // Rewrap an existing key blob using the HSM's new wrapping key
    RewrapKeyBlobResponse, err := cryptoClient.RewrapKeyBlob(context.Background(),  RewrapKeyBlobRequest)
    
  • fragmento de código JavaScript

    client.RewrapKeyBlob({
      WrappedKey: wrappedKey
    }, (err, response) => {
      callback(err, response);
    });
    

Recuperando e modificando atributos para chaves 

Ao gerar chaves ou executar operações de chave, você define um modelo de atributo como um dos parâmetros. É possível recuperar os atributos para um objeto de chave específico e modificar alguns atributos após a criação da chave.

GetAttributeValue

A função GetAttributeValue obtém um valor de atributo de um objeto.

Descrição Liga-se a EP11 m_GetAttributeValue, que é uma implementação de C_GetAttributeValue de PKCS #11.
Parâmetros
    message GetAttributeValueRequest {
        bytes Object = 1;
        map<uint64,AttributeValue> Attributes = 3;
    }
    message GetAttributeValueResponse {
        map<uint64,AttributeValue> Attributes = 4;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_GetAttributeValue de PKCS #11.

Não representa ou precisa de sessões (parte do blob), portanto, não usa o parâmetro hSession.

O EP11 usa formas mais diretas para decodificação, como enumerar valores reais em vez de ser mais genérico.

Parâmetros
    CK_RV m_GetAttributeValue (
        const unsigned char *object, size_t objectlen,
        Atributos CK_ATTRIBUTE_PTR, CK_ULONG templatelen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_GetAttributeValue. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_GetAttributeValue obtém o valor de um ou mais atributos de um objeto. hSession é o identificador da sessão, hObject é o identificador do objeto, pTemplate aponta para um modelo que especifica quais valores de atributo devem ser obtidos e recebe os valores do atributo, ulCount é o número de atributos no modelo.

Para cada (type, pValue, ulValueLen) triplo no modelo, C_GetAttributeValue executa o algoritmo a seguir:

  1. Se o atributo especificado (isto é, o atributo que é especificado pelo campo de tipo) do objeto não puder ser revelado porque o objeto é sensível ou não extraível, então o campo ulValueLen nesse trio será modificado para reter o valor CK_UNAVAILABLE_INFORMATION.
  2. Caso contrário, se o valor especificado para o objeto for inválido (o objeto não possui esse atributo), o campo ulValueLen nesse triplo será modificado para conter o valor CK_UNAVAILABLE_INFORMATION.
  3. Caso contrário, se o campo pValue tiver o valor NULL_PTR, o campo ulValueLen será modificado para conter o comprimento exato do atributo especificado para o objeto.
  4. Caso contrário, se o comprimento especificado em ulValueLen for grande o suficiente para reter o valor do atributo especificado para o objeto, então esse atributo é copiado para o buffer que está em pValue e o campo ulValueLen é modificado para reter o comprimento exato do atributo.
  5. Caso contrário, o campo ulValueLen será modificado para conter o valor CK_UNAVAILABLE_INFORMATION.

Se o caso 1 se aplica a qualquer um dos atributos solicitados, então a chamada precisa retornar o valor CKR_ATTRIBUTE_SENSITIVE. Se o caso 2 se aplica a qualquer um dos atributos solicitados, então a chamada precisa retornar o valor CKR_ATTRIBUTE_TYPE_INVALID. Se o caso 5 se aplica a qualquer um dos atributos solicitados, então a chamada precisa retornar o valor CKR_BUFFER_TOO_SMALL. Como de costume, se mais de um desses códigos de erro for aplicável, Cryptoki pode retornar qualquer um deles. Somente se nenhum deles se aplica a qualquer um dos atributos solicitados, CKR_OK é retornado.

No caso especial de um atributo cujo valor é uma matriz de atributos, por exemplo CKA_WRAP_TEMPLATE, em que ele é transmitido com pValue não NULL, se o pValue de elementos dentro da matriz for NULL_PTR, o ulValueLen de elementos dentro da matriz será configurado com o comprimento necessário. Se o pValue de elementos dentro da matriz não for NULL_PTR, o elemento ulValueLen de atributos dentro da matriz deverá refletir o espaço que o pValue correspondente aponta para e pValue será preenchido se houver espaço suficiente. Portanto, é importante inicializar o conteúdo de um buffer antes de C_GetAttributeValue ser chamado para obter esse valor de matriz... Se qualquer ulValueLen dentro da matriz não for grande o suficiente, ele é configurado como CK_UNAVAILABLE_INFORMATION e a função retorna CKR_BUFFER_TOO_SMALL, como faz se um atributo no argumento pTemplate tiver ulValueLen muito pequeno. Qualquer atributo, cujo valor é uma matriz de atributos, é identificável pelo conjunto CKF_ARRAY_ATTRIBUTE do tipo de atributo.

Os códigos de erro CKR_ATTRIBUTE_SENSITIVE, CKR_ATTRIBUTE_TYPE_INVALIDe CKR_BUFFER_TOO_SMALL não denotam erros verdadeiros para C_GetAttributeValue. Se uma chamada para C_GetAttributeValue retornar qualquer um destes três valores, então a chamada deve, no entanto, ter processado todos os atributos no modelo que é fornecido para C_GetAttributeValue. Cada atributo no modelo cujo valor pode ser retornado pela chamada para C_GetAttributeValue é retornado pela chamada para C_GetAttributeValue.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_GetAttributeValue)(
        CK_SESSION_HANDLE hSession,
        CK_OBJECT_HANDLE hObject,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulCount
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_ATTRIBUTE_SENSITIVE, CKR_ATTRIBUTE_TYPE_INVALID, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OBJECT_HANDLE_INVALID, CKR_OK, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Snnipets de código

  • Fragmento de código de Golang

    // Only retrieve supported EP11 attributes
    attributeList := ep11.EP11Attributes{
        ep11.CKA_DECRYPT: false, // attribute where you would like to retrieve its current value
    }
    
    GetAttributeValueRequest := &pb.GetAttributeValueRequest{
        Object:     GenerateKeyPairResponse.PrivKeyBytes,
        Attributes: util.AttributeMap(attributeList),
    }
    
    GetAttributeValueResponse, err := cryptoClient.GetAttributeValue(context.Background(), GetAttributeValueRequest)
    
  • fragmento de código JavaScript

    const attributeTemplate = new util.AttributeMap(
    new util.Attribute(ep11.CKA_SIGN, 0)
    );
    
    client.GetAttributeValue({
      Object: keys.PrivKey,
      Attributes: attributeTemplate
    }, (err, response) => {
      callback(err, response);
      console.log('ATTRIBUTE:', response.Attributes);
    });
    

SetAttributeValue

A função SetAttributeValue modifica um valor de atributo de um objeto.

Descrição Liga-se a EP11 m_SetAttributeValue, que é uma implementação de C_SetAttributeValue de PKCS #11.
Parâmetros
    message SetAttributeValueRequest {
        bytes Object = 1;
        map<uint64,AttributeValue> Attributes = 3;
    }
    message SetAttributeValueResponse {
        bytes Object = 1;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_SetAttributeValue de PKCS #11.

Compactação de atributo: consulte _GetAttrValue

Atualmente, o EP11 só envia atributos booleanos, e todos os outros atributos são manipulados pelo host (e o EP11 não modifica matrizes, como WRAP_TEMPLATE).

Não representa ou precisa de sessões (parte do blob), portanto, não usa o parâmetro hSession do PKCS #11.

Parâmetros
    CK_RV m_SetAttributeValue (
        unsigned char *object, size_t objectlen,
        Atributos CK_ATTRIBUTE_PTR, CK_ULONG templatelen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_SetAttributeValue. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_SetAttributeValue modifica o valor de um ou mais atributos de um objeto. hSession é o identificador da sessão, hObject é o identificador do objeto, pTemplate aponta para um modelo que especifica quais valores de atributo devem ser modificados e seus novos valores, ulCount é o número de atributos no modelo.

Determinados objetos podem não ser modificados. Chamar C_SetAttributeValue em tais objetos resulta no código de erro CKR_ACTION_PROHIBITED. Um aplicativo pode consultar o atributo CKA_MODIFIABLE do objeto para determinar se um objeto pode ser modificado.

Somente objetos de sessão podem ser modificados durante uma sessão somente leitura.

O modelo pode especificar novos valores para quaisquer atributos do objeto que podem ser modificados. Se o modelo especificar um valor de um atributo incompatível com outros atributos existentes do objeto, a chamada falhará com o código de retorno CKR_TEMPLATE_INCONSISTENT.

Nem todos os atributos podem ser modificados, veja a Seção 4.1.2 da especificação de API PKCS #11 para obter mais informações.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_SetAttributeValue)(
        CK_SESSION_HANDLE hSession,
        CK_OBJECT_HANDLE hObject,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulCount
    );
    
Valores de retorno CKR_ACTION_PROHIBITED, CKR_ARGUMENTS_BAD, CKR_ATTRIBUTE_READ_ONLY, CKR_ATTRIBUTE_TYPE_INVALID, CKR_ATTRIBUTE_VALUE_INVALID, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OBJECT_HANDLE_INVALID, CKR_OK, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SESSION_READ_ONLY, CKR_TEMPLATE_INCONSISTENT, CKR_TOKEN_WRITE_PROTECTED, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    // Only set supported R/W EP11 attributes
    attributeList := ep11.EP11AttributeP{
        CKA_DECRYPT: true,
    }
    
    SetAttributeValueRequest := &pb.SetAttributeValueRequest{
        Object:     GenerateKeyPair.PrivKeyBytes,
        Attributes: util.AttributeMap(attributeList),
    }
    SetAttributeValueResponse, err := cryptoClient.SetAttributeValue(context.Background(), SetAttributeValueRequest)
    
  • fragmento de código JavaScript

    const attributeTemplate = new util.AttributeMap(
    new util.Attribute(ep11.CKA_SIGN, true)
    );
    
    client.SetAttributeValue({
      Object: keys.PrivKey,
      Attributes: attributeTemplate
    }, (err, response) => {
      callback(err, response);
    });
    

Gerando dados aleatórios

É possível gerar dados aleatórios de alta qualidade, como valores de inicialização (IVs), PIN e senha, para uso em operações criptográficas.

GenerateRandom

A função GenerateRandom gera dados aleatórios. Ao usar essa função, certifique-se de não configurar o comprimento dos dados aleatórios para zero e o ponteiro que indica o local dos dados aleatórios como NULL.

Descrição Liga-se a EP11 m_GenerateRandom, que é uma implementação de C_GenerateRandom de PKCS #11.
Parâmetros
    message GenerateRandomRequest {
        uint64 Len = 1;
    }
    message GenerateRandomResponse {
        bytes Rnd = 1;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_GenerateRandom de PKCS #11.

GenerateRandom é equivalente à função PKCS #11 original. Internamente, a entropia com valor inicial fornecido por hardware é passada por meio de um DRNG compatível com FIPS (ANSI X9.31/ISO 18031, dependendo da versão do Clic).

A biblioteca do host pode gerar números aleatórios sem despachar para o back-end, se a funcionalidade adequada estiver disponível no host. Isso não é feito na implementação atual.

Essa função não suporta uma consulta de tamanho.

Parâmetros
    CK_RV m_GenerateRandom (
        CK_BYTE_PTR rnd, CK_ULONG rndlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_GenerateRandom. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição C_GenerateRandom gera dados aleatórios ou pseudo-aleatórios. hSession é o identificador de sessões, pRandomData aponta para o local que recebe os dados aleatórios e ulRandomLen é o comprimento em bytes dos dados aleatórios ou pseudo-aleatórios a serem gerados.
Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_GenerateRandom)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pRandomData,
        CK_ULONG ulRandomLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVIDOS, CKR_FUNCTION_CANCELADO, CKR_FUNCTION_FALHOU, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_ACTIVE, CKR_RANDOM_NO_RNG, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVÁLIDA, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    GenerateRandomRequest := &pb.GenerateRandomRequest {
      Len: 1024,
    }
    
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(), GenerateRandomRequest)
    
  • fragmento de código JavaScript

    client.GenerateRandom({
      Len: ep11.AES_BLOCK_SIZE
    }, (err, response) => {
      callback(err, response);
    });
    

Criptografando e decriptografando dados

Ao especificar o mecanismo criptográfico, é possível executar funções de criptografia e decriptografia simétrica ou assimétrica. Pode ser necessário chamar uma série de subfunções para criptografar ou descriptografar dados. Por exemplo, a operação de criptografia de dados de múltiplas partes é composta pelas sub-operações EncryptInit, EncryptUpdate e EncryptFinal.

EncryptInit

A função EncryptInit inicializa uma operação de criptografia. É necessário chamar essa função primeiro para executar uma criptografia.

Descrição Liga-se a EP11 m_EncryptInit, que é uma implementação de C_EncryptInit de PKCS #11.
Parâmetros
    message EncryptInitRequest {
        Mechanism Mech = 2;
        bytes Key = 3;
    }
    message EncryptInitResponse {
        bytes State = 1;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_EncryptInit de PKCS #11.

O blob (chave, klen) pode ser um objeto de chave publicável, ou um blob de chave secreta. O tipo de chave deve ser consistente com pmech.

Para mecanismos de chave pública, (key, klen) deve conter um SPKI. Essa SPKI tem a integridade protegida com uma chave MAC, conforme retornada por GenerateKeyPair ou, como alternativa, UnwrapKey. O estado Encrypt é criado sem restrições de sessão.

Para mecanismos de chave secreta, o estado Criptografar herda restrições de sessão de objeto de (key, klen).

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11.

(key, klen) deve ser um blob de chave.

Parâmetros
    CK_RV m_EncryptInit (
        caractere não assinado * estado, size_t * statelen,
        Mecanismo CK_MECHANISM_PTR,
        const unsigned char *key, size_t keylen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_EncryptInit. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_EncryptInit inicializa uma operação de criptografia. hSession é o identificador da sessão, pMechanism aponta para o mecanismo de criptografia, hKey é o identificador da chave de criptografia.

O atributo CKA_ENCRYPT da chave de criptografia, que indica se a chave suporta criptografia, deve ser CK_TRUE.

Após o aplicativo chamar C_EncryptInit, o aplicativo pode chamar a C_Encrypt para criptografar dados em uma única parte; ou chamar C_EncryptUpdate zero ou mais vezes, seguido por C_EncryptFinal, para criptografar dados em várias partes. A operação de criptografia está ativa até que o aplicativo use uma chamada para C_Encrypt ou C_EncryptFinal para obter a parte final do texto cifrado. Para processar dados extras (em partes únicas ou múltiplas), o aplicativo deve chamar C_EncryptInit novamente.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_EncryptInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
Valores de retorno CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_PERMITTED, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENT, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    // Generate 16 bytes of random data for the initialization vector
    GenerateRandomRequest := &pb.GenerateRandomRequest{
        Len: (uint64)(ep11.AES_BLOCK_SIZE),
    }
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(), GenerateRandomRequest)
    if err != nil {
        return nil, fmt.Errorf("GenerateRandom error: %s", err)
    }
    iv := GenerateRandomResponse.Rnd[:ep11.AES_BLOCK_SIZE]
    fmt.Println("Generated IV")
    
    EncryptInitRequest := &pb.EncryptInitRequest{
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        Key:  GenerateKeyResponse.KeyBytes,
    }
    
    EncryptInitResponse, err := cryptoClient.EncryptInit(context.Background(), EncryptInitRequest)
    
  • fragmento de código JavaScript

    client.EncryptInit({
    	Mech: {
        Mechanism: ep11.CKM_AES_CBC_PAD,
        ParameterB: iv
      },
      Key: key
    }, (err, data={}) => {
      cb(err, data.State);
    });
    

Encrypt

A função Encrypt criptografa dados de parte única. Não é necessário executar as sub-operações EncryptUpdate e EncryptFinal para uma criptografia de parte única. Antes de chamar esta função, certifique-se de executar EncryptInit primeiro.

Descrição Liga-se a EP11 m_Encrypt, que é uma implementação de C_Encrypt de PKCS #11.
Parâmetros
    message EncryptRequest {
        bytes State = 1;
        bytes Plain = 2;
    }
    message EncryptResponse {
        bytes Ciphered = 3;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_Encrypt de PKCS #11.

Não atualiza (state, slen).

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11.

O blob state era saída de: EncryptInit.

Parâmetros
    CK_RV m_Encrypt (
        const unsigned char *state, size_t statelen,
        Simples CK_BYTE_PTR, CK_ULONG plainlen,
        Cifrado CK_BYTE_PTR, CK_ULONG_PTR cipheredlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_Encrypt. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_Encrypt criptografa dados de parte única. hSession é o identificador da sessão, pData aponta para os dados, ulDataLen é o comprimento em bytes dos dados, pEncryptedData aponta para o local que recebe os dados criptografados, pulEncryptedDataLen aponta para o local que detém o comprimento em bytes dos dados criptografados.

C_Encrypt usa a convenção que é descrita na Seção 5.2 da especificação de API PKCS #11 sobre a produção de saída.

A operação de criptografia deve ser inicializada com C_EncryptInit. Uma chamada para C_Encrypt sempre finaliza a operação de criptografia ativa, a menos que ela retorne CKR_BUFFER_TOO_SMALL ou seja uma chamada bem-sucedida (ou seja, uma que retorna CKR_OK) para determinar o comprimento do buffer que é necessário para reter o texto cifrado.

O C_Encrypt não pode ser usado para finalizar uma operação de múltiplas partes e deve ser chamado após C_EncryptInit sem intervir chamadas C_EncryptUpdate.

Para alguns mecanismos de criptografia, os dados de texto sem formatação de entrada têm certas restrições de comprimento (porque o mecanismo pode criptografar apenas partes relativamente curtas de texto sem formatação ou porque os dados de entrada do mecanismo devem consistir em um número integral de blocos). Se essas restrições não estiverem satisfeitas, então C_Encrypt falhará com o código de retorno CKR_DATA_LEN_RANGE.

O texto simples e o texto cifrado podem estar no mesmo lugar, ou seja, será OK se pData e pEncryptedData apontarem para o mesmo local.

Para a maioria dos mecanismos, C_Encrypt é equivalente a uma sequência de operações C_EncryptUpdate seguida por C_EncryptFinal.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_Encrypt)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pData,
        CK_ULONG ulDataLen,
        CK_BYTE_PTR pEncryptedData,
        CK_ULONG_PTR pulEncryptedDataLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_INVALID, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_MEMORY, CKR_REMOVIDA, CKR_FUNCTION_CANCELADA, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKRR_SESSION_CLOSED,

Snnipets de código

  • Fragmento de código de Golang

    plainText := "Encrypt this message"
    
    EncryptRequest := &pb.EncryptRequest {
        State: EncryptInitResponse.State,
        Plain: plainText,
    }
    
    EncryptResponse, err := cryptoClient.Encrypt(context.Background(), EncryptRequest)
    
  • fragmento de código JavaScript

    client.Encrypt({
      State: state,
      Plain: Buffer.from(message)
    }, (err, response) => {
      callback(err, response);
    });
    

EncryptUpdate

A função EncryptUpdate continua uma operação de criptografia de múltiplas partes. Antes de chamar esta função, certifique-se de executar EncryptInit primeiro.

Descrição Liga-se a EP11 m_EncryptUpdate, que é uma implementação de C_EncryptUpdate de PKCS #11.
Parâmetros
    message EncryptUpdateRequest {
        bytes State = 1;
        bytes Plain = 2;
    }
    message EncryptUpdateResponse {
        bytes State = 1;
        bytes Ciphered = 3;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_EncryptUpdate de PKCS #11.

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11.

O blob state era saída de: EncryptInit.

Parâmetros
    CK_RV m_EncryptUpdate (
        unsigned char *state, size_t statelen,
        Simples CK_BYTE_PTR, CK_ULONG plainlen,
        Cifrado CK_BYTE_PTR, CK_ULONG_PTR cipheredlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_EncryptUpdate. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_EncryptUpdate continua uma operação de criptografia de várias partes, processando outra parte de dados. hSession é o identificador da sessão, pPart aponta para a parte de dados, ulPartLen é o comprimento da parte de dados, pEncryptedPart aponta para o local que recebe a parte de dados criptografados, pulEncryptedPartLen aponta para o local que detém o comprimento em bytes da parte de dados criptografados.

C_EncryptUpdate usa a convenção que é descrita na Seção 5.2 da especificação de API PKCS #11 sobre a produção de saída.

A operação de criptografia deve ser inicializada com C_EncryptInit. Essa função pode ser chamada qualquer número de vezes em sucessão. Uma chamada para C_EncryptUpdate, que resulta em um erro diferente de CKR_BUFFER_TOO_SMALL, finaliza a operação de criptografia atual.

O plaintext e o ciphertext podem estar no mesmo lugar, ou seja, não há problema de o pPart e o pEncryptedPart apontarem para o mesmo local.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_EncryptUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen,
        CK_BYTE_PTR pEncryptedPart,
        CK_ULONG_PTR pulEncryptedPartLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Snnipets de código

  • Fragmento de código de Golang

    plainText := `
    This is a very long message that needs to be encrypted by performing
    multiple EncrypytUpdate functions`
    
    // Use EncryptUpdate if you would like to breakup
    // the encrypt operation into multiple suboperations
    EncryptUpdateRequest1 := &pb.EncryptUpdateRequest {
        State: EncryptInitResponse.State,
        Plain: plainText[:20],
    }
    
    EncryptUpdateResponse, err := cryptoClient.EncryptUpdate(context.Background(), EncryptUpdateRequest1)
    
    ciphertext := EncryptUpdateResponse.Ciphered[:]
    
    EncryptUpdateRequest2 := &pb.EncryptUpdateRequest {
        State: EncryptUpdateResponse.State,
        Plain: plainText[20:],
    }
    
    EncryptUpdateResponse, err := cryptoClient.EncryptUpdate(context.Background(), EncryptUpdateRequest2)
    
    ciphertext = append(ciphertext, EncryptUpdateResponse.Ciphered...)
    
  • fragmento de código JavaScript

    client.EncryptUpdate({
      State: state,
      Plain: Buffer.from(message.substr(20))
    }, (err, data={}) => {
      cb(err, data.State, Buffer.concat([ciphertext, data.Ciphered]));
    });
    

EncryptFinal

A função EncryptFinal finaliza uma operação de criptografia de múltiplas partes.

Descrição Liga-se a EP11 m_EncryptFinal, que é uma implementação de C_EncryptFinal de PKCS #11.
Parâmetros
    message EncryptFinalRequest {
        bytes State = 1;
    }
    message EncryptFinalResponse {
        bytes Ciphered = 2;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_EncryptFinal de PKCS #11.

Não atualiza (state, slen).

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11.

O blob state foi a saída de: EncryptInit, EncryptUpdate.

Parâmetros
    CK_RV m_EncryptFinal (
        const unsigned char *state, size_t statelen,
        Cifrado CK_BYTE_PTR, CK_ULONG_PTR cipheredlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_EncryptFinal. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_EncryptFinal conclui uma operação de criptografia de várias partes. hSession é o identificador da sessão, pLastEncryptedPart aponta para o local que recebe a última parte dos dados criptografados, se houver, pulLastEncryptedPartLen aponta para o local que detém o comprimento da última parte de dados criptografados.

C_EncryptFinal usa a convenção que é descrita na Seção 5.2 da especificação de API PKCS #11 sobre a produção de saída.

A operação de criptografia deve ser inicializada com C_EncryptInit. Uma chamada para C_EncryptFinal sempre finaliza a operação de criptografia ativa, a menos que ela retorne CKR_BUFFER_TOO_SMALL ou seja uma chamada bem-sucedida (ou seja, uma que retorne CKR_OK) para determinar o comprimento do buffer necessário para reter o texto cifrado.

Para alguns mecanismos de criptografia de várias partes, os dados de texto simples de entrada têm certas restrições de comprimento porque os dados de entrada do mecanismo devem consistir em um número integral de blocos. Se essas restrições não forem satisfeitas, então C_EncryptFinal falha com o código de retorno CKR_DATA_LEN_RANGE.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_EncryptFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pLastEncryptedPart,
        CK_ULONG_PTR pulLastEncryptedPartLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Snnipets de código

  • Fragmento de código de Golang

    EncryptFinalRequest := &pb.EncryptFinalRequest {
        State: EncryptUpdateResponse.State,
    }
    
    EncryptFinalResponse, err := cryptoClient.EncryptFinal(context.Background(), EncryptFinalRequest)
    
  • fragmento de código JavaScript

    client.EncryptFinal({
      State: state
    }, (err, data={}) => {
      cb(err, Buffer.concat([ciphertext, data.Ciphered]));
    });
    

EncryptSingle

A função EncryptSingle processa dados em uma só passagem com uma chamada. Ela não retorna nenhum estado para hospedar e retorna apenas os dados criptografados. Essa função é uma extensão do IBM EP11 para a especificação PKCS n.º 11 padrão e é uma combinação das funções EncryptInit e Encrypt. Ela permite concluir uma operação de criptografia com uma única chamada, em vez de com uma série delas.

Descrição Liga-se a EP11 m_EncryptSingle
Parâmetros
    message EncryptSingleRequest {
        bytes Key = 1;
        Mechanism Mech = 2;
        bytes Plain = 3;
    }
    message EncryptSingleResponse {
        bytes Ciphered = 4;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Variante não padrão de Encrypt. Processa dados em uma passagem, com uma chamada. Não retorna nenhum estado para hospedar, apenas dados criptografados.

Esse é o método preferencial de criptografia de dados em uma passagem para aplicativos de reconhecimento de XCP. Funcionalmente ele é equivalente a EncryptInit seguido imediatamente por Encrypt, mas ele economiza roundtrips, agrupamento e desagrupamento.

Se o back-end suportar chaves residentes, a chave também poderá ser um identificador de chave residente.

Consulte também: Encrypt, EncryptInit, DecryptSingle.

O blob key era saída de: GenerateKey, UnwrapKey.

Parâmetros
    CK_RV m_EncryptSingle (
        const unsigned char *key, size_t keylen,
        Mecanismo CK_MECHANISM_PTR,
        Simples CK_BYTE_PTR, CK_ULONG plainlen,
        Cifrado CK_BYTE_PTR, CK_ULONG_PTR cipheredlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_Encrypt. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).

Snnipets de código

  • Fragmento de código de Golang

    // Generate 16 bytes of random data for the initialization vector
    GenerateRandomRequest := &pb.GenerateRandomRequest{
        Len: (uint64)(ep11.AES_BLOCK_SIZE),
    }
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(),  GenerateRandomRequest)
    if err != nil {
        return nil, fmt.Errorf("GenerateRandom error: %s", err)
    }
    
    iv := GenerateRandomResponse.Rnd[:ep11.AES_BLOCK_SIZE]
    fmt.Println("Generated IV")
    
    plainText := "Encrypt this message"
    EncryptSingleRequest := &pb.EncryptSingleRequest{
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        Key:  GenerateKeyResponse.KeyBytes,
        Plain: plainText,
    }
    
    EncryptSingleResponse, err := cryptoClient.EncryptSingle(context.Background(), EncryptSingleRequest)
    
  • fragmento de código JavaScript

    client.EncryptSingle({
      Mech: {
        Mechanism: ep11.CKM_AES_CBC_PAD,
        ParameterB: iv
      },
      Key: aliceDerived.NewKey,
      Plain: Buffer.from(message)
    }, (err, response) => {
      callback(err, response);
    });
    

ReencryptSingle

Com a função ReencryptSingle, é possível decriptografar dados com a chave original e, em seguida, criptografar os dados brutos com uma chave diferente em uma única chamada dentro do HSM de nuvem. Os tipos de chave que são usados para esta operação podem ser iguais ou diferentes. Essa função é uma extensão de IBM EP11 para a especificação padrão PKCS #11. Essa única chamada é uma opção viável em que uma grande quantidade de dados precisa ser recriptografada com diferentes chaves e ignora a necessidade de executar uma combinação de funções DecryptSingle e EncryptSingle para cada item de dados que precisa ser recriptografado. Ela não retorna nenhum estado para hospedar e retorna apenas os dados recriptografados.

Descrição Liga ao EP11 m_ReencryptSingle.
Parâmetros
    message ReencryptSingleRequest {
        bytes DecKey = 1;
        bytes EncKey = 2;
        Mechanism DecMech = 3;
        Mechanism EncMech = 4;
        bytes Ciphered = 5;
    }
    message ReencryptSingleResponse {
        bytes Reciphered = 6;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Variante não padrão de Encrypt. Processa dados em uma passagem, com uma chamada. Não retorna nenhum estado a ser hospedado, apenas os dados recriptografados.

Decriptografa dados com a chave original e, em seguida, criptografa os dados brutos com uma chave diferente dentro do HSM de nuvem.

Parâmetros
    CK_RV m_ReencryptSingle (
        const unsigned char * dkey, size_t dkeylen,
        const unsigned char * ekey, size_t ekeylen,
        CK_MECHANISM_PTR decmech,
        CK_MECHANISM_PTR encmech,
        CK_BYTE_PTR in, CK_ULONG inlen,
        Cifrado CK_BYTE_PTR, CK_ULONG_PTR cipheredlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_Encrypt e C_Decrypt. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).

Snnipets de código

  • Fragmento de código de Golang

    var msg = []byte("Data to encrypt")
    EncryptKey1Request := &pb.EncryptSingleRequest{
        Key:   GenerateKey1Response.KeyBytes,
        Mech:  &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        Plain: msg,
    }
    EncryptKey1Response, err := cryptoClient.EncryptSingle(context.Background(), EncryptKey1Request)
    if err != nil {
        return nil, fmt.Errorf("Encrypt error: %s", err)
    }
    
    ReencryptSingleRequest := &pb.ReencryptSingleRequest{
        DecKey:   GenerateKey1Response.KeyBytes, // original key
        EncKey:   GenerateKey2Response.KeyBytes, // new key
        DecMech:  &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        EncMech:  &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        Ciphered: RencryptKey1Response.Ciphered,
    }
    
    ReencryptSingleResponse, err := cryptoClient.ReencryptSingle(context.Background(), ReencryptSingleRequest)
    
  • fragmento de código JavaScript

    client.ReencryptSingle({
    Decmech: {
      Mechanism: mech1,
      ParameterB: iv
    },
    Encmech: {
      Mechanism: mech2,
      ParameterB: iv
    },
    In: encipherState.Ciphered,
    DKey: keyBlob1,
    Ekey: keyBlob2,
    }, (err, response) => {
    callback(err, response);
    });
    

DecryptInit

A função DecryptInit inicializa uma operação de decriptografia. É necessário chamar essa função primeiro para executar uma decriptografia.

Descrição Liga-se a EP11 m_DecryptInit, que é uma implementação de C_DecryptInit de PKCS #11.
Parâmetros
    message DecryptInitRequest {
        Mechanism Mech = 2;
        bytes Key = 3;
    }
    message DecryptInitResponse {
        bytes State = 1;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição Implementação de C_DecryptInit de PKCS #11.
Parâmetros
    CK_RV m_DecryptInit (
        caractere não assinado * estado, size_t * statelen,
        Mecanismo CK_MECHANISM_PTR,
        const unsigned char *key, size_t keylen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_DecryptInit. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_DecryptInit inicializa uma operação de decriptografia. hSession é o identificador da sessão, pMechanism aponta para o mecanismo de decriptografia, hKey é o identificador da chave de decriptografia.

O atributo CKA_DECRYPT da chave de decriptografia, que indica se a chave suporta decriptografia, deve ser CK_TRUE.

Após o aplicativo chamar C_DecryptInit, o aplicativo pode chamar C_Decrypt para decriptografar dados em uma única parte ou chamar C_DecryptUpdate zero ou mais vezes, seguido por C_DecryptFinal, para decriptografar dados em várias partes. A operação de decriptografia está ativa até que o aplicativo use uma chamada para C_Decrypt ou C_DecryptFinal para obter a peça final de texto sem formatação. Para processar dados extras (em partes únicas ou múltiplas), o aplicativo deve chamar C_EncryptInit novamente.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_DecryptInit)(
        K_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_PERMITTED, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENT, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    // Generate 16 bytes of random data for the initialization vector
    GenerateRandomRequest := &pb.GenerateRandomRequest{
        Len: (uint64)(ep11.AES_BLOCK_SIZE),
    }
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(), GenerateRandomRequest)
    if err != nil {
        return nil, fmt.Errorf("GenerateRandom error: %s", err)
    }
    iv := GenerateRandomResponse.Rnd[:ep11.AES_BLOCK_SIZE]
    fmt.Println("Generated IV")
    
    DecryptInitRequest := &pb.DecryptInitRequest{
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        Key:  GenerateKeyResponse.KeyBytes,
    }
    
    DecryptInitResponse, err := cryptoClient.DecryptInit(context.Background(), DecryptInitRequest)
    
  • fragmento de código JavaScript

    client.DecryptInit({
      Mech: {
        Mechanism: ep11.CKM_AES_CBC_PAD,
        ParameterB: iv
      },
      Key: key
    }, (err, data={}) => {
      cb(err, data.State);
    });
    

Decrypt

A função Decrypt decriptografa dados em uma parte única. Não é necessário executar as sub-operações DecryptUpdate e DecryptFinal para uma criptografia de parte única. Antes de chamar esta função, certifique-se de executar DecryptInit primeiro.

Descrição Liga-se a EP11 m_Decrypt, que é uma implementação de C_Decrypt de PKCS #11.
Parâmetros
    message DecryptRequest {
        bytes State = 1;
        bytes Ciphered = 2;
    }
    message DecryptResponse {
       bytes Plain = 3;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação do PKCS #11 C_Decrypt. Ele não atualiza (state, slen).

O estado, o objeto binário grande (BLOB) slen deve ser mapeado por meio do parâmetro hSession de PKCS #11. O estado BLOB foi a saída de DecryptInit.

Parâmetros
    CK_RV m_Decrypt (const unsigned char *state, size_t slen,
        CK_BYTE_PTR cipher, CK_ULONG clen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_Decrypt. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_Decrypt decriptografa dados criptografados em uma única parte.

  • hSession é o identificador de sessão.
  • pEncryptedData aponta para os dados criptografados.
  • ulEncryptedDataLen é o comprimento dos dados criptografados.
  • pData aponta para o local que recebe os dados recuperados.
  • pulDataLen aponta para o local que contém o comprimento dos dados recuperados.

C_Decrypt usa a convenção que é descrita na Seção 5.2 da especificação de API PKCS #11 sobre a produção de saída.

A operação de descriptografia deve ser inicializada com C_EncryptInit. Uma chamada para C_Decrypt sempre finaliza a operação de decriptografia ativa, a menos que retorne CKR_BUFFER_TOO_SMALL ou seja uma chamada bem-sucedida com CKR_OK retornado para determinar o comprimento do buffer que é necessário para reter o texto simples.

C_Decrypt não pode ser usado para finalizar uma operação de múltiplas partes e precisa ser chamado após C_DecryptInit sem intervir em chamadas para C_DecryptUpdate.

O texto cifrado e o texto sem formatação podem estar no mesmo local, o que significa que é aceitável se pEncryptedData e pData apontarem para o mesmo local.

Se os dados de texto cifrado de entrada não puderem ser decriptografados porque têm um comprimento inadequado, CKR_ENCRYPTED_DATA_INVALID ou CKR_ENCRYPTED_DATA_LEN_RANGE poderá ser retornado.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_Decrypt)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pEncryptedData,
        CK_ULONG ulEncryptedDataLen,
        CK_BYTE_PTR pData,
        CK_ULONG_PTR pulDataLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_ENCRYPTED_DATA_INVALID, CKR_ENCRYPTED_DATA_LEN_RANGE, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    DecryptRequest := &pb.DecryptRequest{
        State:    DecryptInitResponse.State,
        Ciphered: ciphertext, // encrypted data from a previous encrypt operation
    }
    
    DecryptResponse, err := cryptoClient.Decrypt(context.Background(), DecryptRequest)
    
  • fragmento de código JavaScript

    client.Decrypt({
      State: state,
      Ciphered: ciphertext
    }, (err, response) => {
      callback(err, response);
    });
    

DecryptUpdate

A função DecryptUpdate continua uma operação de decriptografia de múltiplas partes. Antes de chamar esta função, certifique-se de executar DecryptInit primeiro.

Descrição Liga-se a EP11 m_DecryptUpdate, que é uma implementação de C_DecryptUpdate de PKCS #11.
Parâmetros
    message DecryptUpdateRequest {
        bytes State = 1;
        bytes Ciphered = 2;
    }
    message DecryptUpdateResponse {
        bytes State = 1;
        bytes Plain = 3;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_DecryptUpdate de PKCS #11.

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11.

O blob state foi a saída de: DecryptInit.

Parâmetros
    CK_RV m_DecryptUpdate (
        unsigned char *state, size_t statelen,
        Cifrado CK_BYTE_PTR, CK_ULONG cipheredlen,
        Simples CK_BYTE_PTR, CK_ULONG_PTR plainlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_DecryptUpdate. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_DecryptUpdate continua uma operação de decriptografia de várias partes, processando outra parte de dados criptografados. hSession é o identificador da sessão, pEncryptedPart aponta para a parte de dados criptografados, ulEncryptedPartLen é o comprimento da parte de dados criptografados, pPart aponta para o local que recebe a parte de dados recuperados, pulPartLen aponta para o local que detém o comprimento da parte de dados recuperados.

C_DecryptUpdate usa a convenção que é descrita na Seção 5.2 da especificação de API PKCS #11 sobre a produção de saída.

A operação de descriptografia deve ser inicializada com C_DecryptInit. Essa função pode ser chamada qualquer número de vezes em sucessão. Uma chamada para C_DecryptUpdate, que resulta em um erro diferente de CKR_BUFFER_TOO_SMALL, finaliza a operação de decriptografia atual.

O texto cifrado e o texto simples podem estar no mesmo local, ou seja, será OK se pEncryptedPart e pPart apontarem para o mesmo local.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_DecryptUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pEncryptedPart,
        CK_ULONG ulEncryptedPartLen,
        CK_BYTE_PTR pPart,
        CK_ULONG_PTR pulPartLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_PERMITTED, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENT, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    // Use DecryptUpdate if you would like to breakup
    // the decrypt operation into multiple suboperations
    DecryptUpdateRequest1 := &pb.DecryptUpdateRequest{
        State:    DecryptInitResponse.State,
        Ciphered: ciphertext[:16], // encrypted data from a previous encrypt operation
    }
    
    DecryptUpdateResponse, err := cryptoClient.DecryptUpdate(context.Background(), DecryptUpdateRequest1)
    
    plaintext := DecryptUpdateResponse.Plain[:]
    
    DecryptUpdateRequest2 := &pb.DecryptUpdateRequest{
        State:    DecryptUpdateResponse.State,
        Ciphered: ciphertext[16:], // encrypted data from a previous encrypt operation
    }
    
    DecryptUpdateResponse, err := cryptoClient.DecryptUpdate(context.Background(), DecryptUpdateRequest2)
    
    plaintext = append(plaintext, DecryptUpdateResponse.Plain...)
    
  • fragmento de código JavaScript

    client.DecryptUpdate({
    State: state,
    Ciphered: ciphertext.slice(0, 16)
    }, (err, data={}) => {
    cb(err, data.State, data.Plain);
    });
    

DecryptFinal

A função DecryptFinal finaliza uma operação de decriptografia de múltiplas partes.

Descrição Liga-se a EP11 m_DecryptFinal, que é uma implementação de C_DecryptFinal de PKCS #11.
Parâmetros
    message DecryptFinalRequest {
        bytes State = 1;
    }
    message DecryptFinalResponse {
        bytes Plain = 2;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_DecryptFinal de PKCS #11.

Não atualiza (state, slen).

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11.

O blob state era de saída de: DecryptInit, DecryptUpdate.

Parâmetros
    CK_RV m_DecryptFinal (
        const unsigned char *state, size_t statelen,
        Simples CK_BYTE_PTR, CK_ULONG_PTR plainlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_DecryptFinal. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_DecryptFinal conclui uma operação de decriptografia de várias partes. hSession é o identificador da sessão, pLastPart aponta para o local que recebe a última parte de dados recuperados, se houver, pulLastPartLen aponta para o local que detém o comprimento da última parte de dados recuperados.

C_DecryptFinal usa a convenção que é descrita na Seção 5.2 da especificação de API PKCS #11 sobre a produção de saída.

A operação de descriptografia deve ser inicializada com C_DecryptInit. Uma chamada para C_DecryptFinal sempre finaliza a operação de decriptografia ativa, a menos que retorne CKR_BUFFER_TOO_SMALL ou seja uma chamada bem-sucedida (ou seja, uma que retorne CKR_OK) para determinar o comprimento do buffer que é necessário para conter o texto sem formatação.

Se os dados de texto cifrado de entrada não puderem ser decriptografados porque têm um comprimento inapropriado, então CKR_ENCRYPTED_DATA_INVALID ou CKR_ENCRYPTED_DATA_LEN_RANGE poderá ser retornado.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_DecryptFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pLastPart,
        CK_ULONG_PTR pulLastPartLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_ENCRYPTED_DATA_INVALID, CKR_ENCRYPTED_DATA_LEN_RANGE, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    DecryptFinalRequest := &pb.DecryptFinalRequest {
      State: DecrypUpdateResponse.State,
    }
    
    DecryptFinalResponse, err := cryptoClient.DecryptFinal(context.Background(), DecryptFinalRequest)
    
  • fragmento de código JavaScript

    client.DecryptFinal({
      State: state
    }, (err, data={}) => {
      cb(err, Buffer.concat([plaintext, data.Plain]));
    });
    

DecryptSingle

A função DecryptSingle processa dados em uma só passagem com uma chamada. Ela não retorna nenhum estado para hospedar e retorna apenas os dados descriptografados. Essa função é uma extensão do IBM EP11 para a especificação PKCS n.º 11 padrão e é uma combinação das funções DecryptInit e Decrypt. Ela permite concluir uma operação de decriptografia com uma única chamada, em vez de com uma série delas.

Descrição Liga ao EP11 m_DecryptSingle.
Parâmetros
    message DecryptSingleRequest {
        bytes Key = 1;
        Mechanism Mech = 2;
        bytes Ciphered = 3;
    }
    message DecryptSingleResponse {
        bytes Plain = 4;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Variante não padrão de Decrypt. Processa dados em uma passagem, com uma chamada. Não retorna nenhum estado para hospedar, apenas dados decriptografados.

Esse é o método preferencial de criptografia de dados em uma passagem para aplicativos de reconhecimento de XCP. Funcionalmente ele é equivalente a DecryptInit seguido imediatamente por Decrypt, mas ele salva roundtrips, agrupamento e desagrupamento.

Se o back-end suportar chaves residentes, a chave também poderá ser um identificador de chave residente.

Consulte também: Decrypt, DecryptInit, EncryptSingle.

O blob key era saída de: GenerateKey, UnwrapKey.

Parâmetros
    CK_RV m_DecryptSingle (
        const unsigned char *key, size_t keylen,
        Mecanismo CK_MECHANISM_PTR,
        Cifrado CK_BYTE_PTR, CK_ULONG cipheredlen,
        Simples CK_BYTE_PTR, CK_ULONG_PTR plainlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_Decrypt. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).

Snnipets de código

  • Fragmento de código de Golang

    // Generate 16 bytes of random data for the initialization vector
    GenerateRandomRequest := &pb.GenerateRandomRequest{
        Len: (uint64)(ep11.AES_BLOCK_SIZE),
    }
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(),  GenerateRandomRequest)
    if err != nil {
        return nil, fmt.Errorf("GenerateRandom error: %s", err)
    }
    iv := GenerateRandomResponse.Rnd[:ep11.AES_BLOCK_SIZE]
    fmt.Println("Generated IV")
    
    DecryptSingleRequest := &pb.DecryptSingleRequest {
        Key:      GenerateKeyResponse.KeyBytes,
        Mech:     &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        Ciphered: EncryptSingleResponse.Ciphered, // encrypted data from a previous encrypt operation
    }
    
    DecryptSingleResponse, err := cryptoClient.DecryptSingle(context.Background(), DecryptSingleRequest)
    
  • fragmento de código JavaScript

    client.DecryptSingle({
      Mech: {
        Mechanism: ep11.CKM_AES_CBC_PAD,
        ParameterB: iv
      },
      Key: bobDerived.NewKey,
      Ciphered: ciphertext
    }, (err, response) => {
      callback(err, response);
    });
    

Assinando e verificando dados

O GREP11 fornece um conjunto de funções para assinar dados e verificar assinaturas ou códigos de autenticação de mensagem (MACs). Pode ser necessário chamar uma série de subfunções para executar uma operação de assinatura. Por exemplo, a operação de assinatura de dados de múltiplas partes é composta pelas sub-operações SignInit, SignUpdate e SignFinal.

SignInit

A função SignInit inicializa uma operação de assinatura. É necessário chamar essa função primeiro para executar uma operação de assinatura.

Descrição Liga ao EP11 m_SignInit, que é uma implementação do PKCS #11 C_SignInit.
Parâmetros
    message SignInitRequest {
        Mechanism Mech = 2;
        bytes PrivKey = 3;
    }
    message SignInitResponse {
        bytes State = 1;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição Implementação de C_SignInit de PKCS #11.
Parâmetros
    CK_RV m_SignInit (
        caractere não assinado * estado, size_t * statelen,
        Mecanismo CK_MECHANISM_PTR,
        const unsigned char *privKey, size_t privKeylen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_Decrypt. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_SignInit inicializa uma operação de assinatura, em que a assinatura é um apêndice dos dados. hSession é o identificador da sessão, pMechanism aponta para o mecanismo de assinatura, hKey é o identificador da chave de assinatura.

O atributo CKA_SIGN da chave de assinatura, que indica se a chave suporta assinaturas com apêndice, deve ser CK_TRUE.

Após o aplicativo chamar C_SignInit, o aplicativo pode ligar para C_Sign para assinar em uma única parte; ou chamar C_SignUpdate uma ou mais vezes, seguido por C_SignFinal, para assinar dados em várias partes. A operação de assinatura está ativa até o aplicativo usar uma chamada para que C_Sign ou C_SignFinal obtenham a assinatura. Para processar dados extras (em partes únicas ou múltiplas), o aplicativo deve chamar C_SignInit novamente.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_SignInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_PERMITTED, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENT, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    SignInitRequest := &pb.SignInitRequest {
        Mech:    &pb.Mechanism{Mechanism: ep11.CKM_SHA1_RSA_PKCS},
        PrivKey: GenerateKeyPairResponse.PrivKeyBytes,
    }
    
    SignInitResponse, err := cryptoClient.SignInit(context.Background(), SignInitRequest)
    
  • fragmento de código JavaScript

    client.SignInit({
      Mech: {
        Mechanism: ep11.CKM_SHA1_RSA_PKCS
      },
      PrivKey: keys.PrivKeyBytes
    }, (err, data={}) => {
      cb(err, data.State);
    });
    

Assinar

A função Sign assina dados de parte única. Não é necessário executar as sub-operações SignUpdate e SignFinal para uma assinatura de parte única. Antes de chamar esta função, certifique-se de executar SignInit primeiro.

Descrição Liga-se a EP11 m_Sign, que é uma implementação de C_Sign de PKCS #11.
Parâmetros
    message SignRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message SignResponse {
        bytes Signature = 3;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_Sign de PKCS #11.

Não atualiza (state, slen).

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11. (A biblioteca de host deve mapear a sessão para o estado armazenado.)

O blob state era saída de: SignInit.

Parâmetros
    CK_RV m_Sign (
        const unsigned char *state, size_t statelen,
        Dados CK_BYTE_PTR, CK_ULONG datalen,
        Assinatura CK_BYTE_PTR, CK_ULONG_PTR signaturelen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_Sign. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_Sign assina dados em uma única parte, em que a assinatura é um apêndice dos dados. hSession é o identificador da sessão, pData aponta para os dados, ulDataLen é o comprimento dos dados, pSignature aponta para o local que recebe a assinatura, pulSignatureLen aponta para o local que detém o comprimento da assinatura.

C_Sign usa a convenção que é descrita na Seção 5.2 da especificação de API PKCS #11 sobre a produção de saída.

A operação de assinatura deve ser inicializada com C_SignInit. Uma chamada para C_Sign sempre finaliza a operação de assinatura ativa, a menos que ela retorne CKR_BUFFER_TOO_SMALL ou seja uma chamada bem-sucedida (ou seja, uma que retorne CKR_OK) para determinar o comprimento do buffer necessário para reter a assinatura.

C_Sign não pode ser usado para finalizar uma operação de múltiplas partes e deve ser chamado após C_SignInit sem intervir chamadas C_SignUpdate.

Para a maioria dos mecanismos, C_Sign é equivalente a uma sequência de operações C_SignUpdate seguida por C_SignFinal.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_Sign)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pData,
        CK_ULONG ulDataLen,
        CK_BYTE_PTR pSignature,
        CK_ULONG_PTR pulSignatureLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_INVALID, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN, CKR_FUNCTION_REJECTED.

Snnipets de código

  • Fragmento de código de Golang

    msgHash := sha256.Sum256([]byte("This data needs to be signed"))
    SignRequest := &pb.SignRequest{
        State: SignInitResponse.State,
        Data:  msgHash[:],
    }
    
    // Sign the data
    SignResponse, err := cryptoClient.Sign(context.Background(), SignRequest)
    
  • fragmento de código JavaScript

    client.Sign({
      State: state,
      Data: dataToSign
    }, (err, data={}) => {
      cb(err, data.Signature);
    });
    

SignUpdate

A função SignUpdate continua uma operação de assinatura de múltiplas partes. Antes de chamar esta função, certifique-se de executar SignInit primeiro.

Descrição Liga-se a EP11 m_SignUpdate, que é uma implementação de C_SignUpdate de PKCS #11.
Parâmetros
    message SignUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message SignUpdateResponse {
        bytes State = 1;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_SignUpdate de PKCS #11.

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11. (A biblioteca de host deve mapear a sessão para o estado armazenado.)

O blob state era saída de: SignInit.

Parâmetros
    CK_RV m_SignUpdate (
        unsigned char *state, size_t statelen,
        Dados CK_BYTE_PTR, CK_ULONG datalen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_SignUpdate. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_SignUpdate continua uma operação de assinatura de várias partes, processando outra parte de dados. hSession é o identificador da sessão, pPart aponta para a parte de dados, ulPartLen é o comprimento da parte de dados.

A operação de assinatura deve ser inicializada com C_SignInit. Essa função pode ser chamada qualquer número de vezes em sucessão. Uma chamada para C_SignUpdate que resulta em um erro finaliza a operação de assinatura atual.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_SignUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    // Use SignUpdate if you would like to breakup
    // the sign operation into multiple suboperations
    SignUpdateRequest1 := &pb.SignUpdateRequest {
        State: SignInitResponse.State,
        Data:  msgHash[:16],
    }
    
    SignUpdateResponse, err := cryptoClient.SignUpdate(context.Background(), SignUpdateRequest1)
    
    SignUpdateRequest2 := &pb.SignUpdateRequest {
        State: SignUpdateResponse.State,
        Data:  msgHash[16:],
    }
    
    SignUpdateResponse, err := cryptoClient.SignUpdate(context.Background(), SignUpdateRequest2)
    
  • fragmento de código JavaScript

    client.SignUpdate({
      State: state,
      Data: digest
    }, (err, response) => {
      callback(err, response);
    });
    

SignFinal

A função SignFinal finaliza uma operação de assinatura de múltiplas partes.

Descrição Liga-se a EP11 m_SignFinal, que é uma implementação de C_SignFinal de PKCS #11.
Parâmetros
    message SignFinalRequest {
        bytes State = 1;
    }
    message SignFinalResponse {
        bytes Signature = 2;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_SignFinal de PKCS #11.

Não atualiza (state, slen).

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11. (A biblioteca de host deve mapear a sessão para o estado armazenado.)

O blob state era a saída de: SignInit, SignUpdate.

Parâmetros
    CK_RV m_SignFinal (
        const unsigned char *state, size_t statelen,
        Assinatura CK_BYTE_PTR, CK_ULONG_PTR signaturelen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_SignFinal. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_SignFinal conclui uma operação de assinatura de várias partes, retornando a assinatura. hSession é o identificador da sessão, pSignature aponta para o local que recebe a assinatura, pulSignatureLen aponta para o local que detém o comprimento da assinatura.

C_SignFinal usa a convenção que é descrita na Seção 5.2 da especificação de API PKCS #11 sobre a produção de saída.

A operação de assinatura deve ser inicializada com C_SignInit. Uma chamada para C_SignFinal sempre finaliza a operação de assinatura ativa, a menos que ela retorne CKR_BUFFER_TOO_SMALL ou seja uma chamada bem-sucedida (ou seja, uma que retorne CKR_OK) para determinar o comprimento do buffer necessário para reter a assinatura.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_SignFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pSignature,
        CK_ULONG_PTR pulSignatureLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN, CKR_FUNCTION_REJECTED.

Snnipets de código

  • Fragmento de código de Golang

    SignFinalRequest := &pb.SignFinalRequest {
        State: SignUpdateResponse.State,
    }
    
    SignFinalResponse, err := cryptoClient.SignFinal(context.Background(), SignFinalRequest)
    
  • fragmento de código JavaScript

    client.SignFinal({
      State: state
    }, (err, response) => {
      callback(err, response);
    });
    

SignSingle

A função SignSingle assina os dados ou autentica-os por MACs em uma só passagem com uma chamada e sem construir um estado de compilação intermediário. Ela não retorna nenhum estado para hospedar e retorna apenas resultado. Essa função é uma extensão do IBM EP11 para a especificação PKCS n.º 11 padrão e é uma combinação das funções SignInit e Sign. Ela permite concluir uma operação de assinatura com uma única chamada, em vez de com uma série delas.

Descrição Liga ao EP11 m_SignSingle.
Parâmetros
    message SignSingleRequest {
        bytes PrivKey = 1;
        Mechanism Mech = 2;
        bytes Data = 3;
    }
    message SignSingleResponse {
        bytes Signature = 4;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Extensão não padrão, combinação de SignInit e Sign. Assinaturas ou dados de MACs em uma passagem, com uma chamada, sem construir o estado de compilação intermediária. Não retorna nenhum estado para hospedar, apenas resultado.

Essa é a maneira preferencial de assinar, sem uma ida e volta, criptografia e descriptografia extra. Funcionalmente, SignSingle é equivalente a SignInit seguido imediatamente por Sign.

O blob (key, klen) e o mecanismo pmech juntos devem ser transmissíveis para SignInit.

As solicitações de vários dados para assinaturas HMAC e CMAC são suportadas (subvariantes 2 e 3).

Consulte também: SignInit, Sign, VerifySingle.

Parâmetros
    CK_RV m_SignSingle (
        const unsigned char *privKey, size_t privKeylen,
        Mecanismo CK_MECHANISM_PTR,
        Dados CK_BYTE_PTR, CK_ULONG datalen,
        Assinatura CK_BYTE_PTR, CK_ULONG_PTR signaturelen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_Decrypt. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).

Snnipets de código

  • Fragmento de código de Golang

    msgHash := sha256.Sum256([]byte("This data needs to be signed"))
    SignSingleRequest := &pb.SignSingleRequest {
        PrivKey: GenerateKeyPairResponse.PrivKeyBytes,
        Mech:    &pb.Mechanism{Mechanism: ep11.CKM_SHA256_RSA_PKCS},
        Data:    msgHash[:],
    }
    
    SignSingleResponse, err := cryptoClient.SignSingle(context.Background(), SignSingleRequest)
    
  • fragmento de código JavaScript

    client.SignSingle({
      Mech: {
        Mechanism: ep11.CKM_ECDSA
      },
      PrivKey: key,
      Data: digest
    }, (err, response) => {
      callback(err, response);
    });
    

VerifyInit

A função VerifyInit inicializa uma operação de verificação. É necessário chamar essa função primeiro para verificar uma assinatura.

Descrição Liga-se a EP11 m_VerifyInit, que é uma implementação de C_VerifyInit de PKCS #11.
Parâmetros
    message VerifyInitRequest {
        Mechanism Mech = 2;
        bytes PubKey = 3;
    }
    message VerifyInitResponse {
        bytes State = 1;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_VerifyInit de PKCS #11. Dado um blob de chave (key, klen), inicialize um estado de sessão de verificação em (state, slen). O blob de chave pode ser um objeto de chave pública ou bytes de chave HMAC. O tipo de blob de chave deve ser consistente com pmech.

Para mecanismos de chave pública, (key, klen) deve conter um SPKI. Esse SPKI CKA_UNWRAP pode ser autenticado por MAC (como retornado anteriormente por GenerateKeyPair) ou apenas pelo próprio SPKI (quando obtido de uma origem externa, como um certificado).

Se uma operação HMAC for inicializada, as restrições de sessão do objeto Verify serão herdadas da chave HMAC. Como os SPKIs não estão vinculados às sessões, os estados de Verificação de chave pública são livres de sessão.

O blob key,klen deve ser mapeado por meio do parâmetro hKey de PKCS #11.

Nota: SignInit e VerifyInit são internamente o mesmo para HMAC e outros mecanismos simetric/MAC.

Parâmetros
    CK_RV m_VerifyInit (
        caractere não assinado * estado, size_t * statelen,
        Mecanismo CK_MECHANISM_PTR,
        const unsigned char *pubKey, size_t pubKeylen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_VerifyInit. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_VerifyInit inicializa uma operação de verificação, em que a assinatura é um apêndice dos dados. hSession é o identificador da sessão, pMechanism aponta para a estrutura que especifica o mecanismo de verificação, hKey é o identificador da chave de verificação.

O atributo CKA_VERIFY da chave de verificação, que indica se a chave suporta verificação em que a assinatura é um apêndice aos dados, deve ser CK_TRUE.

Após o aplicativo chamar C_VerifyInit, ele poderá chamar C_Verify para verificar uma assinatura em dados em uma única parte; ou chamar C_VerifyUpdate uma ou mais vezes, seguido por C_VerifyFinal, para verificar uma assinatura em dados em várias partes. A operação de verificação está ativa até que o aplicativo chame C_Verify ou C_VerifyFinal. Para processar dados extras (em partes únicas ou múltiplas), o aplicativo deve chamar C_VerifyInit novamente.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_PERMITTED, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENT, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    VerifyInitRequest := &pb.VerifyInitRequest {
      Mech:   &pb.Mechanism{Mechanism: ep11.CKM_SHA1_RSA_PKCS},
      PubKey: GenerateKeyPairResponse.PubKeyBytes,
    }
    
    VerifyInitResponse, err := cryptoClient.VerifyInit(context.Background(), VerifyInitRequest)
    
  • fragmento de código JavaScript

    client.VerifyInit({
      Mech: {
        Mechanism: ep11.CKM_SHA1_RSA_PKCS
      },
      PubKey: keys.PubKeyBytes
    }, (err, data={}) => {
      cb(err, signature, data.State);
    });
    

Verificar

A função Verify verifica uma assinatura em dados de uma única parte. Não é necessário executar as sub-operações VerifyUpdate e VerifyFinal para uma criptografia de parte única. Antes de chamar esta função, certifique-se de executar VerifyInit primeiro.

Descrição Liga-se a EP11 m_Verify, que é uma implementação de C_Verify de PKCS #11.
Parâmetros
    message VerifyRequest {
        bytes State = 1;
        bytes Data = 2;
        bytes Signature = 3;
    }
    message VerifyResponse {
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_Verify de PKCS #11.

Não atualiza (state, slen).

A ordem relativa de dados e assinatura é revertida relativa para VerifySingle.

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11. (A biblioteca de host deve mapear a sessão para o estado armazenado.)

O blob state era saída de: VerifyInit.

Parâmetros
    CK_RV m_Verify (
        const unsigned char *state, size_t statelen,
        Dados CK_BYTE_PTR, CK_ULONG datalen,
        Assinatura CK_BYTE_PTR, CK_ULONG signaturelen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_Verify. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_Verify verifica uma assinatura em uma operação de parte única, em que a assinatura é um apêndice dos dados. hSession é o identificador da sessão, pData aponta para os dados, ulDataLen é o comprimento dos dados, pSignature aponta para a assinatura, ulSignatureLen é o comprimento da assinatura.

A operação de verificação deve ser inicializada com C_VerifyInit. Uma chamada para C_Verify sempre finaliza a operação de verificação ativa.

Uma chamada bem-sucedida para C_Verify precisa retornar ou o valor CKR_OK (indicando que a assinatura fornecida é válida) ou CKR_SIGNATURE_INVALID (indicando que a assinatura fornecida é inválida). Se a assinatura for inválida puramente com base em seu comprimento, então CKR_SIGNATURE_LEN_RANGE precisa ser retornado. Em qualquer um desses casos, a operação de assinatura ativa é finalizada.

C_Verify não pode ser usado para finalizar uma operação de múltiplas partes e deve ser chamado após C_VerifyInit sem intervir chamadas C_VerifyUpdate.

Para a maioria dos mecanismos, C_Verify é equivalente a uma sequência de operações C_VerifyUpdate seguida por C_VerifyFinal.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_Verify)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pData,
        CK_ULONG ulDataLen,
        CK_BYTE_PTR pSignature,
        CK_ULONG ulSignatureLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_INVALID, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SIGNATURE_INVALID, CKR_SIGNATURE_LEN_RANGE.

Snnipets de código

  • Fragmento de código de Golang

    VerifyRequest := &pb.VerifyRequest {
        State:     VerifyInitResponse.State,
        Data:      msgHash[:],
        Signature: SignResponse.Signature,
    }
    
    VerifyResponse, err := cryptoClient.Verify(context.Background(), VerifyRequest)
    
  • fragmento de código JavaScript

    client.Verify({
      State: state,
      Data: dataToSign,
      Signature: signature
    }, (err, data={}) => {
      cb(err, signature);
    });
    

VerifyUpdate

A função VerifyUpdate continua uma operação de verificação de múltiplas partes. Antes de chamar esta função, certifique-se de executar VerifyInit primeiro.

Descrição Liga-se a EP11 m_VerifyUpdate, que é uma implementação de C_VerifyUpdate de PKCS #11.
Parâmetros
    message VerifyUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message VerifyUpdateResponse {
        bytes State = 1;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_VerifyUpdate de PKCS #11.

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11. (A biblioteca de host deve mapear a sessão para o estado armazenado.)

O blob state era saída de: VerifyInit.

Parâmetros
    CK_RV m_VerifyUpdate (
        unsigned char *state, size_t statelen,
        Dados CK_BYTE_PTR, CK_ULONG datalen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_VerifyUpdate. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_VerifyUpdate continua uma operação de verificação de várias partes, processando outra parte de dados. hSession é o identificador da sessão, pPart aponta para a parte de dados, ulPartLen é o comprimento da parte de dados.

A operação de verificação deve ser inicializada com C_VerifyInit. Essa função pode ser chamada qualquer número de vezes em sucessão. Uma chamada para C_VerifyUpdate que resulta em um erro finaliza a operação de verificação atual.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Snnipets de código

  • Fragmento de código de Golang

    // Use VerifyUpdate if you would like to breakup
    // the verify operation into multiple suboperations
    VerifyUpdateRequest1 := &pb.VerifyUpdateRequest {
      State: VerifyInitResponse.State,
      Data:  msgHash[:16],
    }
    
    VerifyUpdateResponse, err := cryptoClient.VerifyUpdate(context.Background(), VerifyUpdateRequest1)
    
    VerifyUpdateRequest2 := &pb.VerifyUpdateRequest {
      State: VerifyUpdateResponse.State,
      Data:  msgHash[16:],
    }
    
    VerifyUpdateResponse, err := cryptoClient.VerifyUpdate(context.Background(), VerifyUpdateRequest2)
    
  • fragmento de código JavaScript

    client.VerifyUpdate({
      State: state,
      Data: digest
    }, (err, response) => {
      callback(err, response);
    });
    

VerifyFinal

A função VerifyFinal finaliza uma operação de verificação de múltiplas partes.

Descrição Liga-se a EP11 m_VerifyFinal, que é uma implementação de C_VerifyFinal de PKCS #11.
Parâmetros
    message VerifyFinalRequest {
        bytes State = 1;
        bytes Signature = 2;
    }
    message VerifyFinalResponse {
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_VerifyFinal de PKCS #11.

Não atualiza (state, slen).

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11. (A biblioteca de host deve mapear a sessão para o estado armazenado.)

O blob state era a saída de: VerifyInit, VerifyUpdate.

Parâmetros
    CK_RV m_VerifyFinal (
        const unsigned char *state, size_t statelen,
        Assinatura CK_BYTE_PTR, CK_ULONG signaturelen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_VerifyFinal. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_VerifyFinal conclui uma operação de verificação de várias partes, verificando a assinatura. hSession é o identificador da sessão, pSignature aponta para a assinatura, ulSignatureLen é o comprimento da assinatura.

A operação de verificação deve ser inicializada com C_VerifyInit. Uma chamada para C_VerifyFinal sempre finaliza a operação de verificação ativa.

Uma chamada bem-sucedida para C_VerifyFinal precisa retornar ou o valor CKR_OK (indicando que a assinatura fornecida é válida) ou CKR_SIGNATURE_INVALID (indicando que a assinatura fornecida é inválida). Se a assinatura for inválida com base em seu comprimento, então CKR_SIGNATURE_LEN_RANGE precisa ser retornado. Em qualquer um desses casos, a operação de verificação ativa é finalizada.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pSignature,
        CK_ULONG ulSignatureLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SIGNATURE_INVALID, CKR_SIGNATURE_LEN_RANGE.

Snnipets de código

  • Fragmento de código de Golang

    VerifyFinalRequest := &pb.VerifyFinalRequest {
        State:     VerifyUpdateResponse.State,
        Signature: SignResponse.Signature,
    }
    
    VerifyFinalResponse, err := cryptoClient.VerifyFinal(context.Background(), VerifyFinalRequest)
    
  • fragmento de código JavaScript

    client.VerifyFinal({
      State: state,
      Signature: signature
    }, (err, response) => {
      callback(err, response);
    });
    

VerifySingle

A função VerifySingle assina os dados ou autentica-os por MACs em uma só passagem com uma chamada e sem construir um estado de compilação intermediário. Ela não retorna nenhum estado para hospedar e retorna apenas o resultado da verificação. Essa função é uma extensão do IBM EP11 para a especificação PKCS n.º 11 padrão e é uma combinação das funções VerifyInit e Verify. Ela permite concluir uma operação de verificação com uma única chamada, em vez de com uma série delas.

Descrição Liga ao EP11 m_VerifySingle.
Parâmetros
    message VerifySingleRequest {
        bytes PubKey = 1;
        Mechanism Mech = 2;
        bytes Data = 3;
        bytes Signature = 4;
    }
    message VerifySingleResponse {
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Extensão não padrão, combinação de VerifyInit e Verify. Assinaturas ou dados de MACs em uma passagem, com uma chamada, sem construir o estado de compilação intermediária. Não retorna nenhum estado para o host, apenas o resultado da verificação. Nenhuma consulta de tamanho está disponível porque esta função retorna um booleano.

Esta é a maneira preferencial de verificar uma assinatura, sem uma ida e volta, criptografia, descriptografia extra. Funcionalmente, VerifySingle é equivalente a VerifyInit seguido imediatamente por um Verify.

O blob (key, klen) e o mecanismo pmech juntos devem ser transmissíveis para VerifyInit.

Para mecanismos de chave pública, (key, klen) deve conter um SPKI. Esse SPKI poderá ter o MAC executado (como retornado como uma chave pública do GenerateKeyPair) ou apenas o próprio SPKI (se obtido de uma origem externa, como um certificado).

Consulte também: VerifyInit, Verify, SignSingle.

Parâmetros
    CK_RV m_VerifySingle (
        const unsigned char *pubKey, size_t pubKeylen,
        Mecanismo CK_MECHANISM_PTR,
        Dados CK_BYTE_PTR, CK_ULONG datalen,
        Assinatura CK_BYTE_PTR, CK_ULONG signaturelen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_VerifySingle. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).

Snnipets de código

  • Fragmento de código de Golang

    VerifySingleRequest := &pb.VerifySingleRequest {
        PubKey:    GenerateKeyPairResponse.PubKeyByytes,
        Mech:      &pb.Mechanism{Mechanism: ep11.CKM_SHA256_RSA_PKCS},
        Data:      msgHash[:],
        Signature: SignSingleResponse.Signature,
    }
    
    VerifySingleResponse, err := cryptoClient.VerifySingle(context.Background(), VerifySingleRequest)
    
  • fragmento de código JavaScript

    client.VerifySingle({
      Mech: {
        Mechanism: ep11.CKM_SHA256_RSA_PKCS
      },
      PubKey: keys.PubKey,
      Data: digest,
      Signature: signature
    }, (err, response) => {
      callback(err, response);
    });
    

Protegendo a integridade de dados por meio de trechos de mensagem

O GREP11 fornece um conjunto de funções para criar trechos de mensagem que são projetados para proteger a integridade de um dado. Pode ser necessário chamar uma série de subfunções para executar uma operação de compilação. Por exemplo, a operação de compilação de múltiplas partes é composta pelas sub-operações DigestInit, DigestUpdate e DigestFinal.

DigestInit

A função DigestInit inicializa uma operação de compilação de mensagem. É necessário executar essa função primeiro para executar uma operação de compilação.

Descrição Liga-se a EP11 m_DigestInit, que é uma implementação de C_DigestInit de PKCS #11.
Parâmetros
    message DigestInitRequest {
        Mechanism Mech = 2;
    }
    message DigestInitResponse {
        bytes State = 1;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_DigestInit de PKCS #11.

Criar estado de compilação agrupado.

Nota: as consultas de tamanho são suportadas, mas o estado agrupado é sempre retornado pelo back-end, diferentemente da maioria das consultas de tamanho (que retornam um tamanho de saída, em vez de saída real). Os estados Digest são suficientemente pequenos, de modo que não introduzem sobrecarga de transporte perceptível.

Durante as consultas de tamanho, o host apenas descarta o estado retornado e relata o tamanho de blob (em len). Quando o blob estiver sendo retornado, len será verificado com relação ao tamanho retornado.

O blob state,len deve ser mapeado por meio do parâmetro hSession de PKCS #11. (A biblioteca do host deve ligar o blob à sessão.)

Parâmetros
    CK_RV m_DigestInit (
        unsigned char * state, size_t * len,
        const mecanismo CK_MECHANISM_PTR,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_DigestInit. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_DigestInit inicializa uma operação de compilação de mensagens. hSession é o identificador da sessão, pMechanism aponta para o mecanismo de compilação.

Após o aplicativo chamar C_DigestInit, ele poderá chamar C_Digest para compilar os dados em uma única parte; ou chamar C_DigestUpdate zero ou mais vezes, seguido pelo C_DigestFinal, para compilar os dados em várias partes. A operação de compilação de mensagens estará ativa até que o aplicativo use uma chamada para C_Digest ou C_DigestFinal para obter o trecho da mensagem. Para processar dados extras (em partes únicas ou múltiplas), o aplicativo deve chamar 1C_DigestInit1 novamente.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_DigestInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Snnipets de código

  • Fragmento de código de Golang

    DigestInitRequest := &pb.DigestInitRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_SHA256},
    }
    
    DigestInitResponse, err := cryptoClient.DigestInit(context.Background(), DigestInitRequest)
    
  • fragmento de código JavaScript

    client.DigestInit({
      Mech: {
        Mechanism: ep11.CKM_SHA256
      }
    }, (err, response) => {
      callback(err, response);
    });
    

Compilação

A função Digest compila dados de parte única. Não é necessário chamar as funções DigestUpdate e DigestFinal para compilar dados de parte única. Antes de chamar esta função, certifique-se de executar DigestInit primeiro. Ao configurar parâmetros, não especifique o comprimento dos dados de entrada como zero e o ponteiro que aponta para o local dos dados de entrada como NULL.

Descrição Liga-se a EP11 m_Digest, que é uma implementação de C_Digest de PKCS #11.
Parâmetros
    message DigestRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message DigestResponse {
        bytes Digest = 3;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_Digest de PKCS #11.

Se um objeto de compilação tiver exatamente 0 (zero) bytes anexados a ele após a criação, em qualquer combinação de transferências de zero bytes, ele ainda pode executar uma Compilação de transmissão única, mesmo que ele precise ser rejeitado por uma implementação estrita.

Não atualiza (state, slen).

Implementações podem executar DigestUpdate, DigestFinalou Digest chama objetos de compilação de texto não criptografado no código do host, ignorando os backends do HSM completamente. Essa escolha pode ou não ser visível para o código do host e não impacta a segurança da operação (já que objetos sem criptografia podem não compilar dados sensíveis).

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11. O blob state era de saída de: DigestInit.

Parâmetros
    CK_RV m_Digest (
        const unsigned char *state, size_t statelen,
        Dados CK_BYTE_PTR, CK_ULONG datalen,
        Compilação CK_BYTE_PTR, CK_ULONG_PTR digestlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_Digest. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_Digest compila dados em uma única parte. hSession é o identificador da sessão, pData aponta para os dados, ulDataLen é o comprimento dos dados, pDigest aponta para o local que recebe o trecho da mensagem, pulDigestLen aponta para o local que detém o comprimento do trecho da mensagem.

C_Digest usa a convenção que é descrita na Seção 5.2 da especificação de API PKCS #11 sobre a produção de saída.

A operação de compilação deve ser inicializada com C_DigestInit. Uma chamada para C_Digest sempre finaliza a operação de compilação ativa, a menos que ela retorne CKR_BUFFER_TOO_SMALL ou seja uma chamada bem-sucedida (ou seja, uma que retorne CKR_OK) para determinar o comprimento do buffer necessário para reter a compilação da mensagem.

O C_Digest não pode ser usado para finalizar uma operação de várias partes e deve ser chamado após C_DigestInit sem intervir chamadas C_DigestUpdate.

Os dados de entrada e a saída de compilação podem estar no mesmo lugar, ou seja, não há problema de o pData e o pDigest apontarem para o mesmo local.

C_Digest é equivalente a uma sequência de operações C_DigestUpdate seguida por C_DigestFinal.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_Digest)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pData,
        CK_ULONG ulDataLen,
        CK_BYTE_PTR pDigest,
        CK_ULONG_PTR pulDigestLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Snnipets de código

  • Fragmento de código de Golang

    digestData := []byte("Create a digest for this string")
    DigestRequest := &pb.DigestRequest {
        State: DigestInitResponse.State,
        Data:  digestData,
    }
    
    DigestResponse, err := cryptoClient.Digest(context.Background(), DigestRequest)
    
  • fragmento de código JavaScript

    client.Digest({
        State: state,
        Data: Buffer.from(digestData)
      }, (err, data={}) => {
        cb(err, data.Digest);
      });
    }
    

DigestUpdate

A função DigestUpdate continua uma operação de compilação de múltiplas partes. Antes de chamar esta função, certifique-se de executar DigestInit primeiro. Ao configurar parâmetros, não especifique o comprimento dos dados de entrada como zero e o ponteiro que aponta para o local dos dados de entrada como NULL.

Descrição Liga-se a EP11 m_DigestUpdate, que é uma implementação de C_DigestUpdate de PKCS #11.
Parâmetros
    message DigestUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message DigestUpdateResponse {
        bytes State = 1;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_DigestUpdate de PKCS #11.

DigestUpdate é polimórfico, aceitando objetos de compilação agrupados ou limpos, atualizando o estado no mesmo formato.

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11. (A biblioteca de host deve mapear a sessão para o estado armazenado.)

O blob state era saída de: DigestInit, DigestUpdate, DigestKey.

Consulte também: DigestInit

Parâmetros
    CK_RV m_DigestUpdate (
        unsigned char *state, size_t statelen,
        Dados CK_BYTE_PTR, CK_ULONG datalen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_DigestUpdate. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_DigestUpdate continua uma operação de compilação de mensagens de várias partes, processando outra parte de dados. hSession é o identificador da sessão, pPart aponta para a parte de dados, ulPartLen é o comprimento da parte de dados.

A operação de compilação de mensagem deve ser inicializada com C_DigestInit. Chamadas para essa função e C_DigestKey podem ser intercaladas quantas vezes forem necessárias e em qualquer ordem. Uma chamada para C_DigestUpdate que resulta em um erro finaliza a operação de compilação atual.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_DigestUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Snnipets de código

  • Fragmento de código de Golang

    // Use DigestUpdate if you would like to breakup
    // the digest operation into multiple suboperations
    DigestUpdateRequest1 := &pb.DigestUpdateRequest {
        State: DigestInitResponse.State,
        Data:  digestData[:16],
    }
    
    DigestUpdateResponse, err := cryptoClient.DigestUpdate(context.Background(), DigestUpdateRequest1)
    
    DigestUpdateRequest2 := &pb.DigestUpdateRequest {
        State: DigestUpdateResponse.State,
        Data:  digestData[16:],
    }
    
    DigestUpdateResponse, err := cryptoClient.DigestUpdate(context.Background(), DigestUpdateRequest2)
    
  • fragmento de código JavaScript

    client.DigestUpdate({
      State: state,
      Data: Buffer.from(digestData.substr(0, 64))
    }, (err, data={}) => {
      cb(err, data.State);
    });
    

DigestFinal

A função DigestFinal finaliza uma operação de compilação de múltiplas partes.

Descrição Liga-se a EP11 m_DigestFinal, que é uma implementação de C_DigestFinal de PKCS #11.
Parâmetros
    message DigestFinalRequest {
        bytes State = 1;
    }
    message DigestFinalResponse {
        bytes Digest = 2;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Implementação de C_DigestFinal de PKCS #11.

DigestFinal é polimórfico, aceitando ambos os objetos de compilação agrupados ou limpos.

Não atualiza (state, slen).

O blob state,slen deve ser mapeado por meio do parâmetro hSession do PKCS nº11.

O blob state era saída de: DigestInit, DigestUpdate, DigestKey.

Parâmetros
    CK_RV m_DigestFinal (
        const unsigned char *state, size_t statelen,
        Compilação CK_BYTE_PTR, CK_ULONG_PTR digestlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_DigestFinal. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).
Descrição

C_DigestFinal conclui uma operação de compilação de mensagens de várias partes, retornando o trecho da mensagem. hSession é o identificador da sessão, pDigest aponta para o local que recebe o trecho da mensagem, pulDigestLen aponta para o local que detém o comprimento do trecho da mensagem.

C_DigestFinal usa a convenção que é descrita na Seção 5.2 da especificação de API PKCS #11 sobre a produção de saída.

A operação de compilação deve ser inicializada com C_DigestInit. Uma chamada para C_DigestFinal sempre finaliza a operação de compilação ativa, a menos que ela retorne CKR_BUFFER_TOO_SMALL ou seja uma chamada bem-sucedida (ou seja, uma que retorne CKR_OK) para determinar o comprimento do buffer necessário para reter a compilação da mensagem.

Parâmetros
    CK_DEFINE_FUNCTION(CK_RV, C_DigestFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pDigest,
        CK_ULONG_PTR pulDigestLen
    );
    
Valores de retorno CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Snnipets de código

  • Fragmento de código de Golang

    DigestFinalRequest := &pb.DigestFinalRequest {
        State: DigestUpdateResponse.State,
    }
    
    DigestFinalResponse, err := cryptoClient.DigestFinal(context.Background(), DigestFinalRequest)
    
  • fragmento de código JavaScript

    client.DigestFinal({
      State: state
    }, (err, response) => {
      callback(err, response);
    });
    

DigestSingle

A função DigestSingle compila dados em uma só passagem com uma chamada e sem construir um estado de compilação intermediário e roundtrips desnecessários. Essa função é uma extensão do IBM EP11 para a especificação PKCS n.º 11 padrão e é uma combinação das funções DigestInit e Digest. Ela permite concluir uma operação de compilação com uma única chamada, em vez de com uma série delas.

Descrição Liga ao EP11 m_DigestSingle.
Parâmetros
    message DigestSingleRequest {
        Mechanism Mech = 1;
        bytes Data = 2;
    }
    message DigestSingleResponse {
        bytes Digest = 3;
    }
    
Valores de retorno Agrupa o erro EP11 na mensagem Grep11Error.
Descrição

Extensão não padrão, combinação de DigestInit e Digest. Compila dados em uma passagem, com uma chamada, sem construir um estado de compilação intermediário e roundtrips desnecessárias.

Esse é o método preferencial de compilação de texto não criptografado para aplicativos direcionados a XCP. Funcionalmente, DigestSingle é equivalente a DigestInit seguido imediatamente por Digest.

Se uma chave precisa ser compilada, deve-se usar DigestInit e DigestKey, uma vez que essa função não manipula blobs de chave.

Não retorna nenhum estado para o host, apenas o resultado da compilação. Não há parâmetros não PKCS #11, uma vez que tudo é usado diretamente da chamada de PKCS #11.

Parâmetros
    CK_RV m_DigestSingle (
        Mecanismo CK_MECHANISM_PTR,
        Dados CK_BYTE_PTR, CK_ULONG datalen,
        Compilação CK_BYTE_PTR, CK_ULONG_PTR digestlen,
        destino de target_t
    );
    
Valores de retorno Um subconjunto de valores de retorno C_DigestSingle. Para obter mais informações, consulte o capítulo Valores de retorno do documento de estrutura da biblioteca Enterprise PKCS #11 (EP11).

Snnipets de código

  • Fragmento de código de Golang

    digestData := []byte("Create a digest for this string")
    DigestSingleRequest := &pb.DigestSingleRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_SHA256},
        Data: digestData,
    }
    
    DigestSingleResponse, err := cryptoClient.DigestSingle(context.Background(), DigestSingleRequest)
    
  • fragmento de código JavaScript

    client.DigestSingle({
      Mech: {
        Mechanism: ep11.CKM_SHA256
      },
      Data: Buffer.from(digestData)
    }, (err, response) => {
      callback(err, response);
    });
    

Exemplos de código

A API GREP11 suporta linguagens de programação com bibliotecas gRPC. Dois repositórios de amostra do GitHub são fornecidos para você testar a API do GREP11: