Operaciones criptográficas: API de GREP11

IBM Cloud® Hyper Protect Crypto Services proporciona un conjunto de funciones de criptografía que se ejecutan en un Módulo de seguridad de hardware(HSM)A physical appliance that provides on-demand encryption, key management, and key storage as a managed service. en la nube. Puede realizar operaciones criptográficas accediendo de forma remota a estas funciones con Enterprise PKCS #11 (EP11) a través de llamadas de API de gRPC (también denominada GREP11).

Para obtener más información sobre la relación que guardan las funciones de GREP11 con PKCS #11 y EP11, consulte Introducción a GREP11.

La API GREP11 puede procesar hasta 500 solicitudes/segundo para una única unidad criptográfica.

Acceso a la API

Un punto final de API GREP11, una clave de API de ID de servicio, un punto final de IAM son necesarios para la inicialización antes de realizar cualquier llamada de función de API GREP11. Para obtener más información, consulte Generación de una solicitud de API de GREP11.

Manejo de errores

GREP11 se basa en la especificación gRPC para el manejo de errores. Cuando se produce un error, los clientes gRPC reciben un almacenamiento intermedio de protocolo message Status.

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

En el mensaje de error,

  • code incluye el código de estado, que debe ser un valor de tipo enumerado (enum) del campo google.rpc.Code.
  • message incluye un mensaje de error para el desarrollador en inglés. Cualquier mensaje de error dirigido al usuario debe ser localizado y enviado en el campo google.rpc.Status.details, o localizado por el usuario.
  • details ofrece una lista de mensajes con los detalles del error. Hay disponible un conjunto típico de tipos de mensajes para que lo utilice la API.

GREP11 utiliza el campo Detail para adjuntar información de código de error adicional.

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

El campo Code se puede convertir al valor CK_RV en PKCS #11. Este campo contiene los códigos de error definidos por la especificación PKCS #11 o las extensiones de proveedor definidas por EP11. EP11 utiliza solamente un subconjunto de valores de devolución que define PKCS #11. Para obtener más información, consulte la sección Valores de retorno 10.1.6 en la publicación Enterprise PKCS #11 Library structure.

Hay disponible un ejemplo en Golang que trata los errores.

Lista de funciones de GREP11

Las funciones de PKCS #11 que están marcadas con un asterisco (*) en la tabla se implementan mediante EP11 a través de gRPC. Otras no se implementan.

Tabla 1. Describe las funciones implementadas en EP11 sobre gRPC
PKCS #11 Enterprise PKCS #11 Enterprise PKCS #11 a través de gRPC Descripción
C_Initialize N/D N/D Inicializa Cryptoki.
C_Finalize N/D N/D Limpia los recursos varios asociados con Cryptoki.
C_GetInfo N/D N/D Obtiene información general a través de Cryptoki.
C_GetFunctionList N/D N/D Obtiene puntos de entrada de las funciones de biblioteca de Cryptoki.
C_GetSlotList N/D N/D Obtiene una lista de ranuras en el sistema.
C_GetSlotInfo N/D N/D Obtiene información sobre una ranura en particular.
C_GetTokenInfo N/D N/D Obtiene información sobre una señal en particular.
C_WaitForSlotEvent N/D N/D Espera a que se genere un suceso de ranura (inserción de señal, eliminación, etc.).
C_GetMechanismList* m_GetMechanismList GetMechanismList Obtiene una lista de los mecanismos soportados por una señal.
C_GetMechanismInfo* m_GetMechanismInfo GetMechanismInfo Obtiene información sobre un mecanismo en particular.
C_InitToken N/D N/D Inicializa una señal.
C_InitPIN N/D N/D Inicializa el PIN de usuario normal.
C_SetPIN N/D N/D Modifica el PIN del usuario actual.
C_OpenSession N/D N/D Abre una conexión entre una aplicación y una señal en particular o configurar una devolución de llamada de aplicación para la inserción de señales.
C_CloseSession N/D N/D Cierra una sesión.
C_CloseAllSessions N/D N/D Cierra todas las sesiones con una señal.
C_GetSessionInfo N/D N/D Obtiene información sobre la sesión.
C_GetOperationState N/D N/D Obtiene el estado de las operaciones criptográficas de una sesión.
C_SetOperationState N/D N/D Defina el estado de las operaciones criptográficas de una sesión.
C_Login N/D N/D Inicia sesión en una señal.
C_Logout N/D N/D Finaliza la sesión de una señal.
C_CreateObject N/D N/D Crea un objeto.
C_CopyObject N/D N/D Crea una copia de un objeto.
C_DestroyObject N/D N/D Destruye un objeto.
C_GetObjectSize N/D N/D Obtiene el tamaño de un objeto en bytes.
C_GetAttributeValue* m_GetAttributeValue GetAttributeValue Obtiene un valor de atributo de un objeto.
C_SetAttributeValue* m_SetAttributeValue SetAttributeValue Modifica un valor de atributo de un objeto. Sólo se pueden modificar los atributos booleanos.
C_FindObjectsInit N/D N/D Inicializa una operación de búsqueda de objetos.
C_FindObjects N/D N/D Continúa una operación de búsqueda de objetos.
C_FindObjectsFinal N/D N/D Finaliza una operación de búsqueda de objetos.
C_EncryptInit* m_EncryptInit EncryptInit Inicializa una operación de cifrado.
C_Encrypt* m_Encrypt Cifrar Cifra los datos de una sola parte.
C_EncryptUpdate* m_EncryptUpdate EncryptUpdate Continúa una operación de cifrado de varias partes.
C_EncryptFinal* m_EncryptFinal EncryptFinal Finaliza una operación de cifrado de varias partes.
N/D m_EncryptSingle EncryptSingle Extensión de IBM, variante no estándar de Encrypt. Procesa los datos de un paso con una llamada. No devuelve ningún estado al host que no sean datos cifrados.
N/D m_ReencryptSingle ReencryptSingle Extensión de IBM, variante no estándar de Encrypt. Descifra los datos con la clave original y cifra los datos en bruto con una clave diferente en una sola llamada dentro de la nube de HSM. No devuelve ningún estado al host que no sea los datos que se han vuelto a cifrar.
C_DecryptInit* m_DecryptInit DecryptInit Inicializa una operación de descifrado.
C_Decrypt* m_Decrypt Descifrar Descifra datos cifrados de una sola parte.
C_DecryptUpdate* m_DecryptUpdate DecryptUpdate Continúa una operación de descifrado de varias partes.
C_DecryptFinal* m_DecryptFinal DecryptFinal Finaliza una operación de descifrado de varias partes.
N/D m_DecryptSingle DecryptSingle Extensión de IBM, variante no estándar de Decrypt. Procesa los datos de un paso con una llamada. No devuelve ningún estado al host que no sean datos descifrados.
C_DigestInit* m_DigestInit DigestInit Inicializa una operación de resumen de mensajes.
C_Digest* m_Digest Digest Resume los datos de una sola parte. La longitud de los datos de entrada no puede ser cero y el puntero que apunta a la ubicación de datos de entrada no puede ser NULL.
C_DigestUpdate* m_DigestUpdate DigestUpdate Continúa una operación de resumen de varias partes. La longitud de los datos de entrada no puede ser cero y el puntero que apunta a la ubicación de datos de entrada no puede ser NULL.
C_DigestKey N/D N/D Resume una clave.
C_DigestFinal* m_DigestFinal DigestFinal Finaliza una operación de resumen de varias partes.
N/D m_DigestSingle DigestSingle Combinación de extensión no estándar y extensión de IBM de DigestInit y Digest. Resume datos de un paso con una llamada, sin crear un estado de resumen intermedio ni viajes de ida y vuelta innecesarios
C_SignInit* m_SignInit SignInit Inicializa una operación de firma.
C_Sign* m_Sign Signo Firma datos de una sola parte.
C_SignUpdate* m_SignUpdate SignUpdate Continúa una operación de firma de varias partes.
C_SignFinal* m_SignFinal SignFinal Finaliza una operación de firma de varias partes.
C_SignRecoverInit N/D N/D Inicializa una operación de firma, donde los datos se recuperan de la firma.
C_SignRecover N/D N/D Firma datos de una sola parte, donde los datos se recuperan de la firma.
N/D m_SignSingle SignSingle Combinación de extensión no estándar y extensión de IBM de SignInit y Sign. Firma o calcula el MAC de los datos de un paso con una llamada sin crear ningún estado de resumen intermedio. No devuelve ningún estado al host que no sea el resultado.
C_VerifyInit* m_VerifyInit VerifyInit Inicializa una operación de verificación.
C_Verify* m_Verify Verificar Verifica una firma en datos de una sola parte.
C_VerifyUpdate* m_VerifyUpdate VerifyUpdate Continúa una operación de verificación de varias partes.
C_VerifyFinal* m_VerifyFinal VerifyFinal Finaliza una operación de verificación de varias partes.
C_VerifyRecoverInit N/D N/D Inicializa una operación de verificación en la que los datos se recuperan de la firma.
C_VerifyRecover N/D N/D Verifica una firma en datos de una sola parte, donde los datos se recuperan de la firma.
N/D m_VerifySingle VerifySingle Combinación de extensión no estándar y extensión de IBM de VerifyInit y Verify. Firma o calcula el MAC de los datos de un paso con una llamada sin crear ningún estado de resumen intermedio. No devuelve ningún estado al host que no sea el resultado de la verificación.
C_DigestEncryptUpdate N/D N/D Continúa las operaciones simultáneas de resumen y cifrado de varias partes.
C_DecryptDigestUpdate N/D N/D Continúa las operaciones simultáneas de descifrado y resumen de varias partes.
C_SignEncryptUpdate N/D N/D Continúa las operaciones simultáneas de firma y cifrado de varias partes.
C_DecryptVerifyUpdate N/D N/D Continúa las operaciones simultáneas de descifrado y verificación de varias partes.
C_GenerateKey* m_GenerateKey GenerateKey Genera una clave secreta.
C_GenerateKeyPair* m_GenerateKeyPair GenerateKeyPair Genera un par de clave pública y clave privada.
C_WrapKey* m_WrapKey WrapKey Envuelve (cifra) una clave.
C_UnwrapKey* m_UnwrapKey UnwrapKey Desenvuelve (descifra) una clave.
N/D N/D RewrapKeyBlob Transfiere la propiedad de un BLOB controlado por la clave maestra actual a la nueva clave maestra cuando se confirma la nueva clave maestra. Esta función es un mandato de administración especial que solo está soportado por GREP11.
C_DeriveKey* m_DeriveKey DeriveKey Deriva una clave de una clave base.
C_SeedRandom N/D N/D Añade material de inicio al generador de números aleatorios.
C_GenerateRandom* m_GenerateRandom GenerateRandom Genera datos aleatorios. La longitud de los datos aleatorios no puede ser cero y el valor del puntero que apunta a la ubicación de los datos aleatorios no puede ser NULL. La longitud máxima de los datos aleatorios que se pueden solicitar es de 1 millón de bytes.
C_GetFunctionStatus N/D N/D Función heredada que siempre devuelve CKR_FUNCTION_NOT_PARALLEL.
C_CancelFunction N/D N/D Función heredada que siempre devuelve CKR_FUNCTION_NOT_PARALLEL.

Mecanismos soportados

Un mecanismo se conoce como un proceso para implementar una operación criptográfica. Puede variar en función del nivel de firmware en la tarjeta criptográfica. En la tabla siguiente se muestran los mecanismos soportados actualmente y cómo se relacionan con las categorías de función de GREP11 comunes.

Tabla 2. Describe los mecanismos GREP11 soportados
Grupo de funciones Mecanismos soportados
Cifrar y descifrar 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
Firmar y 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
Digest CKM_SHA_1, CKM_SHA224, CKM_SHA256, CKM_SHA384, CKM_SHA512, CKM_SHA512_224, CKM_SHA512_256
Generar clave o generar par de claves 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
Envolver y desenvolver 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
Derive 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 sólo da soporte a operaciones de una sola parte que no pueden utilizar ninguna de las funciones de actualización de GREP11, como EncryptUpdate, DecryptUpdate y DigestUpdate.

2: Este mecanismo sólo está disponible para las operaciones de GREP11 SignSingle y VerifySingle.

3: Este mecanismo no está soportado por la tarjeta criptográfica IBM 4768 y no está disponible para las operaciones SignUpdate y VerifyUpdate.

4: Este mecanismo da soporte a operaciones de una sola parte (SignInit, Sign, VerifyInit, Verify), SignSingle y VerifySingle.

Atributos y tipos de claves soportados

Los atributos de GREP11 definen características de objeto que configuran cómo se puede utilizar y acceder a un objeto. En la tabla siguiente se muestran los atributos soportados y su relación con los distintos tipos de claves soportados.

Tabla 3. Describe los atributos soportados
Atributo Descripción Tipos de claves soportados
CKA_CHECK_VALUE La suma de comprobación de la clave Claves AES, claves DES
CKA_COPYABLE Si se establece en CKA_TRUE, el objeto se puede copiar utilizando la función PKCS#11 C_CopyObject Claves privadas EC, claves públicas CE, claves privadas RSA, claves públicas RSA, claves privadas DH, claves públicas DH, claves privadas DSA, claves públicas DSA, claves AES, claves DES, claves genéricas
CKA_DECRYPT CK_TRUE si la clave da soporte al descifrado. Claves privadas EC, claves privadas RSA, claves privadas DH, claves privadas DSA, claves AES, claves DES, claves genéricas
CKA_DERIVE CK_TRUE si la clave da soporte a la derivación de claves (otras claves se pueden derivar de esta clave). El valor predeterminado es CK_FALSE. Claves privadas EC, claves públicas CE, claves privadas RSA, claves públicas RSA, claves privadas DH, claves públicas DH, claves privadas DSA, claves públicas DSA, claves AES, claves DES, claves genéricas
CKA_EC_PARAMS (CKA_ECDSA_PARAMS) Codificación DER de un valor de parámetros ANSI X9.62. Claves privadas CE, claves públicas CE
CKA_ENCRYPT CK_TRUE si la clave da soporte al cifrado. Claves públicas EC, claves públicas RSA, claves públicas DH, claves públicas DSA, claves AES, claves DES, claves genéricas
CKA_EXTRACTABLE CK_TRUE si la clave es extraíble y se puede encapsular. Claves privadas EC, claves privadas RSA, claves privadas DH, claves privadas DSA, claves AES, claves DES, claves genéricas
CKA_IBM_PQC_PARAMS Parámetros de soporte para mecanismos de criptografía postcuántica. En el caso del mecanismo de Dilithium CKM_IBM_DILITHIUM, proporciona un identificador de objeto convertido (OID) que representa la intensidad del algoritmo Dilithium que se va a utilizar. Actualmente, solo se admite la fuerza de Dilithium 4 round 2. Claves de Dilithium
CKA_KEY_TYPE Tipo de clave. Claves privadas EC, claves públicas CE, claves privadas RSA, claves públicas RSA, claves privadas DH, claves públicas DH, claves privadas DSA, claves públicas DSA, claves AES, claves DES, claves genéricas
CKA_LOCAL CK_TRUE sólo si la clave se ha generado localmente (en la señal) con una llamada de C_GenerateKey o C_GenerateKeyPair o se ha creado con una llamada de C_CopyObject como una copia de una clave, que tenía su atributo CKA_LOCAL establecido en CK_TRUE. Claves privadas EC, claves públicas CE, claves privadas RSA, claves públicas RSA, claves privadas DH, claves públicas DH, claves privadas DSA, claves públicas DSA, claves AES, claves DES, claves genéricas
CKA_MODIFIABLE Establézcalo en CK_TRUE si el objeto se puede modificar. Claves privadas EC, claves públicas CE, claves privadas RSA, claves públicas RSA, claves privadas DH, claves públicas DH, claves privadas DSA, claves públicas DSA, claves AES, claves DES, claves genéricas
CKA_MODULUS_BITS Longitud en bits del módulo n. Claves públicas RSA
CKA_PUBLIC_EXPONENT Exponente público e. Claves privadas RSA
INFORMACIÓN_CLAVE_PÚBLICA_CKM Codificación DER de SubjectPublicKeyInfo para la clave pública. El valor se deriva de los datos de clave pública subyacentes y está vacío de forma predeterminada. Claves públicas RSA, claves públicas EC
CKA_SIGN CK_TRUE si la clave da soporte a la firma donde la firma es un apéndice de los datos. Claves privadas EC, claves privadas RSA, claves privadas DH, claves privadas DSA, claves AES, claves DES, claves genéricas
CKA_TRUSTED Se puede confiar en el certificado o la clave para la aplicación que se ha creado. Claves públicas EC, claves públicas RSA, claves públicas DH, claves públicas DSA, claves AES, claves DES, claves genéricas
CKA_UNWRAP CK_TRUE si la clave da soporte al desenvolvimiento (se puede utilizar para desenvolver otras claves). Claves privadas EC, claves privadas RSA, claves privadas DH, claves privadas DSA, claves AES, claves DES, claves genéricas
CKA_VALUE_LEN Longitud en bytes del valor de clave. Claves AES
CKA_VERIFY CK_TRUE si la clave da soporte a la verificación donde la firma es un apéndice de los datos. Claves públicas EC, claves públicas RSA, claves públicas DH, claves públicas DSA, claves AES, claves DES, claves genéricas
CKA_WRAP CK_TRUE si la clave da soporte al envolmimiento (se puede utilizar para envolver otras claves). Claves públicas EC, claves públicas RSA, claves públicas DH, claves públicas DSA, claves AES, claves DES, claves genéricas
CKA_WRAP_WITH_TRUSTED CK_TRUE si la clave solo se puede envolver con una clave de envoltura que tiene establecido CKA_TRUSTED en CK_TRUE. El valor predeterminado es CK_FALSE. Claves privadas EC, claves privadas RSA, claves privadas DH, claves privadas DSA, claves AES, claves DES, claves genéricas

Curvas soportadas

La biblioteca EP11 admite tipos de curvas limitados para determinados mecanismos. En la tabla siguiente se muestran los nombres de curvas soportados para diferentes mecanismos. El número en el nombre de la curva significa el recuento de bits principal soportado.

Curvas soportadas para generar las claves de curva elíptica (EC)

El mecanismo CKM_EC_KEY_PAIR_GEN está soportado cuando se invoca la función GenerateKeyPair para generar claves de curva elíptica (EC). Los parámetros de nombre de curva se deben especificar como identificadores de objetos (OID) utilizando CKA_EC_PARAMS. Puede obtener el OID buscando el nombre de curva en el repositorio de OID.

Tabla 4. Tipos de curva soportados para generar claves EC
Mecanismo de GREP11 Tipos de curva soportados Nombres de curva soportados
CKM_EC_KEY_PAIR_GEN Curvas del Instituto Nacional de Estándares y Tecnología(NIST)
  • P-192, también conocida como secp192r1 y prime192v1.
  • P-224, también conocida como secp224r1.
  • P-256, conocida también como secp256r1 y prime256v1.
  • P-384, también conocida como secp384r1.
  • P-521, también conocida como secp521r.
CKM_EC_KEY_PAIR_GEN Curvas de agrupación cerebral regular(BP)
  • BP-160R, también conocida como brainpoolP160r1.
  • BP-192R, también conocida como brainpoolP192r1.
  • BP-224R, también conocida como brainpool-P224r1.
  • BP-256R, también conocida como brainpoolP256r1.
  • BP-320R, también conocida como brainpoolP320r1.
  • BP-384R, también conocida como brainpoolP384r1.
  • BP-512R, también conocido como brainpoolP512r1.
CKM_EC_KEY_PAIR_GEN Curvas de agrupación de cerebros retorcidos(BP)
  • BP-160T, también conocida como brainpoolP160t1.
  • BP-192T, también conocida como brainpoolP192t1.
  • BP-224T, también conocida como brainpool-P224t1.
  • BP-256T, también conocida como brainpoolP256t1.
  • BP-320T, también conocida como brainpoolP320t1.
  • BP-384T, también conocida como brainpoolP384t1.
  • BP-512T, también conocida como brainpoolP512t1.
CKM_EC_KEY_PAIR_GEN Curvas SEC(Standards for Eficiente Cryptography)
  • secp256k1
CKM_EC_KEY_PAIR_GEN Curvas de Edwards
  • Ed25519

Curvas soportadas para cifrar activos digitales y generar firmas

Las curvas siguientes están soportadas para los mecanismos relacionados con el activo digital y la firma digital.

Tabla 5. Tipos de curva soportados para cifrar activos digitales y firmas
Norma y régimen Mecanismo de GREP11 Tipos de curva soportados Nombres de curva soportados
BIP32/BIP44 CKM_IBM_BTC_XX_ENCODE_CASE_ONE derivE Curvas SEC(Standards for Eficiente Cryptography)
  • secp256k1
SLIP10 CKM_IBM_BTC_XX_ENCODE_CASE_ONE derivE Curvas del Instituto Nacional de Estándares y Tecnología(NIST)
  • P-256, también conocido como secp256r1 y prime256v1
SLIP10 CKM_IBM_BTC_XX_ENCODE_CASE_ONE derivE Curvas SEC(Standards for Eficiente Cryptography)
  • secp256k1
SLIP10 CKM_IBM_BTC_XX_ENCODE_CASE_ONE derivE Curvas de Edwards
  • Ed25519
EdDSA CKM_IBM_ED25519_SHA512 Curvas de Edwards
  • Ed25519
Schnorr CKM_IBM_ECDSA_OTHER Curvas SEC(Standards for Eficiente Cryptography)
  • secp256k1
Schnorr CKM_IBM_ECDSA_OTHER Curvas del Instituto Nacional de Estándares y Tecnología(NIST)
  • P-256, también conocido como secp256r1 y prime256v1
Schnorr CKM_IBM_ECDSA_OTHER Curvas de agrupación cerebral regular(BP)
  • BP-256R, también conocido como brainpoolP256r1
Schnorr CKM_IBM_ECDSA_OTHER Curvas de agrupación de cerebros retorcidos(BP)
  • BP-256T, también conocido como brainpoolP256t1
Schnorr ECSG_IBM_ECSDSA_S256
  • secp256r1
  • secp256k1
  • BP-256R, también conocido como brainpoolP256r1
  • BP-256T, también conocido como brainpoolP256t1
Schnorr-Zilliqa ECSG_IBM_ECSDSA_COMPR_MULTI
  • secp256r1
  • secp256k1
  • BP-256R, también conocido como brainpoolP256r1
  • BP-256T, también conocido como brainpoolP256t1

Realización de operaciones criptográficas con funciones de GREP11

Puede realizar operaciones criptográficas llamando a las funciones de GREP11 definidas en función de la implementación EP11 de la especificación PKCS #11. Las siguientes descripciones de función se crean basándose en la especificación PKCS #11, con notas específicas de EP11. Todas las definiciones de parámetros están en el formato original de EP11. Para obtener más información sobre EP11, consulte Estructura de biblioteca de Enterprise PKCS #11(EP11).

Los parámetros de las funciones de EP11 se correlacionan con los tipos de almacenamiento intermedio de protocolos que se pueden hallar en las siguientes funciones. Puede obtener más información sobre los tipos de almacenamiento intermedio de protocolo en Google Developers.

Como la biblioteca de EP11 es un subconjunto de la biblioteca de API de PKCS #11 y las funciones de GREP11 son variantes de las correspondientes funciones de EP11, estas funciones de EP11 y las de PKCS #11 también aparecen en la lista de las tablas de funciones de GREP11 para su referencia.

GREP11 da soporte a cualquier lenguaje de programación con una biblioteca gRPC. En la etapa actual, en la referencia de API solo se incluyen fragmentos de código o ejemplos para Golang y JavaScript. El contenido se enriquece en fases posteriores. Los fragmentos de código están basados en los siguientes repositorios de GitHub externos que proporcionan ejemplos completos para utilizar la API de GREP11. Algunos fragmentos de código hacen referencia a las funciones de ayuda en los repositorios de ejemplos.

Recuperación de algoritmos criptográficos soportados 

Puede utilizar las siguientes funciones para recuperar algoritmos criptográficos o mecanismos soportados por GREP11. Con esta información, puede comprender los mecanismos específicos que se pueden establecer cuando se llama a una función. Para ver la lista completa de mecanismos soportados, también puede consultar los mecanismos categorizados por grupos de funciones.

GetMechanismList

La función GetMechanismList obtiene una lista de tipos de mecanismos soportados por una señal.

Descripción Enlaza a EP11 m_GetMechanismList, que es una implementación de PKCS #11 C_GetMechanismList.
Parámetros
    message GetMechanismListRequest {
    }
    message GetMechanismListResponse {
      repeated uint64 Mechs = 2;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción Implementación de C_GetMechanismList de PKCS #11.
Parámetros
    CK_RV m_GetMechanismList (
      CK_SLOT_ID slot,
      CK_MECHANISM_TYPE_PTR mechs, CK_ULONG_PTR mechslen,
      destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_GetMechanismList. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_GetMechanismList se utiliza para obtener una lista de los tipos de mecanismo admitidos por una señal. SlotID es el ID de la ranura de señal; pulCount apunta a la ubicación que recibe el número de mecanismos.

Hay dos formas disponibles para que una aplicación llame a C_GetMechanismList:

  1. Si pMechanismList es NULL_PTR, entonces todo lo que hace C_GetMechanismList es devolver (en *pulCount) el número de mecanismos, sin devolver una lista de mecanismos. El contenido de *pulCount en la entrada a C_GetMechanismList no tiene ningún significado en este caso y la llamada devuelve el valor CKR_OK.
  2. Si pMechanismList no es NULL_PTR, *pulCount debe contener el tamaño (en términos de elementos CK_MECHANISM_TYPE) del almacenamiento intermedio al que apunta pMechanismList. Si ese almacenamiento intermedio es suficientemente grande para contener la lista de mecanismos, entonces, se devolverá la lista al almacenamiento y se devolverá CKR_OK. Si no es así, la llamada a C_GetMechanismList devolverá el valor CKR_BUFFER_TOO_SMALL. En cualquier caso, el valor *pulCount se establece para contener el número de mecanismos.

Dado que C_GetMechanismList no asigna ningún espacio propio, una aplicación suele invocar C_GetMechanismList dos veces. Sin embargo, este comportamiento no es necesario en absoluto.

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.

Fragmentos de código

  • Fragmento de código de Golang

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

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

GetMechanismInfo

La función GetMechanismInfo obtiene información sobre un mecanismo en particular.

Descripción Enlaza a EP11 m_GetMechanismInfo, que es una implementación de PKCS #11 C_GetMechanismInfo.
Parámetros
    message GetMechanismInfoRequest {
      uint64 Mech = 2;
    }
    message GetMechanismInfoResponse {
      MechanismInfo MechInfo = 3;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción Implementación de C_GetMechanismInfo de PKCS #11.
Parámetros
    CK_RV m_GetMechanismInfo (
      CK_SLOT_ID slot,
      CK_MECHANISM_TYPE mech,
      CK_MECHANISM_INFO_PTR mechInfo,
      destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_GetMechanismInfo. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_GetMecanismoInfo obtiene información sobre un mecanismo determinado que puede ser soportado por una señal. slotID es el ID de la ranura de la señal; type es el tipo de mecanismo; pInfo apunta a la ubicación que recibe la información del 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.

Fragmentos 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 de JavaScript

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

Generación y derivación de claves

GREP11 proporciona las funciones siguientes para generar claves criptográficas simétricas y asimétricas. En función del mecanismo y la longitud de clave que especifique, puede generar varios tipos de claves para diferentes usos. También puede derivar una clave de una clave base para estirar claves en claves más largas o para obtener claves de un formato necesario.

GenerateKey

La función GenerateKey genera una clave secreta para el cifrado simétrico.

Descripción Enlaza con m_GenerateKey de EP11, que es una implementación 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 Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_GenerateKey de PKCS #11.

Las claves TDES se generan con una paridad adecuada, que no puede observar el host. Pero es necesaria para una interoperatividad adecuada: otras implementaciones de PKCS #11 se necesitan para rechazar las claves DES con problemas de paridad.

Si un objeto está vinculado a una sesión, (pin, plen) debe regresar a esta sesión mediante Login. Si se deja pin, NULL crea un objeto pública, uno que no está enlazado a ninguna sesión de inicio de sesión.

(key, klen) devuelve el blob de la clave. (csum, clen) contiene la suma de comprobación de la clave, es decir, los bytes más significativos de un bloque de todo ceros cifrado por la clave. El valor NULL clen es posible, por ejemplo para mecanismo de clave simétrica sin parámetros CKA_CHECK_VALUE (como, por ejemplo, RC4).

ptempl se utiliza solamente si el mecanismo necesita la longitud de la clave (es decir, el atributo CKA_VALUE_LEN). Si el mecanismo especifica implícitamente el tamaño de clave, no se comprobará el tamaño de ptempl.

La generación de parámetros DSA y DH hace caso omiso de (csum, clen), generando solamente estructuras de parámetro.

Parámetros DSA, DH (CKM_DSA_PARAMETER_GEN): pasar el recuento de bits del módulo en CKA_PRIME_BITS de los atributos. Escribe la estructura P,Q,G como salida de texto simple (es decir, no un blob).

El blob pin era una salida de: Login.

PKCS #11 phKey no se correlaciona con ningún parámetro de EP11. (La biblioteca de host debe vincular la clave envuelta para la tarea de manejo.)

Parámetros
    CK_RV m_GenerateKey (
      CK_MECHANISM_PTR mech,
      CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
      const unsigned char *pin, size_t pinlen,
      unsigned char * key, size_t * keylen,
      unsigned char *checkSum, size_t *checkSumlen,
      destino target_t
      );
    
Valores de retorno Un subconjunto de los valores de retorno de C_GenerateKey. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_GenerateKey genera una clave secreta o un conjunto de parámetros de dominio, creando un objeto nuevo. hSession es el manejador de la sesión; pMechanism apunta al mecanismo de generación; pTemplate apunta a la plantilla para la nueva clave o conjunto de parámetros de dominio; ulCount es el número de atributos de la plantilla; phKey apunta a la ubicación que recibe el descriptor de contexto de la nueva clave o conjunto de parámetros de dominio.

Si el mecanismo de generación es para la generación de parámetros de dominio, el atributo CKA_CLASS tiene el valor CKO_DOMAIN_PARAMETERS; de lo contrario, tiene el valor CKO_SECRET_KEY.

Puesto que el tipo de parámetros de clave o dominio que se han de generar está implícito en el mecanismo de generación, no es necesario que la plantilla proporcione ningún tipo de clave. Si proporciona un tipo de clave que es incoherente con el mecanismo de generación, C_GenerateKey falla y devuelve el código de error CKR_TEMPLATE_INCONSISTENT. El atributo CKA_CLASS se trata de la misma manera.

Si una llamada a C_GenerateKey no puede dar soporte a la plantilla exacta que se le ha suministrado, falla y regresa sin crear un objeto.

El objeto creado por una llamada a C_GenerateKey correcta tiene establecido el atributo CKA_LOCAL en 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.

Fragmentos 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 de 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

La función GenerateKeyPair genera un par de claves públicas y claves privadas.

Descripción Enlaza con m_GenerateKeyPair de EP11, que es una implementación 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 Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_GenerateKeyPair de PKCS #11.

Los parámetros de par de claves se recuperan de los parámetros pmech, ppublic y pprivate. Para claves RSA, ppublic especifica el tamaño del módulo.

En modalidad FIPS, sólo se da soporte a los módulos RSA de 1024+256 n bits (entero n). La modalidad no FIPS puede generar claves de cualquier número par de bits entre los límites de la lista de parámetros del mecanismo.

La clave pública está formateada como una SPKI estándar (información de clave pública), legible por la mayoría de las bibliotecas. Un MAC específico de la clave de transporte protege la integridad. Dicho MAC no forma parte del propio SPKI. La generación de parámetros DSA devuelve una estructura no SPKI en el campo de clave pública.

Si vincula un objeto a una sesión, (pin, plen) se debe devolver mediante Login para esta sesión. Si se deja pin NULL se crea un objeto público, uno que sobrevive a la sesión de inicio de sesión.

Devuelve una clave privada envuelta en (key, klen), una clave pública como una estructura ASN.1/DER con cálculo de MAC en (pubkey, pklen).

Las siguientes combinaciones de parámetros soportadas con notas especiales van más allá de lo documentado por PKCS #11:

Las claves RSA rechazan los exponentes públicos por debajo de 17 (0x11). Los puntos de control pueden restringir más adelante el mínimo aceptado. El exponente Fermat4, 0x10001, se controla mediante un punto de control específico, que coincide con las restricciones de exponente público de FIPS 186-3 (sección B.3.1).

Las claves de EC (CKM_EC_KEY_PAIR_GEN): los parámetros de curva se pueden especificar como OID o nombres simbólicos (nuestra variante de namedCurve). Los nombres simbólicos soportados son "P-nnn" para las curvas NIST (nnn es un recuento de bits primarios soportado, 192 - 521), "BP-nnnR" para la curva BP normal. (Se deben suministrar nombres como series ASCII, sin terminación de cero.)

Claves DSA (CKM_DSA_KEY_PAIR_GEN): pasan la estructura P,Q,G como atributo CKA_IBM_STRUCT_PARAMS de atributos públicos. Es posible que los parámetros P,Q,G individuales no se pasen a través de los parámetros habituales de PKCS #11; se deben combinar con una única estructura.

Claves DH (CKM_DH_PKCS_KEY_PAIR_GEN): pasan la estructura P,G como atributo CKA_IBM_STRUCT_PARAMS de atributos públicos. Es posible que los parámetros P,G individuales no se pasen a través de los parámetros habituales de PKCS #11; se deben combinar con una única estructura. Cuando seleccione un recuento de bits de clave privada (X), utilice el atributo XCP_U32_VALUE_BITS. Si no está presente, o si se suministra un 0 explícito, se selecciona un recuento de bits basado en el recuento de bits P.

El uso del estado de sesión (Inicio de sesión) sustituye al uso estándar de las sesiones. La correlación está fuera del ámbito de la biblioteca.

El blob pin era una salida de: Login.

PKCS #11 hSession no se correlaciona con ningún parámetro de EP11. (La llamada no está asociada directamente a ninguna sesión.)

PKCS #11 phPublicKey no se correlaciona con ningún parámetro de EP11. (La biblioteca de host debe asociar el valor de pubkey (SPKI) con el controlador.)

PKCS #11 phPrivateKey no se correlaciona con ningún parámetro de EP11. (La biblioteca debe asociar la clave privada con el controlador.)

Parámetros
    CK_RV m_GenerateKeyPair (
      CK_MECHANISM_PTR mech,
      CK_ATTRIBUTE_PTR pubKeyTemplate, CK_ULONG pubKeyTemplatelen,
      CK_ATTRIBUTE_PTR privKeyTemplate, CK_ULONG privKeyTemplatelen,
      const unsigned char *pin, size_t pinlen,
      unsigned char *privKey, size_t *privKeylen,
      unsigned char *pubKey, size_t *pubKeylen,
      destino target_t
      );
    
Valores de retorno Un subconjunto de los valores de retorno de C_GenerateKeyPair. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_GenerateKeyPair genera un par de claves públicas y privadas, creando nuevos objetos de clave. hSession es el manejador de la sesión; pMechanism apunta al mecanismo de generación de claves; pPublicKeyTemplate apunta a la plantilla para la clave pública; ulPublicKeyAttributeCount es el número de atributos de la plantilla de clave pública; pPrivateKeyTemplate apunta a la plantilla para la clave privada; ulPrivateKeyAttributeCount es el número de atributos de la plantilla de clave privada; phPublicKey apunta a la ubicación que recibe el manejador de la nueva clave pública; phPrivateKey apunta a la ubicación que recibe el manejador de la nueva clave privada.

Puesto que los tipos de claves que se van a generar están implícitos en el mecanismo de generación de pares de claves, las plantillas no necesitan proporcionar tipos de clave. Si una de las plantillas proporciona un tipo de clave que es incoherente con el mecanismo de generación de claves, C_GenerateKeyPair falla y devuelve el código de error CKR_TEMPLATE_INCONSISTENT. El atributo CKA_CLASS se trata de forma similar.

Si una llamada a C_GenerateKey no puede dar soporte a las plantillas exactas que se le han suministrado, falla y regresa sin crear objetos de clave.

Una llamada a C_GenerateKeyPair nunca crea una única clave y regresa. Una llamada puede fallar y no crear claves; o puede ejecutarse correctamente y crear un par de claves pública y privada coincidentes.

Los objetos de clave creados por una llamada satisfactoria a C_GenerateKeyPair tienen los atributos CKA_LOCAL establecidos en CK_TRUE.

Anote minuciosamente el orden de los argumentos en C_GenerateKeyPair. Como mínimo hay dos argumentos que no tienen el mismo orden que tenían en el documento original Cryptoki de la versión 1.0. El orden de estos dos argumentos ha causado cierta confusión desafortunada.

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.

Fragmentos 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 de 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

La función DeriveKey deriva una clave de una clave base.

Descripción Enlaza a EP11 m_DeriveKey, que es una implementación de PKCS #11 C_DeriveKey.
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 Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_DeriveKey de PKCS #11.

El blob basekey,bklen debe estar correlacionado desde el parámetro PKCS #11 hBaseKey.

PKCS #11 hSession no se correlaciona con ningún parámetro de EP11. (La llamada no está asociada directamente a ninguna sesión.)

PKCS #11 phKey no se correlaciona con ningún parámetro de EP11. (La biblioteca de host debe vincular la clave devuelta con el controlador.)

Parámetros
    CK_RV m_DeriveKey (
        CK_MECHANISM_PTR mech,
        CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
        const unsigned char *baseKey, size_t baseKeylen,
        const unsigned char *data, size_t datalen,
        const unsigned char *pin, size_t pinlen,
        unsigned char *newKey, size_t *newKeylen,
        unsigned char *checkSum, size_t *checkSumlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_DeriveKey. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_DeriveKey deriva una clave de una clave base, creando un nuevo objeto de clave. hSession es el manejador de la sesión; pMechanism apunta a una estructura que especifica el mecanismo de derivación de claves; hBaseKey es el manejador de la clave base; pTemplate apunta a la plantilla para la nueva clave; ulAttributeCount es el número de atributos de la plantilla; y phKey apunta a la ubicación que recibe el manejador de la clave derivada.

Los valores de los atributos CKA_SENSITIVE, CKA_ALWAYS_SENSITIVE, CKA_EXTRACTABLE y KA_NEVER_EXTRACTABLE para la clave base afectan a los valores que pueden contener estos atributos para la clave recién derivada. Consulte la descripción de cada mecanismo de derivación de claves particular en la sección 5.16.2 de la especificación de API PKCS #11 para cualquier restricción de este tipo.

Si una llamada a C_GenerateKey no puede dar soporte a la plantilla exacta que se le ha suministrado, falla y regresa sin crear un objeto.

El objeto creado por una llamada a C_GenerateKey correcta tiene establecido el atributo CKA_LOCAL en 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.

Fragmentos 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 de 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);
    });
    }
    

Protección de claves

Puede proteger una clave envolviéndola y luego descifrarla invocando la característica de desenvolver.

WrapKey

La función WrapKey envuelve (cifra) una clave.

Descripción Enlaza a EP11 m_WrapKey, que es una implementación de PKCS #11 C_WrapKey.
Parámetros
    message WrapKeyRequest {
        bytes Key = 1;
        bytes KeK = 2;
        bytes MacKey = 3;
        Mechanism Mech = 4;
    }
    message WrapKeyResponse {
        bytes Wrapped = 5;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción Implementación del valor 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 CK_MECHANISM_PTR mech,
        CK_BYTE_PTR wrapped, CK_ULONG_PTR wrappedlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_WrapKey. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_WrapKey envuelve (es decir, cifra) una clave privada o secreta. hSession es el descriptor de contexto de la sesión; pMechanism apunta al mecanismo de ajuste; hWrappingKey es el manejador de la clave de encapsulado; hKey es el manejador de la clave que se va a envolver; pWrappedKey apunta a la ubicación que recibe la clave envuelta; y pulwrappedKeyLen apunta a la ubicación que recibe la longitud de la clave envuelta.

C_WrapKey utiliza el convenio que se describe en la sección 5.2 de la especificación de API PKCS #11 en la producción de la salida.

El atributo CKA_WRAP de la clave de envolvimiento, que indica si la clave admite el envolvimiento, debe ser CK_TRUE. El atributo CKA_EXTRACTABLE de la clave que se debe envolver también debe ser CK_TRUE.

Si la clave que se ha de envolver no se puede envolver por algún motivo específico de la señal, a pesar de que tenga el atributo CKA_EXTRACTABLE establecido en CK_TRUE, entonces C_WrapKey falla con el código de error CKR_KEY_NOT_WRAPPABLE. Si no se puede envolver únicamente con la clave de envolvimiento especificada y el mecanismo debido a su longitud, entonces C_WrapKey falla con el código de error CKR_KEY_SIZE_RANGE.

C_WrapKey se puede utilizar en las situaciones siguientes:

  • Para envolver cualquier clave secreta con una clave pública que admita el cifrado y el descifrado.
  • Para envolver cualquier clave secreta con cualquier otra clave secreta. Se debe tener en cuenta el tamaño de la clave y la potencia del mecanismo o puede que la señal no permita la operación.
  • Para envolver una clave privada con cualquier clave secreta.

Las señales varían en función de los tipos de claves se pueden envolver con qué mecanismos.

Para particionar las claves de encapsulado de modo que sólo puedan envolver un subconjunto de claves extraíbles, el atributo CKA_WRAP_TEMPLATE se puede utilizar en la clave de encapsulado para especificar un conjunto de atributos que se puede comparar con los atributos de la clave que se va a envolver. Si todos los atributos coinciden según las reglas de C_FindObject de coincidencia de atributos, la operación de envolver continúa. El valor de este atributo es una plantilla de atributo y el tamaño es el número de elementos de la plantilla que tiene el tamaño de CK_ATTRIBUTE. Si no se proporciona este atributo, no se aceptará ninguna plantilla. Si un atributo no está presente, no se comprueba. Si se produce una discrepancia de los atributos en un intento de envolver una clave, la función devuelve 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.

Fragmentos 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 de JavaScript

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

UnwrapKey

La función UnwrapKey desenvuelve (descifra) una clave.

Descripción Enlaza a EP11 m_UnwrapKey, que es una implementación de PKCS #11 C_UnwrapKey.
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 Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_UnwrapKey de PKCS #11.

uwmech especifica el mecanismo de cifrado que se utiliza para descifrar datos envueltos. ptempl es una lista de parámetros de clave(par), que especifica cómo transformar los datos desenvueltos en una nueva clave (debe incluir CKA_KEY_TYPE).

El objeto generado se devuelve en (unwrapped, uwlen) como blob. Las claves simétricas devuelven la suma de comprobación de claves (3 bytes) en (csum, cslen); los objetos de clave pública devuelven la clave pública como SPKI en (csum, cslen). Ambas formas van seguidas de un valor big-endian de 4 bytes, que codifica el recuento de bits de la clave desenvuelta.

Cuando un SPKI se está transformando en una SPKI MACed, se debe utilizar CKM_IBM_TRANSPORTKEY como mecanismo para desenvolver. Esta modalidad proporciona el SPKI sin formato, como datos envueltos, y hace caso omiso de KEK.

UnwrapKey Genera claves DES ajustadas por paridad (en los blobs), pero tolera la entrada con paridad incorrecta.

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 CK_MECHANISM_PTR mech,
        const CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
        unsigned char * unwrapped, size_t * unwrappedlen,
        CK_BYTE_PTR checkSum, CK_ULONG *checkSumlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_UnwrapKey. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_UnwrapKey desenvuelve (es decir, descifra) una clave envuelta, creando una nueva clave privada o un objeto de clave secreta. hSession es el descriptor de contexto de la sesión; pMechanism apunta al mecanismo de desenvolver; hUnwrappingKey es el manejador de la clave para desenvolver; pWrappedKey apunta a la clave envuelta; ulWrappedKeyLen es la longitud de la clave envuelta; pTemplate apunta a la plantilla para la nueva clave; ulAttributeCount es el número de atributos de la plantilla; phKey apunta a la ubicación que recibe el manejador de la clave recuperada.

El atributo CKA_UNWRAP de la clave de desenvolvimiento, que indica si la clave admite el desenvolvimiento, debe ser CK_TRUE.

La nueva clave tiene el atributo CKA_ALWAYS_SENSITIVE establecido en CK_FALSE, y el atributo CKA_NEVER_EXTRACTABLE establecido en CK_FALSE. El atributo CKA_EXTRACTABLE se establece de forma predeterminada en CK_TRUE.

Algunos mecanismos pueden modificar o intentar modificar. El contenido de la estructura pMechanism al mismo tiempo que se desenvuelve la clave.

Si una llamada a C_GenerateKey no puede dar soporte a la plantilla exacta que se le ha suministrado, falla y regresa sin crear ningún objeto de clave.

El objeto de clave creado mediante una llamada a C_UnwrapKey correcta tiene establecido el atributo CKA_LOCAL en CK_FALSE.

Para particionar las claves de desenvolver para que sólo puedan desenvolver un subconjunto de claves, el atributo CKA_UNWRAP_TEMPLATE se puede utilizar en la clave de desenvolver para especificar un conjunto de atributos que se añade a los atributos de la clave que se va a desenvolver. Si los atributos no entran en conflicto con la plantilla de atributos proporcionada por el usuario, en pTemplate, la operación de desenvolver continúa. El valor de este atributo es una plantilla de atributo y el tamaño es el número de elementos de la plantilla que tiene el tamaño de CK_ATTRIBUTE. Si este atributo no está presente en la clave de desenvolvimiento, no se añaden atributos adicionales. Si se produce algún conflicto de atributos en un intento de desenvolver una clave, la función DEVOLVERÁ 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.

Fragmentos 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 de 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

La función RewrapKeyBlob vuelve a cifrar los objetos binarios grandes (BLOB) de clave generados con la nueva clave maestra confirmada contenida en el HSM. Las claves que se vuelven a cifrar solo se pueden utilizar después de que se haya finalizado el HSM con la nueva clave maestra confirmada.

Esta función es un mandato de administración especial que solo está soportado por GREP11. No hay ninguna función EP11 o PKCS #11 correspondiente para RewrapKeyBlob.

Descripción Transfiere la propiedad de un BLOB controlado por la clave maestra actual a la nueva clave maestra cuando se confirma la nueva clave maestra.
Parámetros
    message RewrapKeyBlobRequest {
    	bytes WrappedKey = 1;
    }
    message RewrapKeyBlobResponse {
    	bytes RewrappedKey = 1;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.

Fragmentos 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 de JavaScript

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

Recuperación y modificación de atributos para claves 

Cuando se generan claves o se realizan operaciones de claves, se define una plantilla de atributo como uno de los parámetros. Puede recuperar los atributos de un objeto de clave específico y modificar algunos atributos una vez que se haya creado la clave.

GetAttributeValue

La función GetAttributeValue obtiene un valor de atributo de un objeto.

Descripción Enlaza a EP11 m_GetAttributeValue, que es una implementación de PKCS #11 C_GetAttributeValue.
Parámetros
    message GetAttributeValueRequest {
        bytes Object = 1;
        map<uint64,AttributeValue> Attributes = 3;
    }
    message GetAttributeValueResponse {
        map<uint64,AttributeValue> Attributes = 4;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_GetAttributeValue de PKCS #11.

No representa ni necesita sesiones (parte de blob); por lo tanto, no utiliza el parámetro hSession.

EP11 utiliza más formas directas para decodificar como, por ejemplo, la enumeración de los valores reales en lugar de ser más genérico.

Parámetros
    CK_RV m_GetAttributeValue (
        const unsigned char *object, size_t objectlen,
        CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_GetAttributeValue. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_GetAttributeValue obtiene el valor de uno o más atributos de un objeto. hSession es el manejador de la sesión; hObject es el manejador del objeto; pTemplate apunta a una plantilla que especifica qué valores de atributo se van a obtener y recibe los valores de atributo; ulCount es el número de atributos de la plantilla.

Para cada triplete en la plantilla (type, pValue, ulValueLen), C_GetAttributeValue realiza el algoritmo siguiente:

  1. Si el atributo especificado (es decir, el atributo especificado por el campo Tipo) para el objeto no se puede revelar porque el objeto es confidencial o no extraíble, entonces, se modifica el campo ulValueLen, en ese triplete, para que contenga el valor CK_UNAVAILABLE_INFORMATION.
  2. De lo contrario, si el valor especificado para el objeto no es válido (el objeto no posee dicho atributo), entonces, se modifica el campo ulValueLen en ese triplete para que contenga el valor CK_UNAVAILABLE_INFORMATION.
  3. De lo contrario, si el campo pValue tiene el valor NULL_PTR, entonces, se modifica el campo ulValueLen para que contenga la longitud exacta del atributo especificado para el objeto.
  4. De lo contrario, si la longitud especificada en ulValueLen es lo suficientemente grande para contener el valor del atributo especificado para el objeto, se copia este atributo en el almacenamiento intermedio que está en pValue, y se modifica el campo ulValueLen para que contenga la longitud exacta del atributo.
  5. De lo contrario, se modifica el campo ulValueLen para que contenga el valor CK_UNAVAILABLE_INFORMATION.

Si se aplica el caso 1 a cualquiera de los atributos solicitados, la llamada debe devolver el valor CKR_ATTRIBUTE_SENSITIVE. Si se aplica el caso 2 a cualquiera de los atributos solicitados, la llamada debe devolver el valor CKR_ATTRIBUTE_TYPE_INVALID. Si se aplica el caso 5 a cualquiera de los atributos solicitados, la llamada debe devolver el valor CKR_BUFFER_TOO_SMALL. Como de costumbre, si se aplica más de uno de estos códigos de error, puede que Cryptoki devuelva alguno de ellos. Únicamente si ninguno de estos se aplica a ninguno de los atributos solicitados, se devuelve CKR_OK.

En el caso especial de un atributo cuyo valor es una matriz de atributos, por ejemplo CKA_WRAP_TEMPLATE, donde se pasa con pValue no NULL, si el pValue de elementos dentro de la matriz es NULL_PTR, el ulValueLen de elementos dentro de la matriz se establece en la longitud necesaria. Si el valor pValue de los elementos en la matriz no es NULL_PTR, entonces, el elemento ulValueLen de atributos en la matriz deberá reflejar el espacio al que apunta el correspondiente pValue y pValue se completará si hay espacio suficiente. Por lo tanto, es importante inicializar el contenido de un almacenamiento intermedio antes de que se llame a C_GetAttributeValue para obtener dicho valor de matriz. Si cualquier ulValueLen incluido en la matriz no es lo suficientemente grande, se establece en CK_UNAVAILABLE_INFORMATION y la función devuelve CKR_BUFFER_TOO_SMALL, del mismo modo que lo hace si un atributo del argumento pTemplate tiene un valor de ulValueLen demasiado pequeño. Cualquier atributo cuyo valor sea una matriz de atributos se puede identificar mediante el conjunto CKF_ARRAY_ATTRIBUTE del tipo de atributo.

Los códigos de error CKR_ATTRIBUTE_SENSITIVE, CKR_ATTRIBUTE_TYPE_INVALID y CKR_BUFFER_TOO_SMALL no indican errores verdaderos para C_GetAttributeValue. Si una llamada a C_GetAttributeValue devuelve cualquiera de estos tres valores, de todos modos, la llamada debe haber procesado cada uno de los atributos de la plantilla que se han suministrado a C_GetAttributeValue. Cada uno de los atributos de la plantilla cuyo valor se puede devolver mediante la llamada a C_GetAttributeValue se devuelve mediante la llamada a 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.

Fragmentos 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 de 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

La función SetAttributeValue modifica un valor de atributo de un objeto.

Descripción Enlaza con m_SetAttributeValue de EP11, que es una implementación 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 Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_SetAttributeValue de PKCS #11.

Empaquetado de atributos: consulte _GetAttrValue

Actualmente, Ep11 envía solamente atributos booleanos, todos los demás atributos los gestiona el host (y EP11 no modifica las matrices como, por ejemplo, WRAP_TEMPLATE).

No representa ni necesita sesiones (parte de blob); por lo tanto, no utiliza el parámetro hSession de PKCS #11.

Parámetros
    CK_RV m_SetAttributeValue (
        unsigned char *object, size_t objectlen,
        CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_SetAttributeValue. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_SetAttributeValue modifica el valor de uno o más atributos de un objeto. hSession es el manejador de la sesión; hObject es el manejador del objeto; pTemplate apunta a una plantilla que especifica qué valores de atributo se van a modificar y sus nuevos valores; ulCount es el número de atributos de la plantilla.

Es posible que algunos objetos no se puedan modificar. Cuando se invoca C_SetAttributeValue en estos objetos se genera el código de error CKR_ACTION_PROHIBITED. Una aplicación puede consultar el atributo CKA_MODIFIABLE del objeto para determinar si un objeto se puede modificar.

Solamente se pueden modificar los objetos de sesión durante una sesión de solo lectura.

La plantilla puede especificar valores nuevos para los atributos del objeto que se pueden modificar. Si la plantilla especifica un valor de un atributo que es incompatible con otros atributos existentes del objeto, la llamada falla con el código de retorno CKR_TEMPLATE_INCONSISTENT.

No todos los atributos se pueden modificar; consulte la Sección 4.1.2 de la especificación de API PKCS #11 para obtener más información.

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.

Fragmentos 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 de 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);
    });
    

Generación de datos aleatorios

Puede generar datos aleatorios de alta calidad, como valores de inicialización (IVs), PIN y contraseña, para su uso en operaciones criptográficas.

GenerateRandom

La función GenerateRandom genera datos aleatorios. Cuando utilice esta función, asegúrese de no establecer la longitud de los datos aleatorios en cero y el puntero que apunta a la ubicación de datos aleatorios no debe ser NULL.

Descripción Enlaza con m_GenerateRandom de EP11, que es una implementación de C_GenerateRandom de PKCS #11.
Parámetros
    message GenerateRandomRequest {
        uint64 Len = 1;
    }
    message GenerateRandomResponse {
        bytes Rnd = 1;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_GenerateRandom de PKCS #11.

GenerateRandom equivale a la función original de PKCS #11. Internamente, la entropía con semillas generadas por hardware se pasa a través de DRNG compatible con FIPS (ANSI X9.31/ISO 18031, dependiendo de la versión de Clic).

La biblioteca del host podría generar números aleatorios sin asignarlos al programa de fondo, si la funcionalidad adecuada estuviera disponible en el host. Esto no ocurre en la implementación actual.

Esta función no da soporte a la consulta de tamaño.

Parámetros
    CK_RV m_GenerateRandom (
        CK_BYTE_PTR rnd, CK_ULONG rndlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_GenerateRandom. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción C_GenerateRandom genera datos aleatorios o pseudoaleatorios. hSession es el manejador de sesiones; pRandomData apunta a la ubicación que recibe los datos aleatorios; y ulRandomLen es la longitud en bytes de los datos aleatorios o pseudoaleatorios que se van a generar.
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_REMOVED, CKR_FUNCTION_CANCEL, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_ACTIVE, CKR_RANDOM_NO_RNG, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Fragmentos 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 de JavaScript

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

Cifrado y descifrado de datos

Al especificar el mecanismo criptográfico, puede realizar funciones de cifrado y descifrado simétricas o asimétricas. Es posible que tenga que invocar a una serie de subfunciones para cifrar o descifrar datos. Por ejemplo, la operación de cifrado de datos de varias partes consta de las suboperaciones EncryptInit, EncryptUpdate y EncryptFinal.

EncryptInit

La función EncryptInit inicializa una operación de cifrado. Debe llamar a esta función primero para realizar un cifrado.

Descripción Enlaza con m_EncryptInit de EP11, que es una implementación de C_EncryptInit de PKCS #11.
Parámetros
    message EncryptInitRequest {
        Mechanism Mech = 2;
        bytes Key = 3;
    }
    message EncryptInitResponse {
        bytes State = 1;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_EncryptInit de PKCS #11.

El blob (key, klen) puede ser un objeto de clave pública o un blob de clave secreta. El tipo de clave debe ser coherente con pmech.

Para los mecanismos de clave pública, (key, klen) debe contener un SPKI. Este SPKI protege la integridad con una clave MAC, tal como lo devuelve GenerateKeyPair o, de forma alternativa, UnwrapKey. El estado de cifrado se crea sin restricciones de sesión.

Para los mecanismos de clave secreta, el estado de cifrado hereda las restricciones de sesión de objeto de (key, klen).

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession.

(key, klen) debe ser un blob de clave.

Parámetros
    CK_RV m_EncryptInit (
        unsigned char * state, size_t * statelen,
        CK_MECHANISM_PTR mech,
        const unsigned char *key, size_t keylen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_EncryptInit. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_EncryptInit inicializa una operación de cifrado. hSession es el manejador de la sesión; pMechanism apunta al mecanismo de cifrado; hKey es el manejador de la clave de cifrado.

El atributo CKA_ENCRYPT de la clave de cifrado, que indica si la clave admite el cifrado, debe ser CK_TRUE.

Después de llamar a C_EncryptInit, la aplicación puede llamar a C_EncryptUpdate cero o más veces, seguido de C_EncryptFinal, para cifrar datos en varias partes. La operación de cifrado está activa hasta que la aplicación utilice una llamada a C_Encrypt o C_EncryptFinal para obtener la parte final del texto cifrado. Para procesar datos adicionales (en una única parte o en varias partes), la aplicación debe volver a invocar C_EncryptInit.

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.

Fragmentos 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 de JavaScript

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

Cifrar

La función Encrypt cifra datos de una sola parte. No es necesario realizar las suboperaciones EncryptUpdate y EncryptFinal para un cifrado de una única parte. Antes de invocar esta función, asegúrese de que primero ejecuta EncryptInit.

Descripción Enlaza con m_Encrypt de EP11, que es una implementación de C_Encrypt de PKCS #11.
Parámetros
    message EncryptRequest {
        bytes State = 1;
        bytes Plain = 2;
    }
    message EncryptResponse {
        bytes Ciphered = 3;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_Encrypt de PKCS #11.

No actualiza (state, slen).

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession.

El blob state era una salida de: EncryptInit.

Parámetros
    CK_RV m_Encrypt (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR plain, CK_ULONG plainlen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_Encrypt. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_Encrypt cifra datos de una sola pieza. hSession es el manejador de la sesión; pData apunta a los datos; ulDataLen es la longitud en bytes de los datos; pEncryptedData apunta a la ubicación que recibe los datos cifrados; pulEncryptedDataLen apunta a la ubicación que contiene la longitud en bytes de los datos cifrados.

C_Encrypt utiliza el convenio que se describe en la Sección 5.2 de la especificación de API PKCS #11 en la producción de la salida.

La operación de cifrado debe inicializarse con C_EncryptInit. Una llamada a C_Encrypt siempre termina la operación de cifrado activa a menos que devuelva CKR_BUFFER_TOO_SMALL o sea una llamada satisfactoria (es decir, una que devuelva CKR_OK) para determinar la longitud del almacenamiento intermedio que es necesario para contener el texto cifrado.

C_Encrypt no se puede utilizar para finalizar una operación de varias partes y se debe invocar después de C_EncryptInit sin que intervenga ninguna llamada C_EncryptUpdate.

Para algunos mecanismos de cifrado, los datos de texto sin formato de entrada tienen ciertas restricciones de longitud (ya sea porque el mecanismo sólo puede cifrar partes relativamente cortas de texto sin formato, o porque los datos de entrada del mecanismo deben constar de un número integral de bloques). Si no se cumplen estas restricciones, C_Encrypt falla con el código de retorno CKR_DATA_LEN_RANGE.

El texto sin formato y el texto cifrado pueden estar en el mismo lugar, es decir, es correcto si pData y pEncryptedData apuntan a la misma ubicación.

Para la mayoría de los mecanismos, C_Encrypt equivale a una secuencia de operaciones C_EncryptUpdate seguida de 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_REMOVED, CKR_FUNCTION_CANCEL, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, HANDR_SESSION_CLOSED

Fragmentos 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 de JavaScript

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

EncryptUpdate

La función EncryptUpdate continúa una operación de cifrado de varias partes. Antes de invocar esta función, asegúrese de que primero ejecuta EncryptInit.

Descripción Enlaza con m_EncryptUpdate de EP11, que es una implementación 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 Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_EncryptUpdate de PKCS #11.

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession.

El blob state era una salida de: EncryptInit.

Parámetros
    CK_RV m_EncryptUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR plain, CK_ULONG plainlen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_EncryptUpdate. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_EncryptUpdate continúa una operación de cifrado de varias partes, procesando otra parte de datos. hSession es el manejador de la sesión; pPart apunta a la parte de datos; ulpartLen es la longitud de la parte de datos; pEncryptedPart apunta a la ubicación que recibe la parte de datos cifrada; pulEncryptedPartLen apunta a la ubicación que contiene la longitud en bytes de la parte de datos cifrados.

C_EncryptUpdate utiliza el convenio que se describe en la Sección 5.2 de la especificación de API PKCS #11 en la producción de la salida.

La operación de cifrado debe inicializarse con C_EncryptInit. Se puede llamar a esta función las veces que se quiera seguidas. Una llamada a C_EncryptUpdate que genera un error distinto de CKR_BUFFER_TOO_SMALL finaliza la operación de cifrado actual.

texto sin formato y ciphertext pueden estar en el mismo lugar, es decir, estaría bien si pPart y pEncryptedPart apuntaran a la misma ubicación.

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.

Fragmentos 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 de JavaScript

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

EncryptFinal

La función EncryptFinal finaliza una operación de cifrado de varias partes.

Descripción Enlaza con m_EncryptFinal de EP11, que es una implementación de C_EncryptFinal de PKCS #11.
Parámetros
    message EncryptFinalRequest {
        bytes State = 1;
    }
    message EncryptFinalResponse {
        bytes Ciphered = 2;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_EncryptFinal de PKCS #11.

No actualiza (state, slen).

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession.

El blob state era una salida de: EncryptInit, EncryptUpdate.

Parámetros
    CK_RV m_EncryptFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_EncryptFinal. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_EncryptFinal finaliza una operación de cifrado de varias partes. hSession es el manejador de la sesión; pLastEncryptedPart apunta a la ubicación que recibe la última parte de datos cifrados, si la hay; pulLastEncryptedPartLen apunta a la ubicación que contiene la longitud de la última parte de datos cifrados.

C_EncryptFinal utiliza el convenio que se describe en la Sección 5.2 de la especificación de API PKCS #11 en la producción de la salida.

La operación de cifrado debe inicializarse con C_EncryptInit. Una llamada a C_EncryptFinal siempre finaliza la operación de cifrado activa, a menos que devuelva CKR_BUFFER_TOO_SMALL, o que sea una llamada satisfactoria (es decir, una que devuelve CKR_OK) para determinar la longitud del almacenamiento intermedio necesario para contener el texto cifrado.

Para algunos mecanismos de cifrado de varias partes, los datos de texto sin formato de entrada tienen ciertas restricciones de longitud porque los datos de entrada del mecanismo deben constar de un número integral de bloques. Si no se cumplen estas restricciones, C_EncryptFinal falla con el 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.

Fragmentos 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 de JavaScript

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

EncryptSingle

La función EncryptSingle procesa datos en un paso con una llamada. No devuelve ningún estado al host y solo devuelve los datos cifrados. Esta función es una extensión de IBM EP11 a la especificación estándar PKCS #11 y es una combinación de las funciones EncryptInit y Encrypt. Le permite completar una operación de cifrado con una sola llamada en lugar de una serie de llamadas.

Descripción Enlaza con m_EncryptSingle de EP11
Parámetros
    message EncryptSingleRequest {
        bytes Key = 1;
        Mechanism Mech = 2;
        bytes Plain = 3;
    }
    message EncryptSingleResponse {
        bytes Ciphered = 4;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Variante no estándar de Encrypt. Procesa los datos de un paso con una llamada. No devuelve ningún estado al host, solamente datos cifrados.

Se trata del método preferido a la hora de realizar el cifrado de datos en un paso para aplicaciones compatibles con XCP. Funcionalmente, equivale a EncryptInit seguido inmediatamente de Encrypt, pero guarda los viajes de ida y vuelta así como los envolvimientos y desenvolvimientos.

Si el programa de fondo admite claves residentes, la clave también puede ser un controlador de claves residentes.

Consulte también: Encrypt, EncryptInit, DecryptSingle.

El blob key era una salida de: GenerateKey, UnwrapKey.

Parámetros
    CK_RV m_EncryptSingle (
        const unsigned char *key, size_t keylen,
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR plain, CK_ULONG plainlen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_Encrypt. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.

Fragmentos 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 de 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

Con la función ReencryptSingle, puede descifrar datos con la clave original y, a continuación, cifrar los datos en bruto con una clave diferente en una sola llamada dentro del HSM de nube. Los tipos de clave que se utilizan para esta operación pueden ser iguales o diferentes. Esta función es una extensión de IBM EP11 a la especificación estándar PKCS #11. Esta sola llamada es una opción viable en la que una gran cantidad de datos se deben volver a cifrar con distintas claves, y pasa por alto la necesidad de realizar una combinación de funciones de DecryptSingle y EncryptSingle para cada elemento de datos que se debe volver a cifrar. No devuelve ningún estado al host y solo devuelve los datos que se han vuelto a cifrar.

Descripción Se enlaza a 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 Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Variante no estándar de Encrypt. Procesa los datos de un paso con una llamada. No devuelve ningún estado al host, solo los datos que se han vuelto a cifrar.

Descifra los datos con la clave original y, a continuación, cifra los datos sin formato con una clave diferente dentro del HSM de nube.

Parámetros
    CK_RV m_ReencryptSingle (
        const unsigned char * dkey, size_t idkeylen,
        const unsigned char * ekey, size_t ekeylen
        CK_MECHANISM_PTR decmech,
        CK_MECHANISM_PTR encmech,
        CK_BYTE_PTR in, CK_ULONG inlen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_Encrypt y C_Decrypt. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.

Fragmentos 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 de 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

La función DecryptInit inicializa una operación de descifrado. Debe llamar a esta función primero para realizar un descifrado.

Descripción Enlaza con m_DecryptInit de EP11, que es una implementación de C_DecryptInit de PKCS #11.
Parámetros
    message DecryptInitRequest {
        Mechanism Mech = 2;
        bytes Key = 3;
    }
    message DecryptInitResponse {
        bytes State = 1;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción Implementación de C_DecryptInit de PKCS #11.
Parámetros
    CK_RV m_DecryptInit (
        unsigned char * state, size_t * statelen,
        CK_MECHANISM_PTR mech,
        const unsigned char *key, size_t keylen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_DecryptInit. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_DecryptInit inicializa una operación de descifrado. hSession es el manejador de la sesión; pMechanism apunta al mecanismo de descifrado; hKey es el manejador de la clave de descifrado.

El atributo CKA_DECRYPT de la clave de descifrado, que indica si la clave admite el descifrado, debe ser CK_TRUE.

Después de que la aplicación llame a C_DecryptInit, la aplicación puede llamar a C_Decrypt para descifrar datos de una sola parte; o llamar a C_DecryptUpdate cero o más veces, seguido de C_DecryptFinal, para descifrar datos en varias partes. La operación de descifrado está activa hasta que la aplicación utilice una llamada a C_Decrypt o C_DecryptFinal para obtener la parte final del texto sin formato. Para procesar datos adicionales (en una única parte o en varias partes), la aplicación debe volver a llamar a C_DecryptInit.

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.

Fragmentos 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 de JavaScript

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

Descifrar

La función Decrypt descifra los datos en una sola parte. No es necesario realizar las suboperaciones DecryptUpdate y DecryptFinal para un descifrado de una única parte. Antes de invocar esta función, asegúrese de que primero ejecuta DecryptInit.

Descripción Enlaza con m_Decrypt de EP11, que es una implementación de C_Decrypt de PKCS #11.
Parámetros
    message DecryptRequest {
        bytes State = 1;
        bytes Ciphered = 2;
    }
    message DecryptResponse {
       bytes Plain = 3;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de PKCS #11 C_Decrypt. No actualiza (estado, slen).

El objeto binario grande (BLOB) state, slen debe correlacionarse con el parámetro hSession de PKCS #11. El BLOB state era una salida 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 target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_Decrypt. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_Decrypt descifra datos cifrados en una sola parte.

  • hSession es el controlador de sesiones.
  • pEncryptedData apunta a los datos cifrados.
  • ulEncryptedDataLen es la longitud de los datos cifrados.
  • pData apunta a la ubicación que recibe los datos recuperados.
  • pulDataLen apunta a la ubicación que conserva la longitud de los datos recuperados.

C_Decrypt utiliza el convenio que se describe en la Sección 5.2 de la especificación de API PKCS #11 en la producción de la salida.

La operación de descifrado se debe inicializar con C_DecryptInit. Una llamada a C_Decrypt siempre termina la operación de descifrado activa a menos que devuelva CKR_BUFFER_TOO_SMALL o sea una llamada satisfactoria con CKR_OK devuelto para determinar la longitud del almacenamiento intermedio que se necesita para contener el texto sin formato.

C_Decrypt no se puede utilizar para finalizar una operación de varias partes, y se debe invocar después de C_DecryptInit sin intervenir en las llamadas C_DecryptUpdate.

El texto cifrado y el texto sin formato pueden estar en el mismo lugar, lo que significa que es aceptable si pEncryptedData y pData apuntan a la misma ubicación.

Si los datos de texto cifrado de entrada no se pueden descifrar debido a que tienen una longitud inadecuada, es posible que se devuelva CKR_ENCRYPTED_DATA_INVALID o CKR_ENCRYPTED_DATA_LEN_RANGE.

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.

Fragmentos 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 de JavaScript

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

DecryptUpdate

La función DecryptUpdate continúa una operación de descifrado de varias partes. Antes de invocar esta función, asegúrese de que primero ejecuta DecryptInit.

Descripción Enlaza con m_DecryptUpdate de EP11, que es una implementación 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 Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_DecryptUpdate de PKCS #11.

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession.

El blob state era una salida de: DecryptInit.

Parámetros
    CK_RV m_DecryptUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR ciphered, CK_ULONG cipheredlen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_DecryptUpdate. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_DecryptUpdate continúa una operación de descifrado de varias partes, procesando otra parte de datos cifrados. hSession es el manejador de la sesión; pEncryptedPart apunta a la parte de datos cifrados; ulEncryptedPartLen es la longitud del componente de datos cifrados; pPart apunta a la ubicación que recibe la parte de datos recuperada; pulPartLen apunta a la ubicación que contiene la longitud de la parte de datos recuperada.

C_DecryptUpdate utiliza el convenio que se describe en la Sección 5.2 de la especificación de API PKCS #11 en la producción de la salida.

La operación de descifrado se debe inicializar con C_DecryptInit. Se puede llamar a esta función las veces que se quiera seguidas. Una llamada a C_DecryptUpdate que genera un error distinto de CKR_BUFFER_TOO_SMALL finaliza la operación de descifrado actual.

El texto cifrado y el texto sin formato pueden estar en el mismo lugar, es decir, es correcto si pEncryptedPart y pPart apuntan a la misma ubicación.

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.

Fragmentos 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 de JavaScript

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

DecryptFinal

La función DecryptFinal finaliza una operación de descifrado de varias partes.

Descripción Enlaza con m_DecryptFinal de EP11, que es una implementación de C_DecryptFinal de PKCS #11.
Parámetros
    message DecryptFinalRequest {
        bytes State = 1;
    }
    message DecryptFinalResponse {
        bytes Plain = 2;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_DecryptFinal de PKCS #11.

No actualiza (state, slen).

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession.

El blob state era una salida de: DecryptInit, DecryptUpdate.

Parámetros
    CK_RV m_DecryptFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_DecryptFinal. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_DecryptFinal finaliza una operación de descifrado de varias partes. hSession es el manejador de la sesión; pLastPart apunta a la ubicación que recibe la última parte de datos recuperada, si la hay; pulLastPartLen apunta a la ubicación que contiene la longitud de la última parte de datos recuperados.

C_DecryptFinal utiliza el convenio que se describe en la Sección 5.2 de la especificación de API PKCS #11 en la producción de la salida.

La operación de descifrado se debe inicializar con C_DecryptInit. Una llamada a C_DecryptFinal siempre termina la operación de descifrado activa a menos que devuelva CKR_BUFFER_TOO_SMALL o sea una llamada satisfactoria (es decir, una llamada que devuelve CKR_OK) para determinar la longitud del almacenamiento intermedio que se necesita para contener el texto sin formato.

Si los datos de texto cifrado de entrada no se pueden descifrar debido a que tienen una longitud inadecuada, es posible que se devuelva CKR_ENCRYPTED_DATA_INVALID o CKR_ENCRYPTED_DATA_LEN_RANGE.

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.

Fragmentos 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 de JavaScript

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

DecryptSingle

La función DecryptSingle procesa datos en un paso con una llamada. No devuelve ningún estado al host y solo devuelve los datos descifrados. Esta función es una extensión de IBM EP11 a la especificación estándar PKCS #11 y es una combinación de las funciones DecryptInit y Decrypt. Le permite completar una operación de descifrado con una sola llamada en lugar de una serie de llamadas.

Descripción Se enlaza a EP11 m_DecryptSingle.
Parámetros
    message DecryptSingleRequest {
        bytes Key = 1;
        Mechanism Mech = 2;
        bytes Ciphered = 3;
    }
    message DecryptSingleResponse {
        bytes Plain = 4;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Variante no estándar de Decrypt. Procesa los datos de un paso con una llamada. No devuelve ningún estado al host, solamente datos descifrados.

Se trata del método preferido a la hora de realizar el cifrado de datos en un paso para aplicaciones compatibles con XCP. Funcionalmente, equivale a DecryptInit seguido inmediatamente de Decrypt, pero guarda los viajes de ida y vuelta así como los envolvimientos y desenvolvimientos.

Si el programa de fondo admite claves residentes, la clave también puede ser un controlador de claves residentes.

Consulte también: Decrypt, DecryptInit, EncryptSingle.

El blob key era una salida de: GenerateKey, UnwrapKey.

Parámetros
    CK_RV m_DecryptSingle (
        const unsigned char *key, size_t keylen,
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR ciphered, CK_ULONG cipheredlen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_Decrypt. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.

Fragmentos 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 de JavaScript

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

Firma y verificación de datos

GREP11 proporciona un conjunto de funciones para firmar datos y verificar firmas o códigos de autenticación de mensajes (MAC). Es posible que tenga que invocar una serie de subfunciones para realizar una operación de firma. Por ejemplo, la operación de firma de datos de varias partes consta de las suboperaciones SignInit, SignUpdatey SignFinal.

SignInit

La función SignInit inicializa una operación de firma. Debe llamar a esta función primero para realizar una operación de firma.

Descripción Se enlaza a EP11 m_SignInit, que es una implementación de PKCS #11 C_SignInit.
Parámetros
    message SignInitRequest {
        Mechanism Mech = 2;
        bytes PrivKey = 3;
    }
    message SignInitResponse {
        bytes State = 1;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción Implementación de C_SignInit de PKCS #11.
Parámetros
    CK_RV m_SignInit (
        unsigned char * state, size_t * statelen,
        CK_MECHANISM_PTR mech,
        const unsigned char *privKey, size_t privKeylen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_Decrypt. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_SignInit inicializa una operación de firma, donde la firma es un apéndice de los datos. hSession es el manejador de la sesión; pMechanism apunta al mecanismo de firma; hKey es el manejador de la clave de firma.

El atributo CKA_SIGN de la clave de firma, que indica si la clave admite firmas con apéndice, debe ser CK_TRUE.

Después de llamar a C_SignInit, la aplicación puede llamar a C_Sign para firmar una sola parte; o llamar a C_SignUpdate una o más veces, seguido de C_SignFinal, para firmar datos de varias partes. La operación de firma está activa hasta que la aplicación utiliza una llamada a C_Sign o C_SignFinal para obtener la firma. Para procesar datos adicionales (en una única parte o en varias), la aplicación debe volver a invocar C_SignInit.

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.

Fragmentos 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 de JavaScript

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

Signo

La función Sign firma datos de una sola parte. No es necesario realizar las suboperaciones SignUpdate y SignFinal para una firma de una única parte. Antes de invocar esta función, asegúrese de que primero ejecuta SignInit.

Descripción Enlaza con m_Sign de EP11, que es una implementación de C_Sign de PKCS #11.
Parámetros
    message SignRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message SignResponse {
        bytes Signature = 3;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_Sign de PKCS #11.

No actualiza (state, slen).

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession. (La biblioteca de host debe correlacionar la sesión con el estado almacenado.)

El blob state era una salida de: SignInit.

Parámetros
    CK_RV m_Sign (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_Sign. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_Sign firma datos en una sola pieza, donde la firma es un apéndice de los datos. hSession es el manejador de la sesión; pData apunta a los datos; ulDataLen es la longitud de los datos; pSignature apunta a la ubicación que recibe la firma; pulSignatureLen apunta a la ubicación que contiene la longitud de la firma.

C_Sign utiliza el convenio que se describe en la Sección 5.2 de la especificación de API PKCS #11 en la producción de la salida.

La operación de firma se debe inicializar con C_SignInit. Una llamada a C_Sign siempre finaliza la operación de firma activa a menos que devuelva CKR_BUFFER_TOO_SMALL o que sea una llamada satisfactoria (es decir, una que devuelve CKR_OK) para determinar la longitud del almacenamiento intermedio necesario para contener la firma.

C_Sign no se puede utilizar para finalizar una operación de varias partes y se debe invocar después de C_SignInit sin que intervenga ninguna llamada C_SignUpdate.

Para la mayoría de los mecanismos, C_Sign equivale a una secuencia de operaciones C_SignUpdate seguida de 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.

Fragmentos 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 de JavaScript

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

SignUpdate

La función SignUpdate continúa una operación de firma de varias partes. Antes de invocar esta función, asegúrese de que primero ejecuta SignInit.

Descripción Enlaza con m_SignUpdate de EP11, que es una implementación de C_SignUpdate de PKCS #11.
Parámetros
    message SignUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message SignUpdateResponse {
        bytes State = 1;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_SignUpdate de PKCS #11.

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession. (La biblioteca de host debe correlacionar la sesión con el estado almacenado.)

El blob state era una salida de: SignInit.

Parámetros
    CK_RV m_SignUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_SignUpdate. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_SignUpdate continúa una operación de firma de varias partes, procesando otra parte de datos. hSession es el manejador de la sesión, pPart apunta a la parte de datos; ulpartLen es la longitud de la parte de datos.

La operación de firma se debe inicializar con C_SignInit. Se puede llamar a esta función las veces que se quiera seguidas. Una llamada a C_SignUpdate que da como resultado un error finaliza la operación de firma actual.

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.

Fragmentos 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 de JavaScript

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

SignFinal

La función SignFinal finaliza una operación de firma de varias partes.

Descripción Enlaza con m_SignFinal de EP11, que es una implementación de C_SignFinal de PKCS #11.
Parámetros
    message SignFinalRequest {
        bytes State = 1;
    }
    message SignFinalResponse {
        bytes Signature = 2;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_SignFinal de PKCS #11.

No actualiza (state, slen).

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession. (La biblioteca de host debe correlacionar la sesión con el estado almacenado.)

El blob state era una salida de: SignInit, SignUpdate.

Parámetros
    CK_RV m_SignFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_SignFinal. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_SignFinal finaliza una operación de firma de varias partes, devolviendo la firma. hSession es el manejador de la sesión; pSignature apunta a la ubicación que recibe la firma; pulSignatureLen apunta a la ubicación que contiene la longitud de la firma.

C_SignFinal utiliza el convenio que se describe en la Sección 5.2 de la especificación de API PKCS #11 en la producción de la salida.

La operación de firma se debe inicializar con C_SignInit. Una llamada a C_SignFinal siempre finaliza la operación de firma activa a menos que devuelva CKR_BUFFER_TOO_SMALL o que sea una llamada satisfactoria (es decir, una que devuelve CKR_OK) para determinar la longitud del almacenamiento intermedio necesario para contener la firma.

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.

Fragmentos 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 de JavaScript

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

SignSingle

La función SignSingle firma o calcula el MAC de los datos en un paso con una llamada y sin crear ningún estado de resumen intermedio. No devuelve ningún estado al host y solo devuelve el resultado. Esta función es una extensión de IBM EP11 a la especificación estándar PKCS #11 y es una combinación de las funciones SignInit y Sign. Le permite completar una operación de firma con una sola llamada en lugar de una serie de llamadas.

Descripción Se enlaza a EP11 m_signSingle.
Parámetros
    message SignSingleRequest {
        bytes PrivKey = 1;
        Mechanism Mech = 2;
        bytes Data = 3;
    }
    message SignSingleResponse {
        bytes Signature = 4;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Combinación de extensión no estándar de SignInit y Sign. Firma o calcula el MAC de los datos de un paso con una llamada sin crear ningún estado de resumen intermedio. No devuelve ningún estado al host, solamente el resultado.

Este es el modo preferido de firmar, sin un viaje de ida y vuelta adicional, de cifrado y descifrado. Funcionalmente, SignSingle equivale a SignInit seguido inmediatamente de Sign.

El blob (key, klen) y el mecanismo pmech juntos se deben poder pasar a SignInit.

Se admiten solicitudes de datos múltiples para firmas HMAC y CMAC (subvariantes 2 y 3).

Consulte también: SignInit, Sign, VerifySingle.

Parámetros
    CK_RV m_SignSingle (
        const unsigned char *privKey, size_t privKeylen,
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_Decrypt. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.

Fragmentos 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 de JavaScript

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

VerifyInit

La función VerifyInit inicializa una operación de verificación. Debe llamar a esta función primero para verificar una firma.

Descripción Enlaza con m_VerifyInit de EP11, que es una implementación de C_VerifyInit de PKCS #11.
Parámetros
    message VerifyInitRequest {
        Mechanism Mech = 2;
        bytes PubKey = 3;
    }
    message VerifyInitResponse {
        bytes State = 1;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_VerifyInit de PKCS #11. A partir de un blob de clave (key, klen), inicialice un estado de sesión de verificación en (state, slen). El blob de clave puede ser un objeto de clave pública o bytes de clave de HMAC. El tipo de blob de clave debe ser coherente con pmech.

Para los mecanismos de clave pública, (key, klen) debe contener un SPKI. Se puede calcular el MAC de este SPKI (tal como lo ha devuelto anteriormente GenerateKeyPair) o puede ser solo SPKI (si se obtiene de una fuente externa como, por ejemplo, un certificado).

Si se inicializa una operación de HMAC, las restricciones de sesión del objeto Verify se heredan de la clave de HMAC. Puesto que los SPKI no están vinculados a sesiones, los estados de clave pública de Verify no están sujetos a la sesión.

El blob key,klen debe estar correlacionado desde el parámetro PKCS #11 hKey.

Nota: SignInit y VerifyInit son internamente igual para HMAC y otros mecanismos simétricos/MAC.

Parámetros
    CK_RV m_VerifyInit (
        unsigned char * state, size_t * statelen,
        CK_MECHANISM_PTR mech,
        const unsigned char *pubKey, size_t pubKeylen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_VerifyInit. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_VerifyInit inicializa una operación de verificación, donde la firma es un apéndice de los datos. hSession es el manejador de la sesión; pMechanism apunta a la estructura que especifica el mecanismo de verificación; hKey es el manejador de la clave de verificación.

El atributo CKA_VERIFY de la clave de verificación, que indica si la clave admite verificación siendo la firma un apéndice a los datos, debe ser CK_TRUE.

Después de llamar a C_VerifyInit, la aplicación puede llamar a C_Verify para verificar una firma en los datos de una sola parte; o llamar a C_VerifyUpdate una o varias veces, seguido de C_VerifyFinal, para verificar una firma en datos de varias partes. La operación de verificación está activa hasta que la aplicación llama a C_Verify o C_VerifyFinal. Para procesar datos adicionales (en una única parte o en varias), la aplicación debe volver a invocar C_VerifyInit.

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.

Fragmentos 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 de JavaScript

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

Verificar

La función Verify verifica una firma de los datos de una sola parte. No es necesario realizar las suboperaciones VerifyUpdate y VerifyFinal para la verificación de una única parte. Antes de invocar esta función, asegúrese de que primero ejecuta VerifyInit.

Descripción Enlaza con m_Verify de EP11, que es una implementación de C_Verify de PKCS #11.
Parámetros
    message VerifyRequest {
        bytes State = 1;
        bytes Data = 2;
        bytes Signature = 3;
    }
    message VerifyResponse {
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_Verify de PKCS #11.

No actualiza (state, slen).

El orden relativo de los datos y la firma son relativos invertidos a VerifySingle.

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession. (La biblioteca de host debe correlacionar la sesión con el estado almacenado.)

El blob state era una salida de: VerifyInit.

Parámetros
    CK_RV m_Verify (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR signature, CK_ULONG signaturelen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_Verify. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_Verify verifica una firma en una operación de una sola parte, donde la firma es un apéndice de los datos. hSession es el manejador de la sesión; pData apunta a los datos; ulDataLen es la longitud de los datos; pSignature apunta a la firma; ulSignatureLen es la longitud de la firma.

La operación de verificación se debe inicializar con C_VerifyInit. Una llamada a C_Verify siempre finaliza la operación de verificación activa.

Una llamada satisfactoria a C_Verify debe devolver el valor CKR_OK (lo que indica que la firma proporcionada es válida) o CKR_SIGNATURE_INVALID (lo que indica que la firma proporcionada no es válida). Si la firma no es válida basándose únicamente en su longitud, es necesario que se devuelva CKR_SIGNATURE_LEN_RANGE. En cualquier caso, finaliza la operación de firma activa.

C_Verify no se puede utilizar para finalizar una operación de varias partes y se debe invocar después de C_VerifyInit sin que intervenga ninguna llamada C_VerifyUpdate.

Para la mayoría de los mecanismos, C_Verify equivale a una secuencia de operaciones C_VerifyUpdate seguida de 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.

Fragmentos 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 de JavaScript

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

VerifyUpdate

La función VerifyUpdate continúa una operación de verificación de varias partes. Antes de invocar esta función, asegúrese de que primero ejecuta VerifyInit.

Descripción Enlaza con m_VerifyUpdate de EP11, que es una implementación de C_VerifyUpdate de PKCS #11.
Parámetros
    message VerifyUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message VerifyUpdateResponse {
        bytes State = 1;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_VerifyUpdate de PKCS #11.

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession. (La biblioteca de host debe correlacionar la sesión con el estado almacenado.)

El blob state era una salida de: VerifyInit.

Parámetros
    CK_RV m_VerifyUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_VerifyUpdate. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_VerifyUpdate continúa una operación de verificación de varias partes, procesando otra parte de datos. hSession es el manejador de la sesión, pPart apunta a la parte de datos; ulPartLen es la longitud de la parte de datos.

La operación de verificación se debe inicializar con C_VerifyInit. Se puede llamar a esta función las veces que se quiera seguidas. Una llamada a C_VerifyUpdate que da como resultado un error termina la operación de verificación actual.

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.

Fragmentos 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 de JavaScript

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

VerifyFinal

La función VerifyFinal finaliza una operación de verificación de varias partes.

Descripción Enlaza con m_VerifyFinal de EP11, que es una implementación de C_VerifyFinal de PKCS #11.
Parámetros
    message VerifyFinalRequest {
        bytes State = 1;
        bytes Signature = 2;
    }
    message VerifyFinalResponse {
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_VerifyFinal de PKCS #11.

No actualiza (state, slen).

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession. (La biblioteca de host debe correlacionar la sesión con el estado almacenado.)

El blob state era una salida de: VerifyInit, VerifyUpdate.

Parámetros
    CK_RV m_VerifyFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR signature, CK_ULONG signaturelen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_VerifyFinal. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_VerifyFinal finaliza una operación de verificación de varias partes, comprobando la firma. hSession es el manejador de la sesión; pSignature apunta a la firma; ulSignatureLen es la longitud de la firma.

La operación de verificación se debe inicializar con C_VerifyInit. Una llamada a C_VerifyFinal siempre finaliza la operación de verificación activa.

Una llamada satisfactoria a C_VerifyFinal debe devolver el valor CKR_OK (lo que indica que la firma proporcionada es válida) o CKR_SIGNATURE_INVALID (lo que indica que la firma proporcionada no es válida). Si la firma no es válida basándose en su longitud, se debe devolver CKR_SIGNATURE_LEN_RANGE. En cualquier caso, finaliza la operación de verificación activa.

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.

Fragmentos 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 de JavaScript

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

VerifySingle

La función VerifySingle firma o calcula el MAC de los datos en un paso con una llamada y sin crear ningún estado de resumen intermedio. No devuelve ningún estado al host y solo devuelve el resultado de la verificación. Esta función es una extensión de IBM EP11 a la especificación estándar PKCS #11 y es una combinación de las funciones VerifyInit y Verify. Le permite completar una operación de verificación con una sola llamada en lugar de una serie de llamadas.

Descripción Se enlaza a EP11 m_VerifySingle.
Parámetros
    message VerifySingleRequest {
        bytes PubKey = 1;
        Mechanism Mech = 2;
        bytes Data = 3;
        bytes Signature = 4;
    }
    message VerifySingleResponse {
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Combinación de extensión no estándar de VerifyInit y Verify. Firma o calcula el MAC de los datos de un paso con una llamada sin crear ningún estado de resumen intermedio. No devuelve ningún estado al host, solamente el resultado de la verificación. No hay consulta de tamaño puesto que esta función devuelve un valor booleano.

Este es el modo preferido de verificar una firma, sin un viaje de ida y vuelta adicional, de cifrado, descifrado. Funcionalmente, VerifySingle equivale a VerifyInit seguido inmediatamente de Verify.

El blob (key, klen) y el mecanismo pmech juntos se deben poder pasar a VerifyInit.

Para los mecanismos de clave pública, (key, klen) debe contener un SPKI. Se puede calcular el MAC de este SPKI (tal como lo ha devuelto GenerateKeyPair) o puede ser solo SPKI (si se obtiene de una fuente externa como, por ejemplo, un certificado).

Consulte también: VerifyInit, Verify, SignSingle.

Parámetros
    CK_RV m_VerifySingle (
        const unsigned char *pubKey, size_t pubKeylen,
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR signature, CK_ULONG signaturelen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_VerifySingle. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.

Fragmentos 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 de JavaScript

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

Protección de la integridad de los datos mediante un resumen de mensaje

GREP11 proporciona un conjunto de funciones para crear resúmenes de mensajes diseñados para proteger la integridad de una pieza de datos. Es posible que tenga que invocar una serie de subfunciones para realizar una operación de resumen. Por ejemplo, la operación de resumen de varias partes consta de las suboperaciones DigestInit, DigestUpdate y DigestFinal.

DigestInit

La función DigestInit inicializa una operación de resumen de mensajes. Debe ejecutar esta función primero para realizar una operación de resumen.

Descripción Enlaza con m_DigestInit de EP11, que es una implementación de C_DigestInit de PKCS #11.
Parámetros
    message DigestInitRequest {
        Mechanism Mech = 2;
    }
    message DigestInitResponse {
        bytes State = 1;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_DigestInit de PKCS #11.

Crea el estado de resumen envuelto.

Nota: las consultas de tamaño reciben soporte pero el estado envuelto siempre lo devuelve el programa de fondo, al contrario que ocurre con la mayoría de las consultas de tamaño (que se devuelve un tamaño de salida, en lugar de la salida real). Los estados Digest son suficientemente pequeños para no introducir una sobrecarga de transporte significativa.

Durante las consultas de tamaño, el host solamente descarta el estado devuelto e informa del tamaño del blob (en len). Cuando se devuelve blob, se comprueba len para el tamaño devuelto.

El blob state,len debe correlacionarse con el parámetro hSession de PKCS #11. (La biblioteca de host debe vincular el blob a la sesión.)

Parámetros
    CK_RV m_DigestInit (
        unsigned char * state, size_t * len,
        const CK_MECHANISM_PTR mech,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_DigestInit. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_DigestInit inicializa una operación de resumen de mensajes. hSession es el manejador de la sesión; pMechanism apunta al mecanismo de resumen.

Después de llamar a C_DigestInit, la aplicación puede llamar a C_Digest para resumir datos de una sola parte, o puede llamar a C_DigestUpdate cero o más veces, seguido de C_DigestFinal, para resumir datos de varias partes. La operación de resumen de mensajes está activa hasta que la aplicación utiliza una llamada a C_Digest o C_DigestFinal para obtener el resumen del mensaje. Para procesar datos adicionales (en una única parte o varias), la aplicación debe volver a invocar 1C_DigestInit1.

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.

Fragmentos 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 de JavaScript

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

Digest

La función Digest realiza un resumen de datos de una sola parte. No es necesario llamar a las funciones DigestUpdate y DigestFinal para resumir los datos de una sola parte. Antes de invocar esta función, asegúrese de que primero ejecuta DigestInit. Cuando establezca parámetros, tenga en cuenta que la longitud de los datos de entrada es cero y el puntero que apunta a la ubicación de datos de entrada es NULL.

Descripción Enlaza con m_Digest de EP11, que es una implementación de C_Digest de PKCS #11.
Parámetros
    message DigestRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message DigestResponse {
        bytes Digest = 3;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_Digest de PKCS #11.

Si un objeto de resumen tiene exactamente 0 (cero) bytes que se le añaden después de crearlo, en cualquier combinación de transferencias de cero bytes, todavía puede realizar un resumen de un paso, incluso si es necesario rechazarlo mediante una implementación estricta.

No actualiza (state, slen).

Las implementaciones pueden realizar DigestUpdate, DigestFinalo Digest llama a objetos de resumen de texto simple en el código de host, omitiendo por completo los programas de fondo HSM. Esta opción puede estar visible o no para el código de host y no tiene ningún impacto sobre la seguridad de la operación (porque los objetos de deselección no realizan resúmenes de datos confidenciales).

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession. El blob state era una salida de: DigestInit.

Parámetros
    CK_RV m_Digest (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_Digest. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_Digest resume los datos en una sola parte. hSession es el manejador de la sesión, pData apunta a los datos; ulDataLen es la longitud de los datos; pDigest apunta a la ubicación que recibe el resumen del mensaje; pulDigestLen apunta a la ubicación que contiene la longitud del resumen del mensaje.

C_Digest utiliza el convenio que se describe en la sección 5.2 de la especificación de API PKCS #11 en la producción de la salida.

La operación de resumen se debe inicializar con C_DigestInit. Una llamada a C_Digest siempre finaliza la operación de resumen activa a menos que devuelva CKR_BUFFER_TOO_SMALL o que sea una llamada satisfactoria (es decir, una que devuelve CKR_OK) para determinar la longitud del almacenamiento intermedio necesario para contener el resumen de mensajes.

C_Digest no se puede utilizar para finalizar una operación de varias partes y se debe invocar después de C_DigestInit sin que intervenga ninguna llamada C_DigestUpdate.

Los datos de entrada y la salida de resumen pueden estar en el mismo lugar, es decir, estaría bien si pData y pDigest apuntaran a la misma ubicación.

C_Digest equivale a una secuencia de operaciones de C_DigestUpdate seguido de 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.

Fragmentos 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 de JavaScript

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

DigestUpdate

La función DigestUpdate continúa una operación de resumen de varias partes. Antes de invocar esta función, asegúrese de que primero ejecuta DigestInit. Cuando establezca parámetros, tenga en cuenta que la longitud de los datos de entrada es cero y el puntero que apunta a la ubicación de datos de entrada es NULL.

Descripción Enlaza con m_DigestUpdate de EP11, que es una implementación de C_DigestUpdate de PKCS #11.
Parámetros
    message DigestUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message DigestUpdateResponse {
        bytes State = 1;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_DigestUpdate de PKCS #11.

DigestUpdate es polimórfico, aceptando ambos objetos de resumen envueltos o borrados, actualizando el estado en el mismo formato.

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession. (La biblioteca de host debe correlacionar la sesión con el estado almacenado.)

El blob state era una salida de: DigestInit, DigestUpdate, DigestKey.

Consulte también: DigestInit

Parámetros
    CK_RV m_DigestUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_DigestUpdate. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_DigestUpdate continúa una operación de resumen de mensajes de varias partes, procesando otra parte de datos. hSession es el manejador de la sesión, pPart apunta a la parte de datos; ulPartLen es la longitud de la parte de datos.

La operación de resumen de mensajes se debe inicializar con C_DigestInit. Las llamadas a esta función y a C_DigestKey se pueden intercalar tantas veces como se quiera y en cualquier orden. Una llamada a C_DigestUpdate que da como resultado un error termina la operación de resumen actual.

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.

Fragmentos 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 de JavaScript

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

DigestFinal

La función DigestFinal finaliza una operación de resumen de varias partes.

Descripción Enlaza con m_DigestFinal de EP11, que es una implementación de C_DigestFinal de PKCS #11.
Parámetros
    message DigestFinalRequest {
        bytes State = 1;
    }
    message DigestFinalResponse {
        bytes Digest = 2;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Implementación de C_DigestFinal de PKCS #11.

DigestFinal es polimórfico, acepta tanto objetos de resumen envueltos como limpios.

No actualiza (state, slen).

El blob state,slen debe estar correlacionado desde el parámetro PKCS #11 hSession.

El blob state era una salida de: DigestInit, DigestUpdate, DigestKey.

Parámetros
    CK_RV m_DigestFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_DigestFinal. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.
Descripción

C_DigestFinal finaliza una operación de resumen de mensajes de varias partes, devolviendo el resumen del mensaje. hSession es el manejador de la sesión; pDigest apunta a la ubicación que recibe el resumen del mensaje; pulDigestLen apunta a la ubicación que contiene la longitud del resumen del mensaje.

C_DigestFinal utiliza el convenio que se describe en la Sección 5.2 de la especificación de API PKCS #11 en la producción de la salida.

La operación de resumen se debe inicializar con C_DigestInit. Una llamada a C_DigestFinal siempre finaliza la operación de resumen activa a menos que devuelva CKR_BUFFER_TOO_SMALL o que sea una llamada satisfactoria (es decir, una que devuelve CKR_OK) para determinar la longitud del almacenamiento intermedio necesario para contener el resumen del mensaje.

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.

Fragmentos 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 de JavaScript

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

DigestSingle

La función DigestSingle resumen datos en un paso con una llamada y sin crear ningún estado de resumen intermedio ni viajes de ida y vuelta innecesarios. Esta función es una extensión de IBM EP11 a la especificación estándar PKCS #11 y es una combinación de las funciones DigestInit y Digest. Le permite completar una operación de resumen con una sola llamada en lugar de una serie de llamadas.

Descripción Se enlaza a EP11 m_DigestSingle.
Parámetros
    message DigestSingleRequest {
        Mechanism Mech = 1;
        bytes Data = 2;
    }
    message DigestSingleResponse {
        bytes Digest = 3;
    }
    
Valores de retorno Envuelve el error de EP11 en el mensaje Grep11Error.
Descripción

Combinación de extensión no estándar de DigestInit y Digest. Resumen datos en un paso, con una llamada, sin crear ningún estado de resumen intermedio ni viajes de ida y vuelta innecesarios.

Se trata del método preferido a la hora de realizar un resumen de texto simple para aplicaciones compatibles con XCP. Funcionalmente, DigestSingle equivale a DigestInit seguido inmediatamente de Digest.

Si se tiene que resumir un clave, se debe utilizar DigestInit y DigestKey, porque esta función no gestiona los blobs de claves.

No devuelve ningún estado al host, solamente el resultado del resumen. No hay parámetros que no sean de PKCS #11 porque todo se utiliza directamente a partir de la llamada de PKCS #11.

Parámetros
    CK_RV m_DigestSingle (
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        destino target_t
    );
    
Valores de retorno Un subconjunto de los valores de retorno de C_DigestSingle. Para obtener más información, consulte el capítulo Valores de retorno del documento de estructura de biblioteca PKCS #11 (EP11) Enterprise.

Fragmentos 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 de JavaScript

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

Ejemplos de código

La API GREP11 soporta lenguajes de programación con bibliotecas gRPC. Se proporcionan dos repositorios GitHub de ejemplo para probar la API de GREP11: