Operazioni crittografiche: API GREP11

IBM Cloud® Hyper Protect Crypto Services fornisce una serie di funzioni di crittografia eseguite in un HSM(Hardware Security Module)A physical appliance that provides on-demand encryption, key management, and key storage as a managed service. nel cloud. Puoi eseguire operazioni di crittografia accedendo in remoto a queste funzioni con le chiamate API Enterprise PKCS #11 (EP11) su gRPC (noto anche come GREP11).

Per ulteriori informazioni su come le funzioni GREP11 sono correlate a PKCS #11 e EP11, vedi GREP11.

L'API GREP11 può elaborare fino a 500 richieste al secondo per una singola unità di crittografia.

Accesso all'API

Un endpoint API GREP11, una chiave API dell'ID servizio e un endpoint IAM sono necessari per l'inizializzazione prima di eseguire qualsiasi chiamata della funzione API GREP11. Per ulteriori informazioni, vedi Generazione di una richiesta API GREP11.

Gestione degli errori

GREP11 si basa sulla specifica gRPC per la gestione degli errori. Quando si verifica un errore, i client gRPC ricevono un Buffer di protocollo message Status.

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

Nel messaggio di errore,

  • code include il codice di stato, che deve essere un valore di tipo enumerato (enum) del campo google.rpc.Code.
  • message include un messaggio di errore rivolto agli sviluppatori in inglese. Qualsiasi messaggio di errore rivolto all'utente deve essere localizzato e inviato nel campo google.rpc.Status.details o localizzato dall'utente.
  • details elenca i messaggi che trasportano i dettagli dell'errore. Per l'API è disponibile una serie comune di tipi di messaggi.

GREP11 utilizza il campo Detail per collegare ulteriori informazioni sul codice di errore.

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

È possibile eseguire il cast del campo Code sul valore CK_RV in PKCS #11. Questo campo contiene i codici di errore definiti dalla specifica PKCS #11 o le estensioni del fornitore definite da EP11. EP11 utilizza solo un sottoinsieme di valori restituiti che sono definiti da PKCS #11. Per ulteriori informazioni, consultare la sezione 10.1.6 Valori di ritorno in Enterprise PKCS #11 Struttura della libreria.

È disponibile un esempio in Golang che tratta gli errori.

Elenco di funzioni GREP11

Le funzioni PKCS #11 contrassegnate con un asterisco (*) nella tabella sono implementate da EP11 su gRPC. Le altre non sono implementate,

Tabella 1. Descrive le funzioni implementate in EP11 su gRPC
PKCS #11 Enterprise PKCS #11 Enterprise PKCS #11 su gRPC Descrizione
C_Initialize N/D N/D Inizializza Cryptoki.
C_Finalize N/D N/D Ripulisce varie risorse associate a Cryptoki.
C_GetInfo N/D N/D Ottiene informazioni generali su Cryptoki.
C_GetFunctionList N/D N/D Ottiene i punti di ingresso delle funzioni libreria Cryptoki.
C_GetSlotList N/D N/D Ottiene un elenco di slot nel sistema.
C_GetSlotInfo N/D N/D Ottiene informazioni su uno specifico slot.
C_GetTokenInfo N/D N/D Ottiene informazioni su uno specifico token.
C_WaitForSlotEvent N/D N/D Attende che si verifichi un evento di slot (inserimento token, rimozione e così via).
C_GetMechanismList* m_GetMechanismList GetMechanismList Ottiene un elenco di meccanismi supportati da un token.
C_GetMechanismInfo* m_GetMechanismInfo GetMechanismInfo Ottiene informazioni su uno specifico meccanismo.
C_InitToken N/D N/D Inizializza un token.
C_InitPIN N/D N/D Inizializza il PIN dell'utente normale.
C_SetPIN N/D N/D Modifica il PIN dell'utente corrente.
C_OpenSession N/D N/D Apre una connessione tra un'applicazione e uno specifico token o configura un callback dell'applicazione per l'inserimento del token.
C_CloseSession N/D N/D Chiude una sessione.
C_CloseAllSessions N/D N/D Chiude tutte le sessioni con un token.
C_GetSessionInfo N/D N/D Ottiene le informazioni sulla sessione.
C_GetOperationState N/D N/D Ottiene lo stato delle operazioni crittografiche di una sessione.
C_SetOperationState N/D N/D Imposta lo stato delle operazioni crittografiche di una sessione.
C_Login N/D N/D Accede a un token.
C_Logout N/D N/D Esegue la disconnessione da un token.
C_CreateObject N/D N/D Crea un oggetto.
C_CopyObject N/D N/D Crea una copia di un oggetto.
C_DestroyObject N/D N/D Elimina un oggetto.
C_GetObjectSize N/D N/D Ottiene la dimensione di un oggetto in byte.
C_GetAttributeValue* m_GetAttributeValue GetAttributeValue Ottiene un valore di attributo di un oggetto.
C_SetAttributeValue* m_SetAttributeValue SetAttributeValue Modifica un valore di attributo di un oggetto. È possibile modificare solo gli attributi booleani.
C_FindObjectsInit N/D N/D Inizializza un'operazione di ricerca oggetto.
C_FindObjects N/D N/D Continua un'operazione di ricerca oggetto.
C_FindObjectsFinal N/D N/D Termina un'operazione di ricerca oggetto.
C_EncryptInit* m_EncryptInit EncryptInit Inizializza un'operazione di crittografia.
C_Encrypt* m_Encrypt Encrypt Crittografa i dati di una singola parte.
C_EncryptUpdate* m_EncryptUpdate EncryptUpdate Continua un'operazione di crittografia di più parti.
C_EncryptFinal* m_EncryptFinal EncryptFinal Termina un'operazione di crittografia di più parti.
N/D m_EncryptSingle EncryptSingle Estensione IBM, variante non standard di Encrypt. Elabora i dati in un singolo passaggio, con una singola chiamata. Non restituisce alcuno stato all'host, fatta eccezione per i dati crittografati.
N/D m_ReencryptSingle ReencryptSingle Estensione IBM, variante non standard di Encrypt. Decodifica i dati con la chiave originale e crittografa i dati non elaborati con una chiave differente in una singola chiamata all'interno del cloud HSM. Non restituisce alcuno stato all'host diverso dai dati crittografati.
C_DecryptInit* m_DecryptInit DecryptInit Inizializza un'operazione di decrittografia.
C_Decrypt* m_Decrypt Decrypt Decrittografa i dati crittografati di una singola parte.
C_DecryptUpdate* m_DecryptUpdate DecryptUpdate Continua un'operazione di decrittografia di più parti.
C_DecryptFinal* m_DecryptFinal DecryptFinal Termina un'operazione di decrittografia di più parti.
N/D m_DecryptSingle DecryptSingle Estensione IBM, variante non standard di Decrypt. Elabora i dati in un singolo passaggio, con una singola chiamata. Non restituisce alcuno stato all'host, fatta eccezione per i dati decrittografati.
C_DigestInit* m_DigestInit DigestInit Inizializza un'operazione di digest dei messaggi.
C_Digest* m_Digest Digest Esegue il digest di dati di una singola parte. La lunghezza dei dati di input non può essere zero e il puntatore che punta all'ubicazione dei dati di input non può essere NULL.
C_DigestUpdate* m_DigestUpdate DigestUpdate Continua un'operazione di digest di più parti. La lunghezza dei dati di input non può essere zero e il puntatore che punta all'ubicazione dei dati di input non può essere NULL.
C_DigestKey N/D N/D Esegue il digest di una chiave.
C_DigestFinal* m_DigestFinal DigestFinal Termina un'operazione di digest di più parti.
N/D m_DigestSingle DigestSingle Estensione IBM, estensione non standard, combinazione di DigestInit e Digest. Esegue il digest dei dati in un singolo passaggio, senza creare uno stato di digest intermedio e roundtrip non necessari
C_SignInit* m_SignInit SignInit Inizializza un'operazione di firma.
C_Sign* m_Sign Firma Firma i dati di una singola parte.
C_SignUpdate* m_SignUpdate SignUpdate Continua un'operazione di firma di più parti.
C_SignFinal* m_SignFinal SignFinal Termina un'operazione di firma di più parti.
C_SignRecoverInit N/D N/D Inizializza un'operazione di firma, in cui i dati vengono recuperati dalla firma.
C_SignRecover N/D N/D Firma i dati a parte singola, dove i dati vengono recuperati dalla firma.
N/D m_SignSingle SignSingle Estensione IBM, estensione non standard, combinazione di SignInit e Sign. Firma o protegge con una chiave MAC i dati in un singolo passaggio, con una singola chiamata, senza creare uno stato di digest intermedio. Non restituisce alcuno stato all'host diverso dal risultato.
C_VerifyInit* m_VerifyInit VerifyInit Inizializza un'operazione di verifica.
C_Verify* m_Verify Verifica Verifica una firma sui dati di una singola parte.
C_VerifyUpdate* m_VerifyUpdate VerifyUpdate Continua un'operazione di verifica di più parti.
C_VerifyFinal* m_VerifyFinal VerifyFinal Termina un'operazione di verifica di più parti.
C_VerifyRecoverInit N/D N/D Inizializza un'operazione di verifica, dove i dati vengono ripristinati dalla firma.
C_VerifyRecover N/D N/D Verifica una firma sui dati di una singola parte, dove i dati vengono ripristinati dalla firma.
N/D m_VerifySingle VerifySingle Estensione IBM, estensione non standard, combinazione di VerifyInit e Verify. Firma o protegge con una chiave MAC i dati in un singolo passaggio, con una singola chiamata, senza creare uno stato di digest intermedio. Non restituisce alcuno stato all'host, fatta eccezione per il risultato della verifica.
C_DigestEncryptUpdate N/D N/D Continua le operazioni di digest e crittografia di più parti simultanee.
C_DecryptDigestUpdate N/D N/D Continua le operazioni di digest e decrittografia di più parti simultanee.
C_SignEncryptUpdate N/D N/D Continua le operazioni di firma e crittografia di più parti simultanee.
C_DecryptVerifyUpdate N/D N/D Continua le operazioni di decrittografia e verifica di più parti simultanee.
C_GenerateKey* m_GenerateKey GenerateKey Genera una chiave segreta.
C_GenerateKeyPair* m_GenerateKeyPair GenerateKeyPair Genera una coppia chiave pubblica e chiave privata.
C_WrapKey* m_WrapKey WrapKey Impacchetta (crittografa) una chiave.
C_UnwrapKey* m_UnwrapKey UnwrapKey Spacchetta (decrittografa) una chiave.
N/D N/D Blob RewrapKey Trasferisce la proprietà di un BLOB controllato dalla chiave principale corrente alla nuova chiave principale quando viene eseguito il commit della nuova chiave principale. Questa funzione è un comando di amministrazione speciale supportato solo da GREP11.
C_DeriveKey* m_DeriveKey DeriveKey Deriva una chiave da una chiave di base.
C_SeedRandom N/D N/D Aggiunge materiale di seeding al generatore di numeri casuale.
C_GenerateRandom* m_GenerateRandom GenerateRandom Genera dei dati casuali. La lunghezza dei dati casuali non può essere zero e il puntatore che punta alla posizione dei dati casuali non può essere NULL. La lunghezza massima dei dati casuali che possono essere richiesti è 1 milione di byte.
C_GetFunctionStatus N/D N/D Funzione legacy che restituisce sempre CKR_FUNCTION_NOT_PARALLEL.
C_CancelFunction N/D N/D Funzione legacy che restituisce sempre CKR_FUNCTION_NOT_PARALLEL.

Meccanismi supportati

Un meccanismo viene indicato come un processo per implementare un'operazione crittografica. Può variare a seconda del livello di firmware nella scheda crittografica. La seguente tabella mostra i meccanismi attualmente supportati e come sono correlati alle categorie di funzione GREP11 comuni.

Tabella 2. Descrive i meccanismi GREP11 supportati
Gruppo di funzioni Meccanismi supportati
Crittografare e decrittografare CKM_RSA_PKCS1, CKM_RSA_PKCS_OAEP1, CKM_AES_ECB, CKM_CBC, CKM_AES_CBC_PAD, CKM_DES3_ECB, CKM_DES3_CBC, CKM_DES3_CBC_PAD
Firmare e verificare CKM_RSA_PKCS1, CKM_RSA_PKCS_PSS1, CKM_RS 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
Genera chiave o genera coppia di chiavi 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
A capo e a capo CKM_RSA_PKCS, CKM_RSA_PKCS_OAEP, CKM_AES_ECB, CKM_AES_CBC, CKM_CBC_PAD, CKM_DES3_ECB, CKM_DES3_CBC, CKM_DES3_CBC_PAD
Ricava 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, TCKM_derivation

1: questo meccanismo supporta solo le operazioni a parte singola che non sono in grado di utilizzare alcuna delle funzioni Update GREP11, come EncryptUpdate, DecryptUpdate e DigestUpdate.

2: questo meccanismo è solo disponibile per operazioni GREP11 SignSingle e VerifySingle.

3: questo meccanismo non è supportato dalla scheda crittografica IBM 4768 e non è disponibile per operazioni SignUpdate e VerifyUpdate.

4: Questo meccanismo supporta operazioni a parte singola (SignInit, Sign, VerifyInit, Verify), SignSingle e VerifySingle.

Attributi e tipi di chiavi supportati

Gli attributi GREP11 definiscono le caratteristiche dell'oggetto che impostano il modo in cui un oggetto può essere utilizzato e a cui è possibile accedere. La seguente tabella mostra gli attributi supportati e la loro relazione con i diversi tipi di chiave supportati.

Tabella 3. Descrive gli attributi supportati
Attributo Descrizione Tipi di chiave supportati
VALORE_CHECK_CKA Il checksum della chiave chiavi AES, chiavi DES
CKA_COPYABLE Se impostato su CKA_TRUE, l'oggetto può essere copiato utilizzando la funzione PKCS#11 C_CopyObject Chiavi private EC, chiavi pubbliche EC, chiavi private RSA, chiavi pubbliche RSA, chiavi private DH, chiavi pubbliche DH, chiavi private DSA, chiavi pubbliche DSA, chiavi AES, chiavi DES, chiavi generiche
CKA_DECRYPT CK_TRUE se la chiave supporta la decrittografia. Chiavi private EC, chiavi private RSA, chiavi private DH, chiavi private DSA, chiavi AES, chiavi DES, chiavi generiche
RICAVA CK_TRUE se la chiave supporta la derivazione della chiave (altre chiavi possono essere derivate da questa chiave). Il valore predefinito è CK_FALSE. Chiavi private EC, chiavi pubbliche EC, chiavi private RSA, chiavi pubbliche RSA, chiavi private DH, chiavi pubbliche DH, chiavi private DSA, chiavi pubbliche DSA, chiavi AES, chiavi DES, chiavi generiche
CKA_EC_PARAMS (CKA_ECDSA_PARAMS) Codifica DER di un valore parametri ANSI X9.62. Chiavi private EC, chiavi pubbliche EC
CODIFICA_CKI CK_TRUE se la chiave supporta la crittografia. chiavi pubbliche EC, chiavi pubbliche RSA, chiavi pubbliche DH, chiavi pubbliche DSA, chiavi AES, chiavi DES, chiavi generiche
ESTRAIBILE CK_TRUE se la chiave è estraibile e può essere protetta. Chiavi private EC, chiavi private RSA, chiavi private DH, chiavi private DSA, chiavi AES, chiavi DES, chiavi generiche
CKA_IBM_PQC_PARAMS Parametri di supporto per i meccanismi di crittografia post - quantistica. Nel caso del meccanismo Dilithium CKM_IBM_DILITHIUM, fornisce un OID (marshaled object identifier) che rappresenta la forza dell'algoritmo Dilithium da utilizzare. Attualmente, è supportato solo il livello di Dilithium 4 round 2. Chiavi Dilithium
TIPO_CHIAVE_CA Tipo di chiave. Chiavi private EC, chiavi pubbliche EC, chiavi private RSA, chiavi pubbliche RSA, chiavi private DH, chiavi pubbliche DH, chiavi private DSA, chiavi pubbliche DSA, chiavi AES, chiavi DES, chiavi generiche
CKA_LOCALE CK_TRUE solo se la chiave è stata generata localmente (sul token) con una chiamata C_GenerateKey o C_GenerateKeyPair o creata con una chiamata C_CopyObject come copia di una chiave, il cui attributo CKA_LOCAL era impostato su CK_TRUE. Chiavi private EC, chiavi pubbliche EC, chiavi private RSA, chiavi pubbliche RSA, chiavi private DH, chiavi pubbliche DH, chiavi private DSA, chiavi pubbliche DSA, chiavi AES, chiavi DES, chiavi generiche
CKA_MODIFICABILE Impostare su CK_TRUE se l'oggetto può essere modificato. Chiavi private EC, chiavi pubbliche EC, chiavi private RSA, chiavi pubbliche RSA, chiavi private DH, chiavi pubbliche DH, chiavi private DSA, chiavi pubbliche DSA, chiavi AES, chiavi DES, chiavi generiche
BIT_MODULO_CKA_ Lunghezza, in bit, del modulo n. Chiavi pubbliche RSA
CKA_PUBLIC_EXPONENT Esponente pubblico e. Chiavi private RSA
CKA_PUBLIC_KEY_INFO Codifica DER di SubjectPublicKeyInfo per la chiave pubblica. Il valore deriva dai dati chiave pubblica sottostanti ed è vuoto per impostazione predefinita. chiavi pubbliche RSA, chiavi pubbliche EC
CKA_SIGN CK_TRUE se la chiave supporta le firme dove la firma è un'appendice ai dati. Chiavi private EC, chiavi private RSA, chiavi private DH, chiavi private DSA, chiavi AES, chiavi DES, chiavi generiche
CKA_TRUSTED Il certificato o la chiave possono essere ritenuti attendibili per l'applicazione per la quale sono stati creati. chiavi pubbliche EC, chiavi pubbliche RSA, chiavi pubbliche DH, chiavi pubbliche DSA, chiavi AES, chiavi DES, chiavi generiche
CKA_UNWRAP CK_TRUE se la chiave supporta lo spacchettamento (può essere utilizzato per spacchettare altre chiavi). Chiavi private EC, chiavi private RSA, chiavi private DH, chiavi private DSA, chiavi AES, chiavi DES, chiavi generiche
CKA_VALUE_LEN Lunghezza, in byte, del valore chiave. chiavi AES
CKA_VERIFY CK_TRUE se la chiave supporta la verifica in cui la firma è un'appendice dei dati. chiavi pubbliche EC, chiavi pubbliche RSA, chiavi pubbliche DH, chiavi pubbliche DSA, chiavi AES, chiavi DES, chiavi generiche
IMPACCHETTAMENTO CK_TRUE se la chiave supporta l'impacchettamento (può essere utilizzato per impacchettare altre chiavi). chiavi pubbliche EC, chiavi pubbliche RSA, chiavi pubbliche DH, chiavi pubbliche DSA, chiavi AES, chiavi DES, chiavi generiche
CKA_WRAP_WITH_TRUSTED CK_TRUE se la chiave può essere impacchettata solo con una chiave impacchettata che ha CKA_TRUSTED impostata su CK_TRUE. Il valore predefinito è CK_FALSE. Chiavi private EC, chiavi private RSA, chiavi private DH, chiavi private DSA, chiavi AES, chiavi DES, chiavi generiche

Curve supportate

La libreria EP11 supporta tipi limitati di curve per determinati meccanismi. La seguente tabella elenca i nomi di curva supportati per meccanismi differenti. Il numero nel nome della curva indica il bitcount principale supportato.

Curve supportate per la creazione di chiavi EC (Elliptic Curve)

Il meccanismo CKM_EC_KEY_PAIR_GEN è supportato quando si richiama la funzione GenerateKeyPair per generare i tasti EC (Elliptic Curve). I parametri del nome della curva devono essere specificati come OID (object identifier) utilizzando CKA_EC_PARAMS. È possibile ottenere l'OID ricercando il nome della curva nel repository OID.

Tabella 4. Tipi di curva supportati per la generazione delle chiavi EC
Meccanismo GREP11 Tipi di curva supportati Nomi curva supportati
CKM_EC_KEY_PAIR_GEN Curve NIST(National Institute of Standards and Technology)
  • P-192, noto anche come secp192r1 e prime192v1.
  • P-224, noto anche come secp224r1.
  • P-256, noto anche come secp256r1 e prime256v1.
  • P-384, noto anche come secp384r1.
  • P-521, noto anche come secp521r.
CKM_EC_KEY_PAIR_GEN Curve del pool di cervelli regolari
  • BP-160R, noto anche come brainpoolP160r1.
  • BP-192R, noto anche come brainpoolP192r1.
  • BP-224R, noto anche come brainpoolP224r1.
  • BP-256R, noto anche come brainpoolP256r1.
  • BP-320R, noto anche come brainpoolP320r1.
  • BP-384R, noto anche come brainpoolP384r1.
  • BP-512R, noto anche come brainpoolP512r1.
CKM_EC_KEY_PAIR_GEN Curve BP(Twisted Brain pool)
  • BP-160T, noto anche come brainpoolP160t1.
  • BP-192T, noto anche come brainpoolP192t1.
  • BP-224T, noto anche come brainpoolP224t1.
  • BP-256T, noto anche come brainpoolP256t1.
  • BP-320T, noto anche come brainpoolP320t1.
  • BP-384T, noto anche come brainpoolP384t1.
  • BP-512T, noto anche come brainpoolP512t1.
CKM_EC_KEY_PAIR_GEN Standard per curve SEC(Efficient Cryptography)
  • secp256k1
CKM_EC_KEY_PAIR_GEN Curve Edwards
  • Ed25519

Curve supportate per la crittografia degli asset digitali e la creazione di firme

Le seguenti curve sono supportate per i meccanismi correlati all'asset digitale e alla firma digitale.

Tabella 5. Tipi di curva supportati per la codifica di firme e asset digitali
Standard e schema Meccanismo GREP11 Tipi di curva supportati Nomi curva supportati
BIP32/BIP44 CKM_IBM_BTC_DERIVE Standard per curve SEC(Efficient Cryptography)
  • secp256k1
SLIP10 CKM_IBM_BTC_DERIVE Curve NIST(National Institute of Standards and Technology)
  • P-256, noto anche come secp256r1 e prime256v1
SLIP10 CKM_IBM_BTC_DERIVE Standard per curve SEC(Efficient Cryptography)
  • secp256k1
SLIP10 CKM_IBM_BTC_DERIVE Curve Edwards
  • Ed25519
EdDSA CKM_IBM_ED25519_SHA512 Curve Edwards
  • Ed25519
Schnorr CKM_IBM_ECDSA_ALTRO Standard per curve SEC(Efficient Cryptography)
  • secp256k1
Schnorr CKM_IBM_ECDSA_ALTRO Curve NIST(National Institute of Standards and Technology)
  • P-256, noto anche come secp256r1 e prime256v1
Schnorr CKM_IBM_ECDSA_ALTRO Curve del pool di cervelli regolari
  • BP-256R, noto anche come brainpoolP256r1
Schnorr CKM_IBM_ECDSA_ALTRO Curve BP(Twisted Brain pool)
  • BP-256T, noto anche come brainpoolP256t1
Schnorr ECSG_IBM_ECSDSA_S256
  • secp256r1
  • secp256k1
  • BP-256R, noto anche come brainpoolP256r1
  • BP-256T, noto anche come brainpoolP256t1
Schnorr-Zilliqa ECSG_IBM_ECSDSA_COMPR_MULTI
  • secp256r1
  • secp256k1
  • BP-256R, noto anche come brainpoolP256r1
  • BP-256T, noto anche come brainpoolP256t1

Esecuzione di operazioni crittografiche con funzioni GREP11

È possibile eseguire operazioni di crittografia richiamando funzioni GREP11 che sono definite in base all'implementazione EP11 della specifica PKCS #11 . Le descrizioni delle seguenti funzioni vengono create in base alla specifica PKCS #11, con note specifiche per EP11. Tutte le definizioni di parametro sono nel formato originale di EP11. Per ulteriori informazioni su EP11, consultare Enterprise PKCS #11(EP11)Library structure.

I parametri di funzione EP11 sono associati ai tipi di buffer di protocollo che sono disponibili nelle seguenti funzioni. Puoi ottenere ulteriori informazioni sui tipi di buffer di protocollo in Google Developers.

Poiché la libreria EP11 è un sottoinsieme della libreria API PKCS #11, e le funzioni GREP11 sono varianti dalle corrispondenti funzioni EP11, le funzioni corrispondenti di EP11 e PKCS #11 sono elencate anche nelle tabelle delle funzioni GREP11 come riferimento per te.

GREP11 supporta qualsiasi linguaggio di programmazione con una libreria gRPC. Nella fase corrente, solo i frammenti di codice o gli esempi per Golang e JavaScript sono inclusi nella guida di riferimento API. Il contenuto è arricchito in fasi successive. I frammenti di codice si basano sui seguenti repository GitHub esterni che forniscono esempi completi per utilizzare l'API GREP11. Alcuni frammenti di codice fanno riferimento alle funzioni helper all'interno dei repository di esempio.

Richiamo degli algoritmi di crittografia supportati 

Puoi utilizzare le seguenti funzioni per richiamare i meccanismi o gli algoritmi crittografici supportati da GREP11. Con queste informazioni, è possibile comprendere i meccanismi specifici che possono essere impostati quando si richiama una funzione. Per l'elenco completo dei meccanismi supportati, è possibile visualizzare anche i meccanismi categorizzati per gruppi di funzioni.

GetMechanismList

La funzione GetMechanismList ottiene un elenco di tipi di meccanismi supportati da un token.

Descrizione Esegue il bind a m_GetMechanismList EP11, che è un'implementazione di C_GetMechanismList PKCS #11.
Parametri
    message GetMechanismListRequest {
    }
    message GetMechanismListResponse {
      repeated uint64 Mechs = 2;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione Implementazione di C_GetMechanismList PKCS #11.
Parametri
    CK_RV m_GetMechanismList (
      CK_SLOT_ID slot,
      CK_MECHANISM_TYPE_PTR mechs, CK_ULONG_PTR mechslen,
      destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_GetMechanismList. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_GetMechanismList viene utilizzato per ottenere un elenco di tipi di meccanismo supportati da un token, SlotID è l'ID dello slot del token; pulCount punta all'ubicazione che riceve il numero di meccanismi.

Sono disponibili due modi per un'applicazione per richiamare C_GetMechanismList:

  1. Se pMechanismList è NULL_PTR, tutto ciò che C_GetMechanismList restituisce (in *pulCount) il numero di meccanismi, senza restituire un elenco di meccanismi. Il contenuto di *pulCount restituito richiamando C_GetMechanismList non ha alcun significato in questo caso e la chiamata restituisce il valore CKR_OK.
  2. Se pMechanismList non è NULL_PTR, *pulCount deve contenere la dimensione (in termini di elementi CK_MECHANISM_TYPE ) del buffer puntato da pMechanismList. Se tale buffer è abbastanza grande da contenere l'elenco di meccanismi, in esso viene restituito l'elenco e viene restituito CKR_OK. In caso contrario, la chiamata a C_GetMechanismList restituisce il valore CKR_BUFFER_TOO_SMALL. In entrambi i casi, il valore *pulCount è impostato per contenere il numero di meccanismi.

Poiché C_GetMechanismList non assegna alcuno spazio, un'applicazione spesso richiama C_GetMechanismList due volte. Tuttavia, questa modalità di funzionamento non è affatto richiesta.

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_GetMechanismList)(
      CK_SLOT_ID slotID,
      CK_MECHANISM_TYPE_PTR pMechanismList,
      CK_ULONG_PTR pulCount
    );
    
Valori restituiti 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_RICONOSCIUTE, CKR_ARGUMENTS_BAD.

Frammenti di codice

  • Frammento di codice Golang

    GetMechanismListRequest := &pb.GetMechanismListRequest {
    }
    
    GetMechanismListResponse, err := cryptoClient.GetMechanismList(context.Background(), GetMechanismListRequest)
    
  • Frammento di codice JavaScript

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

GetMechanismInfo

La funzione GetMechanismInfo ottiene le informazioni su uno specifico meccanismo.

Descrizione Esegue il bind a m_GetMechanismInfo EP11, che è un'implementazione di C_GetMechanismInfo PKCS #11.
Parametri
    message GetMechanismInfoRequest {
      uint64 Mech = 2;
    }
    message GetMechanismInfoResponse {
      MechanismInfo MechInfo = 3;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione Implementazione di C_GetMechanismInfo PKCS #11.
Parametri
    CK_RV m_GetMechanismInfo (
      CK_SLOT_ID slot,
      CK_MECHANISM_TYPE mech,
      CK_MECHANISM_INFO_PTR mechInfo,
      destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_GetMechanismInfo. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_GetMechanismInfo ottiene informazioni su un particolare meccanismo che potrebbe essere supportato da un token. slotID è l'ID dello slot del token; type è il tipo di meccanismo; pInfo punta all'ubicazione che riceve le informazioni sul meccanismo.

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_GetMechanismInfo)(
      CK_SLOT_ID slotID,
      CK_MECHANISM_TYPE type,
      CK_MECHANISM_INFO_PTR pInfo
    );
    
Valori restituiti 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_FOUND, CKR_ARGUMENTS_BAD.

Frammenti di codice

  • Frammento di codice Golang

    GetMechanismInfoRequest := &pb.GetMechanismInfoRequest {
        Mech: ep11.CKM_RSA_PKCS,
    }
    
    GetMechanismInfoResponse, err := cryptoClient.GetMechanismInfo(context.Background(), GetMechanismInfoRequest)
    
  • Frammento di codice JavaScript

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

Generazione e derivazione di chiavi

GREP11 fornisce le seguenti funzioni per generare chiavi crittografiche simmetriche e asimmetriche. In base al meccanismo e alla lunghezza della chiave specificati, è possibile generare vari tipi di chiavi per vari utilizzi. È anche possibile derivare una chiave da una chiave di base per estendere le chiavi in chiavi più lunghe o per ottenere le chiavi di un formato richiesto.

GenerateKey

La funzione GenerateKey genera una chiave segreta per la crittografia simmetrica.

Descrizione Esegue il bind a m_GenerateKey EP11, che è un'implementazione di C_GenerateKey PKCS #11.
Parametri
    message GenerateKeyRequest {
      Mechanism Mech = 1;
      map<uint64,AttributeValue> Modello = 6;
    }
    message GenerateKeyResponse {
      byte KeyBytes = 4;
      bytes CheckSum = 5;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_GenerateKey PKCS #11.

Le chiavi TDES vengono generate con la parità appropriata, che non può essere osservata dall'host. Ma è necessario per una corretta interoperabilità: altre implementazioni PKCS #11 devono rifiutare le chiavi DES con problemi di parità.

Se un oggetto è collegato a una sessione, (pin, plen) deve essere restituito da Login a tale sessione. Lasciare pin NULL crea un oggetto pubblico, uno non collegato a una sessione di accesso.

(key, klen) restituisce il blob chiave. (csum, clen) contiene il checksum della chiave, ossia i byte più significativi di un blocco all - zero codificato dalla chiave. NULL clen è possibile, ad esempio, per i meccanismi di chiave simmetrica senza parametri CKA_CHECK_VALUE (come ad esempio RC4).

ptempl viene utilizzato solo se la lunghezza della chiave (ovvero, l'attributo CKA_VALUE_LEN ) è richiesta dal meccanismo. Se il meccanismo specifica in modo implicito la dimensione della chiave, non viene eseguita la verifica di ptempl per rilevare la dimensione,

La generazione di parametri DSA e DH ignora (csum, clen), generando solo strutture di parametri.

Parametri DSA, DH (CKM_DSA_PARAMETER_GEN): passa conteggio bit modulo in CKA_PRIME_BITS di attributi. Scrive la struttura P, Q, G come output cleartext (cioè, non un blob).

Il blob pin veniva generato in output da: Login.

phKey PKCS #11 non è associata ad alcun parametro EP11. (La libreria host deve associare la chiave impacchettata al bundle).

Parametri
    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,
      destinazione_t
      );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_GenerateKey. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_GenerateKey genera una chiave segreta o una serie di parametri di dominio, creando un nuovo oggetto. hSession è l'handle della sessione; pMechanism punta al meccanismo di generazione; pTemplate punta al modello per la nuova chiave o serie di parametri di dominio; ulCount è il numero di attributi nel modello; phKey punta all'ubicazione che riceve l'handle della nuova chiave o serie di parametri di dominio.

Se il meccanismo di creazione è per la creazione di parametri di dominio, l'attributo CKA_CLASS ha il valore CKO_DOMAIN_PARAMETERS; altrimenti, ha il valore CKO_SECRET_KEY.

Poiché il tipo di parametri di dominio o chiave da generare è implicito nel meccanismo di generazione, il template non ha bisogno di fornire un tipo di chiave. Se fornisce un tipo di chiave che non è congruente con il meccanismo di generazione, C_GenerateKey ha esito negativo e restituisce il codice di errore CKR_TEMPLATE_CONSISTENTI. L'attributo CKA_CLASS viene trattato allo stesso modo.

Se una chiamata a C_GenerateKey non è in grado di supportare il modello preciso fornito, ha esito negativo e viene restituita senza creare un oggetto.

L'oggetto creato da una chiamata eseguita correttamente a C_GenerateKey ha l'attributo CKA_LOCAL impostato su CK_TRUE.

Parametri
    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
      );
    
Valori restituiti 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_EXPIRED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_MECHANIS_INVALID, CKR_PAR_MECHANISION_INVALID CKR_TEMPLATE_INCONSISTENTE, CKR_TOKEN_WRITE_PROTECTED, CKR_USER_NOT_LOGGED_IN.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice 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 funzione GenerateKeyPair genera una coppia di chiavi pubblica e privata.

Descrizione Esegue il bind a m_GenerateKeyPair EP11, che è un'implementazione di C_GenerateKeyPair PKCS #11.
Parametri
    message GenerateKeyPairRequest {
      Mechanism Mech = 1;
      map<uint64,AttributeValue> PrivKeyTemplate = 7;
      map<uint64,AttributeValue> PubKeyTemplate = 8;
      }
    message GenerateKeyPairResponse {
      byte PrivKeyByte = 5;
      byte PubKeyByte = 6;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_GenerateKeyPair PKCS #11.

I parametri di coppia di chiavi vengono richiamati dai parametri pmech, ppublic e pprivate. Per le chiavi RSA, ppublic specifica la dimensione del modulo.

In modalità FIPS, sono supportati solo i moduli RSA di 1024 + 256 n bit (numero intero n). La modalità non FIPS può generare chiavi di qualsiasi numero pari di bit compresi tra i limiti nell'elenco dei parametri del meccanismo.

La chiave pubblica è formattata come SPKI standard (informazioni sulla chiave pubblica dell'oggetto), leggibile dalla maggior parte delle librerie. È protetta a livello di integrità da una chiave MAC specifica per la chiave di trasporto, che non fa parte della SPKI stessa. La generazione dei parametri DSA restituisce una struttura non SPKI nel campo della chiave pubblica.

Se si collega un oggetto a una sessione, (pin, plen) deve essere restituito da Login a tale sessione. Se si lascia pin NULL si crea un oggetto pubblico, uno che sopravvive alla sessione di accesso.

Restituisce la chiave privata impacchettata a (key, klen), public come una struttura ASN.1/DER con protezione mediante chiave MAC in (pubkey, pklen).

Le seguenti combinazioni di parametri supportate con note speciali vanno oltre quanto documentato da PKCS #11:

Le chiavi RSA rifiutano gli esponenti pubblici al di sotto di 17 (0x11). I punti di controllo possono limitare ulteriormente il minimo accettato. L'esponente Fermat4, 0x10001, è controllato da un punto di controllo specifico, corrispondente alle restrizioni dell'esponente pubblico di FIPS 186-3 (sezione B.3.1).

Chiavi EC (CKM_EC_KEY_PAIR_GEN): i parametri della curva possono essere specificati come OID o nomi simbolici (variante namedCurve ). I nomi simbolici supportati sono "P - nnn" per le curve NIST (nnn è un numero di bit primario supportato, 192 - 521), "BP -nnnR" per la normale curva BP. (I nomi devono essere forniti come stringhe ASCII, senza terminazione zero.)

Le chiavi DSA (CKM_DSA_KEY_PAIR_GEN): passano la struttura P,Q,G come attributo CKA_IBM_STRUCT_PARAMS degli attributi pubblici. I singoli parametri P, Q, G potrebbero non essere passati attraverso i normali parametri PKCS #11 , devono essere combinati in una singola struttura.

Le chiavi DH (CKM_DH_PKCS_KEY_PAIR_GEN): passano la struttura P,G come attributo CKA_IBM_STRUCT_PARAMS degli attributi pubblici. I singoli parametri P, G potrebbero non essere passati attraverso i normali parametri PKCS #11 , devono essere combinati in una singola struttura. Quando si seleziona un bitcount di chiave privata (X), utilizzare l'attributo XCP_U32_VALUE_BITS . Se non è presente, o se viene fornito uno 0 esplicito, il conteggio di bit viene selezionato in base al conteggio di bit P.

L'uso dello stato della sessione (Login) sostituisce l'uso standard delle sessioni. L'associazione è esterna all'ambito della libreria.

Il blob pin veniva generato in output da: Login.

hSession PKCS #11 non è associata ad alcun parametro EP11. (La chiamata non è direttamente associata ad alcuna sessione).

phPublicKey PKCS #11 non è associata ad alcun parametro EP11. (La libreria host deve associare la chiave pubblica (SPKI) all'handle).

phPrivateKey PKCS #11 non è associata ad alcun parametro EP11. (La libreria host deve associare la chiave privata all'handle).

Parametri
    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,
      destinazione_t
      );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_GenerateKeyPair. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_GenerateKeyPair genera una coppia di chiavi pubblica e privata, creando nuovi oggetti chiave. hSession è l'handle della sessione; pMechanism punta al meccanismo di generazione delle chiavi; pPublicKeyTemplate punta alla maschera per la chiave pubblica; ulPublicKeyAttributeCount è il numero di attributi nella maschera della chiave pubblica; pPrivateKeyTemplate punta al modello per la chiave privata; ulPrivateKeyAttributeCount è il numero di attributi nel modello di chiave privata; phPublicKey punta all'ubicazione che riceve l'handle della nuova chiave pubblica; phPrivateKey punta all'ubicazione che riceve l'handle della nuova chiave privata.

Poiché i tipi di chiave da generare sono impliciti nel meccanismo di generazione di coppie di chiavi, i template non hanno bisogno di fornire i tipi di chiave. Se uno dei modelli fornisce un tipo di chiave che non è congruente con il meccanismo di generazione chiavi, C_GenerateKeyPair ha esito negativo e restituisce il codice di errore CKR_TEMPLATE_CONSISTENTI. L'attributo CKA_CLASS viene trattato in modo simile.

Se una chiamata a C_GenerateKeyPair non può supportare i modelli precisi forniti, ha esito negativo e viene restituita senza creare alcun oggetto chiave.

Una chiamata a C_GenerateKeyPair non crea mai una sola chiave e restituisce. Una chiamata può avere esito negativo e non creare alcuna chiave; oppure può avere esito positivo e creare una coppia di chiavi pubblica e privata corrispondente.

Gli oggetti chiave creati da una chiamata riuscita a C_GenerateKeyPair hanno gli attributi CKA_LOCAL impostati su CK_TRUE.

Osserva attentamente l'ordine degli argomenti per C_GenerateKeyPair. Gli ultimi due argomenti non hanno lo stesso ordine che avevano nel documento Cryptoki versione 1.0 originale. L'ordine di questi due argomenti ha causato una spiacevole confusione.

Parametri
    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
      );
    
Valori restituiti CKRREAD_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, CKRR_FUNCTION_ANNULLA, CKR_FUNCTION_FAILED, CKRR_GENERAL_ERROR CKR_TEMPLATE_INCOMPLETE, CKR_TEMPLATE_INCOMPATIBILI, CKR_TOKEN_WRITE_PROTECTED, CKR_USER_NOT_LOGGED_IN.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice 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 funzione DeriveKey deriva una chiave da una chiave di base.

Descrizione Esegue il bind a m_DeriveKey EP11, che è un'implementazione di C_DeriveKey PKCS #11.
Parametri
    message DeriveKeyRequest {
        Mechanism Mech = 1;
        bytes BaseKey = 3;
        bytes Data = 4;
        map<uint64,AttributeValue> Modello = 8;
    }
    message DeriveKeyResponse {
        byte NewKeyByte = 6;
        bytes CheckSum = 7;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_DeriveKey PKCS #11.

Il blob basekey,bklen deve essere associato dal parametro hBaseKey PKCS #11

hSession PKCS #11 non è associata ad alcun parametro EP11. (La chiamata non è direttamente associata ad alcuna sessione).

phKey PKCS #11 non è associata ad alcun parametro EP11. (La libreria host deve associare la chiave restituita al bundle).

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_DeriveKey. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_DeriveKey deriva una chiave da una chiave di base, creando un nuovo oggetto chiave. hSession è l'handle della sessione; pMechanism punta a una struttura che specifica il chanismo di derivazione della chiave; hBaseKey è l'handle della chiave di base; pTemplate punta al modello per la nuova chiave; ulAttributeCount è il numero di attributi nel template; e phKey punta alla posizione che riceve l'handle della chiave derivata.

I valori degli attributi CKA_SENSITIVE, CKA_ALWAYS_SENSITIVE, CKA_EXTRACTABLEe KA_NEVER_EXTRACTABLE per la chiave di base influiscono sui valori che questi attributi possono contenere per la chiave appena derivata. Consultare la descrizione di ogni particolare meccanismo di derivazione chiave nella Sezione 5.16.2 della specifica API PKCS #11 per eventuali vincoli di questo tipo.

Se una chiamata a C_DeriveKey non è in grado di supportare il modello preciso fornito, ha esito negativo e viene restituita senza creare alcun oggetto chiave.

L'oggetto chiave creato da una chiamata riuscita a C_DeriveKey ha l'attributo CKA_LOCAL impostato su CK_FALSE.

Parametri
    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
    );
    
Valori restituiti 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_EXPIRED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR CKR_SESSION_HANDLE_INVALID, CKR_SESSION_READ_ONLY, CKR_TEMPLATE_INCOMPLETE, CKR_TEMPLATE, CKR_TOKEN_WRITE_PROTECTED, CKR_USER_NOT_LOGGED_IN.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice 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);
    });
    }
    

Protezione delle chiavi

Puoi proteggere una chiave impacchettandola e quindi decodificarla richiamando la funzione di spacchettamento.

WrapKey

La funzione WrapKey impacchetta (crittografa) una chiave.

Descrizione Esegue il bind a m_WrapKey EP11, che è un'implementazione di C_WrapKey PKCS #11.
Parametri
    message WrapKeyRequest {
        bytes Key = 1;
        bytes KeK = 2;
        bytes MacKey = 3;
        Mechanism Mech = 4;
    }
    message WrapKeyResponse {
        bytes Wrapped = 5;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione Implementazione di C_WrapKey PKCS #11.
Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_WrapKey. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_WrapKey esegue il wrapping (cifratura) di una chiave privata o segreta. hSession è l'handle della sessione; pMechanism punta al meccanismo di impacchettamento; hWrappingKey è l'handle della chiave di impacchettamento; hKey è l'handle della chiave da impacchettare; pWrappedKey punta all'ubicazione che riceve la chiave impacchettata; e pulWrappedKeyLen punta all'ubicazione che riceve la lunghezza della chiave impacchettata.

C_WrapKey utilizza la convenzione descritta nella sezione 5.2 della specifica API PKCS #11 sulla produzione di output.

L'attributo CKA_WRAP della chiave di impacchettamento, che indica se la chiave supporta l'impacchettamento, deve essere CK_TRUE. L'attributo CKA_EXTRACTABLE della chiave da impacchettare deve anche essere CK_TRUE.

Se la chiave da impacchettare non può essere impacchettata da per qualche motivo specifico del token, nonostante abbia il suo attributo CKA_EXTRACTABLE impostato su CK_TRUE, C_WrapKey non riesce con il codice di errore CKR_KEY_NOT_WRAPPABLE. Se non può essere impacchettata con la chiave e il meccanismo di impacchettamento specificati solo a causa della sua lunghezza, C_WrapKey non riesce con il codice di errore CKR_KEY_SIZE_RANGE.

C_WrapKey può essere utilizzata nelle seguenti situazioni:

  • Per impacchettare qualsiasi chiave segreta con una chiave pubblica che supporta la crittografia e la decrittografia.
  • Per impacchettare qualsiasi chiave segreta con qualsiasi altra chiave segreta. È necessario considerare la dimensione della chiave e l'intensità del meccanismo oppure il token potrebbe non consentire l'operazione.
  • Per impacchettare una chiave privata con qualsiasi chiave segreta.

I token variano in base a quali tipi di chiavi possono essere impacchettati con quali meccanismi.

Per partizionare le chiavi di impacchettamento in modo che possano impacchettare solo un sottoinsieme di chiavi estraibili, è possibile utilizzare l'attributo CKA_WRAP_TEMPLATE sulla chiave di impacchettamento per specificare una serie di attributi che è possibile confrontare con gli attributi della chiave da impacchettare. Se tutti gli attributi corrispondono in base alle regole C_FindObject di corrispondenza degli attributi, l'operazione di impacchettamento procede. Il valore di questo attributo è un template di attributi e la dimensione è il numero di elementi nel template moltiplicato per la dimensione di CK_ATTRIBUTE. Se questo attributo non viene fornito, qualsiasi modello è accettabile. Se un attributo non è presente, non viene selezionato. Se si verifica una mancata corrispondenza di attributi durante un tentativo di impacchettamento di una chiave, la funzione restituisce CKR_KEY_HANDLE_INVALID.

Parametri
    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
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_HANDLE_INVALID, CKR_KEY_NOT_WRAPPABLE, CKR_KEY_SIZE_RANGE, CKR_KEY_INVALID NON VALIDO, CKR_WRAPPING_KEY_SIZE_RANGE, CKR_WRAPPING_KEY_TYPE_CONSISTENTI.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice JavaScript

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

UnwrapKey

La funzione UnwrapKey spacchetta (decrittografa) una chiave.

Descrizione Esegue il bind a m_UnwrapKey EP11, che è un'implementazione di C_UnwrapKey PKCS #11.
Parametri
    message UnwrapKeyRequest {
        bytes Wrapped = 1;
        bytes KeK = 2;
        bytes MacKey = 3;
        Mechanism Mech = 5;
        map<uint64,AttributeValue> Modello = 9;
    }
    message UnwrapKeyResponse {
        byte UnwrappedBytes = 7;
        bytes CheckSum = 8;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_UnwrapKey PKCS #11.

uwmech specifica il meccanismo di codifica utilizzato per decodificare i dati impacchettati. ptempl è un elenco di parametri key (pair) che specifica come trasformare i dati non impacchettati in una nuova chiave (deve includere CKA_KEY_TYPE).

L'oggetto generato viene restituito in (unwrapped, uwlen) come un blob. Le chiavi simmetriche restituiscono il loro checksum di chiavi (3 byte) in (csum, cslen); gli oggetti di chiave pubblica restituiscono la loro chiave pubblica come una SPKI in (csum, cslen). Entrambe le forme sono seguite da un valore big-endian di 4 byte, che codifica il conteggio di bit della chiave spacchettata.

Quando un SPKI viene trasformato in un SPKI MACed, è necessario utilizzare CKM_IBM_TRANSPORTKEY come meccanismo di unwrapping. Questa modalità fornisce la SPKI non elaborata come dati impacchettati, e ignora la KEK.

UnwrapKey produce chiavi DES corrette per la parità (all'interno dei blob), ma tollera l'immissione con parità non corretta.

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_UnwrapKey. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_UnwrapKey esegue l'unwrapping (ossia, la decodifica) di una chiave impacchettata, creando una nuova chiave privata o un nuovo oggetto chiave segreta. hSession è l'handle della sessione; pMechanism punta al meccanismo di spacchettamento; hUnwrappingKey è l'handle della chiave di spacchettamento; pWrappedKey punta alla chiave impacchettata; ulWrappedKeyLen è la lunghezza della chiave impacchettata; pTemplate punta al modello per la nuova chiave; ulAttributeConteggio è il numero di attributi nel modello; phKey punta all'ubicazione che riceve l'handle della chiave recuperata.

L'attributo CKA_UNWRAP della chiave di spacchettamento, che indica che se la chiave supporta lo spacchettamento, deve essere CK_TRUE.

La nuova chiave ha l'attributo CKA_ALWAYS_SENSITIVE impostato su CK_FALSEe l'attributo CKA_NEVER_EXTRACTABLE impostato su CK_FALSE. L'attributo CKA_EXTRACTABLE è per impostazione predefinita impostato su CK_TRUE.

Alcuni meccanismi possono modificare o tentare di modificare. Il contenuto della struttura pMechanism nello stesso momento in cui la chiave viene annullata.

Se una chiamata a C_UnwrapKey non può supportare il modello preciso fornito, ha esito negativo e viene restituita senza creare alcun oggetto chiave.

L'oggetto chiave creato da una chiamata riuscita a C_UnwrapKey ha il suo attributo CKA_LOCAL impostato su CK_FALSE.

Per partizionare le chiavi di spacchettamento in modo che possano spacchettare solo un sottoinsieme di chiavi, è possibile utilizzare l'attributo CKA_UNWRAP_TEMPLATE sulla chiave di spacchettamento per specificare una serie di attributi che viene aggiunta agli attributi della chiave da spacchettare. Se gli attributi non sono in conflitto con il modello di attributo fornito dall'utente, in pTemplate, l'operazione di spacchettamento procede. Il valore di questo attributo è un template di attributi e la dimensione è il numero di elementi nel template moltiplicato per la dimensione di CK_ATTRIBUTE. Se questo attributo non è presente nella chiave di spacchettamento, non vengono aggiunti ulteriori attributi. Se si verifica un conflitto di attributi durante un tentativo di spacchettamento di una chiave, la funzione SHALL restituisce CKR_TEMPLATE_INCONGRUENTE.

Parametri
    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
    );
    
Valori restituiti 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_FAILED, CKR_FUNZION_CKR_INVALID, CKR_GENERAL_MEMORY CKR_TEMPLATE_INCOMPLETE, CKR_TEMPLATE_INCONGRUENTE, CKR_TOKEN_WRITE_PROTECTED, CKR_UNWRAPPING_KEY_HANDLE_INVALID, CKR_UNWRAPPING_KEY_SIZE_RANGE, CKR_UNWRAPPING_KEY_TYPE_CONSISTENTI, CKR_USER_NOT_LOGGED_IN, CKR_WRAPPED_KEY_INVALID, CKR_WRAPPED_KEY_LEN_RANGE.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice 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);
    });
    

Blob RewrapKey

La funzione RewrapKeyBlob ricodifica i BLOB (binary large object) della chiave generata con la nuova chiave principale di cui è stato eseguito il commit contenuta in HSM. Le chiavi ricodificate possono essere utilizzate solo dopo che l'HSM è stato finalizzato con la nuova chiave principale di cui è stato eseguito il commit.

Questa funzione è un comando di amministrazione speciale supportato solo da GREP11. Non esiste alcuna funzione EP11 o funzione PKCS #11 corrispondente per RewrapKeyBlob.

Descrizione Trasferisce la proprietà di un BLOB controllato dalla chiave principale corrente alla nuova chiave principale quando viene eseguito il commit della nuova chiave principale.
Parametri
    messaggio RewrapKeyBlobRequest {
    	byte WrappedKey = 1;
    }
    messaggio RewrapKeyBlobResponse {
    	byte RewrappedKey = 1;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice JavaScript

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

Richiamo e modifica degli attributi per le chiavi 

Quando si generano le chiavi o si eseguono le operazioni chiave, si definisce un modello di attributo come uno dei parametri. È possibile richiamare gli attributi per un oggetto chiave specifico e modificare alcuni attributi dopo la creazione della chiave.

GetAttributeValue

La funzione GetAttributeValue ottiene un valore di attributo di un oggetto.

Descrizione Esegue il bind a m_GetAttributeValue EP11, che è un'implementazione di C_GetAttributeValue PKCS #11.
Parametri
    message GetAttributeValueRequest {
        bytes Object = 1;
        map<uint64,AttributeValue> Attributi = 3;
    }
    message GetAttributeValueResponse {
        map<uint64,AttributeValue> Attributi = 4;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_GetAttributeValue PKCS #11.

Non rappresenta o ha bisogno di sessioni (parte di blob), quindi non utilizza il parametro hSession .

EP11 utilizza modi più semplici per eseguire la decodifica, come ad esempio l'enumerazione di valori effettivi, invece di essere più generica.

Parametri
    CK_RV m_GetAttributeValue (
        const unsigned char *object, size_t objectlen,
        CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_GetAttributeValue. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_GetAttributeValue ottiene il valore di uno o più attributi di un oggetto. hSession è l'handle della sessione; hObject è l'handle dell'oggetto; pTemplate punta a un modello che specifica quali valori attributo devono essere ottenuti e riceve i valori attributo; ulCount è il numero degli attributi nel modello.

Per ogni tripla (type, pValue, ulValueLen) nel template, C_GetAttributeValue esegue questo algoritmo:

  1. Se l'attributo specificato (ovvero, l'attributo specificato dal campo tipo) per l'oggetto non può essere rivelato perché l'oggetto è sensibile o non estraibile, il campo ulValueLen in tale tripla viene modificato per contenere il valore CK_UNAVAILABLE_INFORMATION.
  2. Altrimenti, se il valore specificato per l'oggetto non è valido (l'oggetto non possiede tale attributo), il campo ulValueLen in tale tripla viene modificato per contenere il valore CK_UNAVAILABLE_INFORMATION.
  3. Altrimenti, se il campo pValue ha il valore NULL_PTR, il campo ulValueLen viene modificato per contenere la lunghezza esatta dell'attributo specificato per l'oggetto.
  4. In caso contrario, se la lunghezza specificata in ulValueLen è abbastanza grande da contenere il valore dell'attributo specificato per l'oggetto, tale attributo viene copiato nel buffer che si trova in pValuee il campo ulValueLen viene modificato per contenere la lunghezza esatta dell'attributo.
  5. Altrimenti, il campo ulValueLen viene modificato per contenere il valore CK_UNAVAILABLE_INFORMATION.

Se il caso 1 si applica a uno qualsiasi degli attributi richiesti, la chiamata deve restituire il valore CKR_ATTRIBUTE_SENSITIVE. Se il caso 2 si applica ad uno qualsiasi degli attributi richiesti, la chiamata deve restituire il valore CKR_ATTRIBUTE_TYPE_INVALID. Se il caso 5 si applica a uno qualsiasi degli attributi richiesti, la chiamata deve restituire il valore CKR_BUFFER_TOO_SMALL. Come al solito, se è applicabile più di uno di questi codici di errore, Cryptoki può restituire uno qualsiasi di essi. Solo se nessuno di essi si applica a uno degli attributi richiesti, viene restituito CKR_OK .

Nel caso speciale di un attributo il cui valore è un array di attributi, ad esempio CKA_WRAP_TEMPLATE, dove viene passato con pValue not NULL, se pValue degli elementi all'interno dell'array è NULL_PTR, ulValueLen degli elementi all'interno dell'array è impostato sulla lunghezza richiesta. Se il pValue degli elementi all'interno dell'array non è NULL_PTR, l'elemento ulValueLen degli attributi all'interno dell'array deve riflettere lo spazio a cui punta il corrispondente pValue e il pValue viene inserito se c'è spazio a sufficienza. Pertanto, è importante inizializzare il contenuto di un buffer prima che C_GetAttributeValue venga richiamato per ottenere tale valore di array. Se un ulValueLen all'interno dell'array non è sufficientemente grande, viene impostato su CK_UNAVAILABLE_INFORMATION e la funzione restituisce CKR_BUFFER_TOO_SMALL, come se un attributo nell'argomento pTemplate avesse ulValueLen troppo piccolo. Qualsiasi attributo il cui valore è un array di attributi è identificabile dalla serie CKF_ARRAY_ATTRIBUTE del tipo di attributo.

I codici di errore CKR_ATTRIBUTE_SENSITIVE, CKR_ATTRIBUTE_TYPE_INVALIDe CKR_BUFFER_TOO_SMALL non indicano errori veri per C_GetAttributeValue. Se una chiamata a C_GetAttributeValue restituisce uno di questi tre valori, la chiamata deve comunque aver elaborato ogni attributo nel template fornito a C_GetAttributeValue. Ogni attributo nel modello il cui valore può essere restituito dalla chiamata a C_GetAttributeValue viene restituito dalla chiamata a C_GetAttributeValue.

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_GetAttributeValue)(
        CK_SESSION_HANDLE hSession,
        CK_OBJECT_HANDLE hObject,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulCount
    );
    
Valori restituiti 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.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice 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 funzione SetAttributeValue modifica un valore di attributo di un oggetto.

Descrizione Esegue il bind a m_SetAttributeValue EP11, che è un'implementazione di C_SetAttributeValue PKCS #11.
Parametri
    message SetAttributeValueRequest {
        bytes Object = 1;
        map<uint64,AttributeValue> Attributi = 3;
    }
    message SetAttributeValueResponse {
        bytes Object = 1;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_SetAttributeValue PKCS #11.

impacchettamento di attributo: vedi _GetAttrValue

Attualmente, EP11 invia solo attributi booleani; tutti gli altri attributi sono gestiti dall'host (e EP11 non modifica gli array, come ad esempio WRAP_TEMPLATE).

Non rappresenta o necessita di sessioni (parte di blob), quindi non utilizza il parametro PKCS #11 hSession .

Parametri
    CK_RV m_SetAttributeValue (
        unsigned char *object, size_t objectlen,
        CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_SetAttributeValue. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_SetAttributeValue modifica il valore di uno o più attributi di un oggetto. hSession è l'handle della sessione; hObject è l'handle dell'oggetto; pTemplate punta a un template che specifica quali valori di attributi devono essere modificati e i nuovi valori; ulCount è il numero di attributi nel modello.

Alcuni oggetti potrebbero non essere modificati. Il richiamo di C_SetAttributeValue su tali oggetti risulta nel codice di errore CKR_ACTION_PROIBITA . Un'applicazione può consultare l'attributo CKA_MODIFIABLE dell'oggetto per determinare se un oggetto può essere modificato.

Solo gli oggetti di sessione possono essere modificati durante una sessione di sola lettura.

Il modello può specificare nuovi valori per qualsiasi attributo dell'oggetto che può essere modificato. Se il modello specifica un valore di un attributo che non è compatibile con altri attributi esistenti dell'oggetto, la chiamata ha esito negativo con il codice di ritorno CKR_TEMPLATE_CONSISTENTI.

Non è possibile modificare tutti gli attributi; per ulteriori informazioni, consultare la sezione 4.1.2 della specifica API PKCS #11 .

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_SetAttributeValue)(
        CK_SESSION_HANDLE hSession,
        CK_OBJECT_HANDLE hObject,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulCount
    );
    
Valori restituiti CKR_ACTION_PROIBITA, 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_READR_INVALID, CKR_CLOSED

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice 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);
    });
    

Generazione di dati casuali

È possibile generare dati casuali di alta qualità, come valori di inizializzazione (IVs), PIN e password, da utilizzare nelle operazioni di codifica.

GenerateRandom

La funzione GenerateRandom genera dati casuali. Quando si utilizza questa funzione, assicurarsi di non impostare la lunghezza dei dati casuali su zero e il puntatore che punta all'ubicazione dei dati casuali su NULL.

Descrizione Esegue il bind a m_GenerateRandom EP11, che è un'implementazione di C_GenerateRandom PKCS #11.
Parametri
    message GenerateRandomRequest {
        uint64 Len = 1;
    }
    message GenerateRandomResponse {
        bytes Rnd = 1;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_GenerateRandom PKCS #11.

GenerateRandom è equivalente alla funzione PKCS #11 originale. Internamente, l'entropia con seeding hardware viene passata tramite una DRNG (ANSI X9.31/ISO 18031 conforme a FIPS, a seconda della versione Clic).

La libreria host può generare dei numeri casuali senza distribuzione al backend, in caso di disponibilità sull'host di funzionalità adatta. Nell'attuale implementazione, tale operazione non viene eseguita.

Questa funzione non supporta una query di dimensione.

Parametri
    CK_RV m_GenerateRandom (
        CK_BYTE_PTR rnd, CK_ULONG rndlen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_GenerateRandom. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione C_GenerateRandom genera dati casuali o pseudo - casuali. hSession è l'handle delle sessioni; pRandomData punta all'ubicazione che riceve i dati casuali e ulRandomLen è la lunghezza in byte dei dati casuali o pseudo - casuali da generare.
Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_GenerateRandom)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pRandomData,
        CK_ULONG ulRandomLen
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_ANNULLATO, 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.

Frammenti di codice

  • Frammento di codice Golang

    GenerateRandomRequest := &pb.GenerateRandomRequest {
      Len: 1024,
    }
    
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(), GenerateRandomRequest)
    
  • Frammento di codice JavaScript

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

Crittografia e decrittografia dei dati

Specificando il meccanismo crittografico, è possibile eseguire funzioni di codifica e decodifica simmetriche o asimmetriche. Potrebbe essere necessario richiamare una serie di funzioni secondarie per codificare o decodificare i dati. Ad esempio, l'operazione di codifica dati in più parti è composta dalle operazioni secondarie EncryptInit, EncryptUpdate e EncryptFinal.

EncryptInit

La funzione EncryptInit inizializza un'operazione di crittografia. È necessario richiamare prima questa funzione per eseguire una codifica.

Descrizione Esegue il bind a m_EncryptInit EP11, che è un'implementazione di C_EncryptInit PKCS #11.
Parametri
    message EncryptInitRequest {
        Mechanism Mech = 2;
        bytes Key = 3;
    }
    message EncryptInitResponse {
        bytes State = 1;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_EncryptInit PKCS #11.

Il blob (key, klen) può essere un oggetto chiave pubblica o un blob chiave segreta. Il tipo di chiave deve essere congruente con pmech.

Per i meccanismi a chiave pubblica, (key, klen) deve contenere una SPKI. L'integrità di questa SPKI è protetta con una chiave MAC, come restituita da GenerateKeyPair o in alternativa UnwrapKey. Lo stato Ecrypt viene creato senza restrizioni della sessione.

Per i meccanismi della chiave segreta, lo stato Codifica eredita le limitazioni della sessione oggetto da (key, klen).

Il blob state,slen deve essere associato dal parametro hSession PKCS #11.

(key, klen) deve essere un blob chiave.

Parametri
    CK_RV m_EncryptInit (
        unsigned char * state, size_t * statelen,
        CK_MECHANISM_PTR mech,
        const unsigned char *key, size_t keylen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_EncryptInit. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento della struttura della libreria Enterprise PKCS #11 (EP11).
Descrizione

C_EncryptInit inizializza un'operazione di codifica. hSession è l'handle della sessione; pMechanism punta al meccanismo di codifica; hKey è l'handle della chiave di crittografia.

L'attributo CKA_ENCRYPT della chiave di crittografia, che indica se la chiave supporta la crittografia, deve essere CK_TRUE.

Dopo che l'applicazione ha richiamato C_EncryptInit, l'applicazione può richiamare C_Encrypt per crittografare i dati in una singola parte; oppure richiamare C_EncryptUpdate zero o più volte, seguito da C_EncryptFinal, per crittografare i dati in più parti. L'operazione di crittografia è attiva fino a quando l'applicazione non utilizza una chiamata a C_Encrypt o C_EncryptFinal per ottenere la parte finale del testo cifrato. Per elaborare ulteriori dati (in una o più parti), l'applicazione deve richiamare nuovamente C_EncryptInit .

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_EncryptInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
Valori restituiti CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_CONSENTE, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONGRUENTE, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARACTIVE

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice JavaScript

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

Encrypt

La funzione Encrypt crittografa dati di una singola parte. Non è necessario eseguire le operazioni secondarie di EncryptUpdate e EncryptFinal per una codifica a parte singola. Prima di richiamare questa funzione, assicurarsi di eseguire prima EncryptInit.

Descrizione Esegue il bind a m_Encrypt EP11, che è un'implementazione di C_Encrypt PKCS #11.
Parametri
    message EncryptRequest {
        bytes State = 1;
        bytes Plain = 2;
    }
    message EncryptResponse {
        bytes Ciphered = 3;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_Encrypt PKCS #11.

Non aggiorna (state, slen).

Il blob state,slen deve essere associato dal parametro hSession PKCS #11.

Il blob state veniva generato in output da: EncryptInit.

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_Encrypt. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_Encrypt codifica i dati di una singola parte. hSession è l'handle della sessione; pData punta ai dati; ulDataLen è la lunghezza in byte dei dati; pEncryptedData punta all'ubicazione che riceve i dati codificati; pulEncryptedDataLen punta all'ubicazione che contiene la lunghezza in byte dei dati codificati.

C_Encrypt utilizza la convenzione descritta nella Sezione 5.2 della specifica API PKCS #11 sulla produzione di output.

L'operazione di codifica deve essere inizializzata con C_EncryptInit. Una chiamata a C_Encrypt termina sempre l'operazione di codifica attiva a meno che non restituisca CKR_BUFFER_TOO_SMALL o sia una chiamata riuscita (ovvero, una chiamata che restituisce CKR_OK) per determinare la lunghezza del buffer necessario per contenere il testo cifrato.

C_Encrypt non può essere utilizzata per terminare un'operazione in più parti e deve essere richiamata dopo C_EncryptInit senza chiamate C_EncryptUpdate intermedie.

Per alcuni meccanismi di crittografia, i dati di input in testo semplice hanno determinati vincoli di lunghezza (perché il meccanismo può crittografare solo parti relativamente brevi di testo semplice, o perché i dati di input del meccanismo devono essere costituiti da un numero integrale di blocchi). Se questi vincoli non vengono soddisfatti, C_Encrypt ha esito negativo con codice di ritorno CKR_DATA_LEN_RANGE.

Il testo semplice e il testo cifrato possono trovarsi nella stessa posizione, vale a dire, se pData e pEncryptedData puntano alla stessa ubicazione.

Per la maggior parte dei meccanismi, C_Encrypt è equivalente a una sequenza di operazioni C_EncryptUpdate seguita da C_EncryptFinal.

Parametri
    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
    );
    
Valori restituiti 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_ANNULLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_LE_NOT_INITIALIZED, CKR_SESSION_INVALID, ckr_session_closed

Frammenti di codice

  • Frammento di codice Golang

    plainText := "Encrypt this message"
    
    EncryptRequest := &pb.EncryptRequest {
        State: EncryptInitResponse.State,
        Plain: plainText,
    }
    
    EncryptResponse, err := cryptoClient.Encrypt(context.Background(), EncryptRequest)
    
  • Frammento di codice JavaScript

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

EncryptUpdate

La funzione EncryptUpdate continua un'operazione di crittografia di più parti. Prima di richiamare questa funzione, assicurarsi di eseguire prima EncryptInit.

Descrizione Esegue il bind a m_EncryptUpdate EP11, che è un'implementazione di C_EncryptUpdate PKCS #11.
Parametri
    message EncryptUpdateRequest {
        bytes State = 1;
        bytes Plain = 2;
    }
    message EncryptUpdateResponse {
        bytes State = 1;
        bytes Ciphered = 3;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_EncryptUpdate PKCS #11.

Il blob state, slen deve essere associato dal parametro PKCS #11 hSession .

Il blob state veniva generato in output da: EncryptInit.

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_EncryptUpdate. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_EncryptUpdate continua un'operazione di codifica a più parti, elaborando un'altra parte di dati. hSession è la gestione della sessione; pPart punta alla parte dati; ulPartLen è la lunghezza della parte dati; pEncryptedPart punta alla posizione che riceve la parte dati codificati; pulEncryptedPartLen punta alla posizione che contiene la lunghezza in byte della parte dati codificati.

C_EncryptUpdate utilizza la convenzione descritta nella sezione 5.2 della specifica API PKCS #11 sulla produzione dell'output.

L'operazione di codifica deve essere inizializzata con C_EncryptInit. Questa funzione può essere chiamata un numero qualsiasi di volte in successione. Una chiamata a C_EncryptUpdate che produce un errore diverso da CKR_BUFFER_TOO_SMALL termina l'attuale operazione di crittografia.

Il testo semplice e il testo cifrato possono trovarsi nella stessa posizione, vale a dire, se pPart e pEncryptedPart puntano alla stessa posizione.

Parametri
    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
    );
    
Valori restituiti 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_ANNULLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Frammenti di codice

  • Frammento di codice 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...)
    
  • Frammento di codice JavaScript

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

EncryptFinal

La funzione EncryptFinal termina un'operazione di crittografia di più parti.

Descrizione Esegue il bind a m_EncryptFinal EP11, che è un'implementazione di C_EncryptFinal PKCS #11.
Parametri
    message EncryptFinalRequest {
        bytes State = 1;
    }
    message EncryptFinalResponse {
        bytes Ciphered = 2;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_EncryptFinal PKCS #11.

Non aggiorna (state, slen).

Il blob state,slen deve essere associato dal parametro hSession PKCS #11.

Il blob state veniva generato in output da: EncryptInit, EncryptUpdate.

Parametri
    CK_RV m_EncryptFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_EncryptFinal. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_EncryptFinal termina un'operazione di codifica a più parti. hSession è l'handle della sessione; pLastEncryptedPart punta alla posizione che riceve l'ultima parte di dati codificata, se presente; pulLastEncryptedPartLen punta alla posizione che contiene la lunghezza dell'ultima parte di dati codificati.

C_EncryptFinal utilizza la convenzione descritta nella sezione 5.2 della specifica API PKCS #11 sulla produzione di output.

L'operazione di codifica deve essere inizializzata con C_EncryptInit. Una chiamata a C_EncryptFinal termina sempre l'operazione di codifica attiva a meno che non restituisca CKR_BUFFER_TOO_SMALL o sia una chiamata riuscita (ovvero, una che restituisce CKR_OK) per determinare la lunghezza del buffer necessaria per contenere il testo cifrato.

Per alcuni meccanismi di crittografia multi - parte, i dati di testo semplice di input hanno alcuni vincoli di lunghezza perché i dati di immissione del meccanismo devono essere costituiti da un numero integrale di blocchi. Se questi vincoli non vengono soddisfatti, C_EncryptFinal ha esito negativo con codice di ritorno CKR_DATA_LEN_RANGE.

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_EncryptFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pLastEncryptedPart,
        CK_ULONG_PTR pulLastEncryptedPartLen
    );
    
Valori restituiti 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_ANNULLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Frammenti di codice

  • Frammento di codice Golang

    EncryptFinalRequest := &pb.EncryptFinalRequest {
        State: EncryptUpdateResponse.State,
    }
    
    EncryptFinalResponse, err := cryptoClient.EncryptFinal(context.Background(), EncryptFinalRequest)
    
  • Frammento di codice JavaScript

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

EncryptSingle

La funzione EncryptSingle elabora i dati in un unico passaggio con una chiamata. Non restituisce alcuno stato all'host e restituisce solo i dati codificati. Questa funzione è un'estensione IBM EP11 alla specifica PKCS #11 standard ed è una combinazione delle funzioni EncryptInit e Encrypt. Consente di completare un'operazione di crittografia con una singola chiamata invece di una serie di chiamate.

Descrizione Esegue il bind a m_EncryptSingle EP11
Parametri
    message EncryptSingleRequest {
        bytes Key = 1;
        Mechanism Mech = 2;
        bytes Plain = 3;
    }
    message EncryptSingleResponse {
        bytes Ciphered = 4;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Variante non standard di Encrypt. Elabora i dati in un singolo passaggio, con una singola chiamata. Non restituisce alcuno stato all'host, solo i dati crittografati.

Questo è il metodo preferito per crittografare i dati in un singolo passaggio per le applicazioni in grado di riconoscere XCP. Funzionalmente è equivalente a EncryptInit seguito immediatamente da Encrypt, ma salva roundtrip, wrapping e unwrapping.

Se il backend supporta le chiavi residenti, la chiave può essere anche un handle di chiave residente.

Vedi anche: Encrypt, EncryptInit, DecryptSingle.

Il blob key veniva generato in output da: GenerateKey, UnwrapKey.

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_Encrypt. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice 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 funzione ReencryptSingle, puoi decrittografare i dati con la chiave originale e quindi crittografare i dati non elaborati con una chiave differente in una singola chiamata all'interno dell'HSM cloud. I tipi di chiave utilizzati per questa operazione possono essere uguali o differenti. Questa funzione è un'estensione IBM EP11 alla specifica PKCS #11 standard. Questa singola chiamata è un'opzione valida in cui una grande quantità di dati deve essere codificata nuovamente con chiavi differenti e ignora la necessità di eseguire una combinazione di funzioni DecryptSingle e EncryptSingle per ciascun elemento di dati che deve essere codificato nuovamente. Non restituisce alcuno stato all'host e restituisce solo i dati crittografati.

Descrizione Esegue il bind a EP11 m_ReencryptSingle.
Parametri
    Richiesta ReencryptSinglemessaggio {
        byte DecKey = 1;
        byte EncKey = 2;
        Meccanismo DecMech = 3;
        Meccanismo EncMech = 4;
        byte cifrati = 5;
    }
    messaggio ReencryptSingleRisposta {
        byte cifrati = 6;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Variante non standard di Encrypt. Elabora i dati in un singolo passaggio, con una singola chiamata. Non restituisce alcun stato all'host, solo i dati ricodificati.

Decodifica i dati con la chiave originale e quindi crittografa i dati non elaborati con una chiave diversa all'interno del cloud HSM.

Parametri
    CK_RV m_ReencryptSingle (
        const unsigned char * dkey, size_t dkeylen,
        const unsigned char * ekey, size_t ekeylen,
        CK_MECHANISM_PTR decmech,
        Mech CK_MECHANISM_PTR,
        CK_BYTE_PTR in, CK_ULONG inlen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme di valori restituiti C_Encrypt e C_Decrypt . Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice 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 funzione DecryptInit inizializza un'operazione di decrittografia. È necessario richiamare prima questa funzione per eseguire una decrittografia.

Descrizione Esegue il bind a m_DecryptInit EP11, che è un'implementazione di C_DecryptInit PKCS #11.
Parametri
    message DecryptInitRequest {
        Mechanism Mech = 2;
        bytes Key = 3;
    }
    message DecryptInitResponse {
        bytes State = 1;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione Implementazione di C_DecryptInit PKCS #11.
Parametri
    CK_RV m_DecryptInit (
        unsigned char * state, size_t * statelen,
        CK_MECHANISM_PTR mech,
        const unsigned char *key, size_t keylen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_DecryptInit. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_DecryptInit inizializza un'operazione di decodifica. hSession è l'handle della sessione; pMechanism punta al meccanismo di decodifica; hKey è l'handle della chiave di decodifica.

L'attributo CKA_DECRYPT della chiave di decrittografia, che indica se la chiave supporta la decrittografia, deve essere CK_TRUE.

Dopo che l'applicazione ha richiamato C_DecryptInit, l'applicazione può richiamare C_Decrypt per decodificare i dati in una singola parte oppure richiamare C_DecryptUpdate zero o più volte, seguito da C_DecryptFinal, per decodificare i dati in più parti. L'operazione di decodifica è attiva fino a quando l'applicazione non utilizza una chiamata a C_Decrypt o C_DecryptFinal per ottenere la parte finale del testo in chiaro. Per elaborare ulteriori dati (in una o più parti), l'applicazione deve richiamare nuovamente C_DecryptInit .

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_DecryptInit)(
        K_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_CONSENTE, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENTE, CKR_MECHANISM_INVALID, _SESS_INVALID,

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice JavaScript

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

Decrypt

La funzione Decrypt decodifica i dati in una singola parte. Non è necessario eseguire le operazioni secondarie DecryptUpdate e DecryptFinal per una decodifica a parte singola. Prima di richiamare questa funzione, assicurarsi di eseguire prima DecryptInit.

Descrizione Esegue il bind a m_Decrypt EP11, che è un'implementazione di C_Decrypt PKCS #11.
Parametri
    message DecryptRequest {
        bytes State = 1;
        bytes Ciphered = 2;
    }
    message DecryptResponse {
       bytes Plain = 3;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di PKCS #11 C_Decrypt. Non aggiorna (state, slen).

IL BLOB (binary large object) state, slen deve essere associato dal parametro hSession PKCS #11. Il BLOB state veniva generato in output da DecryptInit.

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_Decrypt. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_Decrypt decrittografa i dati crittografati in una singola parte.

  • hSession è l'handle di sessione.
  • pEncryptedData punta ai dati crittografati.
  • ulEncryptedDataLen è la lunghezza dei dati crittografati.
  • pData punta all'ubicazione che riceve i dati ripristinati.
  • pulDataLen punta all'ubicazione che conserva la lunghezza dei dati ripristinati.

C_Decrypt utilizza la convenzione descritta nella sezione 5.2 della specifica API PKCS #11 sulla produzione di output.

L'operazione di decodifica deve essere inizializzata con C_DecryptInit. Una chiamata a C_Decrypt termina sempre l'operazione di decodifica attiva a meno che non restituisca CKR_BUFFER_TOO_SMALL o non sia una chiamata riuscita con CKR_OK restituito per determinare la lunghezza del buffer necessario per contenere il testo semplice.

C_Decrypt non può essere utilizzato per terminare un'operazione a più parti e deve essere richiamato dopo C_DecryptInit senza intervenire sulle chiamate C_DecryptUpdate .

Il testo cifrato e il testo semplice possono essere nella stessa posizione, il che significa che è accettabile se i dati pEncryptede pData puntano alla stessa ubicazione.

Se i dati del testo cifrato di input non possono essere decrittografati perché hanno una lunghezza inappropriata, possono essere restituiti CKR_ENCRYPTED_DATA_INVALID o CKR_ENCRYPTED_DATA_LEN_RANGE.

Parametri
    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
    );
    
Valori restituiti 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_ANNULLA, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_SESSION_NOT_INITIALIZED, ckr_closed

Frammenti di codice

  • Frammento di codice Golang

    DecryptRequest := &pb.DecryptRequest{
        State:    DecryptInitResponse.State,
        Ciphered: ciphertext, // encrypted data from a previous encrypt operation
    }
    
    DecryptResponse, err := cryptoClient.Decrypt(context.Background(), DecryptRequest)
    
  • Frammento di codice JavaScript

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

DecryptUpdate

La funzione DecryptUpdate continua un'operazione di decrittografia di più parti. Prima di richiamare questa funzione, assicurarsi di eseguire prima DecryptInit.

Descrizione Esegue il bind a m_DecryptUpdate EP11, che è un'implementazione di C_DecryptUpdate PKCS #11.
Parametri
    message DecryptUpdateRequest {
        bytes State = 1;
        bytes Ciphered = 2;
    }
    message DecryptUpdateResponse {
        bytes State = 1;
        bytes Plain = 3;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_DecryptUpdate PKCS #11.

Il blob state,slen deve essere associato dal parametro hSession PKCS #11.

Il blob state veniva generato in output da: DecryptInit.

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_DecryptUpdate. Per ulteriori informazioni, consultare il capitolo Valori di ritornodel documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_DecryptUpdate continua un'operazione di decodifica di più parti, elaborando un'altra parte di dati codificati. hSession è l'handle della sessione; pEncryptedPart punta alla parte di dati codificati; ulEncryptedPartLen è la lunghezza della parte di dati codificati; pPart punta alla posizione che riceve la parte di dati ripristinata; pulPartLen punta alla posizione che contiene la lunghezza della parte di dati ripristinati.

C_DecryptUpdate utilizza la convenzione descritta nella sezione 5.2 della specifica API PKCS #11 sulla produzione dell'output.

L'operazione di decodifica deve essere inizializzata con C_DecryptInit. Questa funzione può essere chiamata un numero qualsiasi di volte in successione. Una chiamata a C_DecryptUpdate che produce un errore diverso da CKR_BUFFER_TOO_SMALL termina l'attuale operazione di decrittografia.

Il testo cifrato e il testo semplice possono trovarsi nella stessa posizione, vale a dire, è corretto se pEncryptedPart e pPart puntano alla stessa posizione.

Parametri
    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
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_CONSENTE, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENTE, CKR_MECHANISM_INVALID, _SESS_INVALID,

Frammenti di codice

  • Frammento di codice 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...)
    
  • Frammento di codice JavaScript

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

DecryptFinal

La funzione DecryptFinal termina un'operazione di decrittografia di più parti.

Descrizione Esegue il bind a m_DecryptFinal EP11, che è un'implementazione di C_DecryptFinal PKCS #11.
Parametri
    message DecryptFinalRequest {
        bytes State = 1;
    }
    message DecryptFinalResponse {
        bytes Plain = 2;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_DecryptFinal PKCS #11.

Non aggiorna (state, slen).

Il blob state,slen deve essere associato dal parametro hSession PKCS #11.

Il blob state veniva generato in output da: DecryptInit, DecryptUpdate.

Parametri
    CK_RV m_DecryptFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_DecryptFinal. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_DecryptFinal termina un'operazione di decodifica di più parti. hSession è l'handle della sessione; pLastPart punta all'ubicazione che riceve l'ultima parte di dati ripristinata, se presente; pulLastPartLen punta all'ubicazione che contiene la lunghezza dell'ultima parte di dati ripristinata.

C_DecryptFinal utilizza la convenzione descritta nella sezione 5.2 della specifica API PKCS #11 sulla produzione dell'output.

L'operazione di decodifica deve essere inizializzata con C_DecryptInit. Una chiamata a C_DecryptFinal termina sempre l'operazione di decodifica attiva a meno che non restituisca CKR_BUFFER_TOO_SMALL o sia una chiamata riuscita (ovvero, una chiamata che restituisce CKR_OK) per determinare la lunghezza del buffer necessaria per contenere il testo semplice.

Se i dati del testo cifrato di input non possono essere decodificati perché hanno una lunghezza inappropriata, è possibile restituire CKR_ENCRYPTED_DATA_INVALID o CKR_ENCRYPTED_DATA_LEN_RANGE .

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_DecryptFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pLastPart,
        CK_ULONG_PTR pulLastPartLen
    );
    
Valori restituiti 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_ANNULLA, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_SESSION_NOT_INITIALIZED, ckr_closed

Frammenti di codice

  • Frammento di codice Golang

    DecryptFinalRequest := &pb.DecryptFinalRequest {
      State: DecrypUpdateResponse.State,
    }
    
    DecryptFinalResponse, err := cryptoClient.DecryptFinal(context.Background(), DecryptFinalRequest)
    
  • Frammento di codice JavaScript

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

DecryptSingle

La funzione DecryptSingle elabora i dati in un unico passaggio con una chiamata. Non restituisce alcuno stato all'host e restituisce solo i dati decodificati. Questa funzione è un'estensione IBM EP11 alla specifica PKCS #11 standard ed è una combinazione delle funzioni DecryptInit e Decrypt. Consente di completare un'operazione di decrittografia con una singola chiamata invece di una serie di chiamate.

Descrizione Si collega a EP11 m_DecryptSingle.
Parametri
    message DecryptSingleRequest {
        bytes Key = 1;
        Mechanism Mech = 2;
        bytes Ciphered = 3;
    }
    message DecryptSingleResponse {
        bytes Plain = 4;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Variante non standard di Decrypt. Elabora i dati in un singolo passaggio, con una singola chiamata. Non restituisce alcuno stato all'host, solo i dati decrittografati.

Questo è il metodo preferito per crittografare i dati in un singolo passaggio per le applicazioni in grado di riconoscere XCP. Funzionalmente è equivalente a DecryptInit seguito immediatamente da Decrypt, ma salva i viaggi di andata e ritorno a capo, e lo spacchettamento.

Se il backend supporta le chiavi residenti, la chiave può essere anche un handle di chiave residente.

Vedi anche: Decrypt, DecryptInit, EncryptSingle.

Il blob key veniva generato in output da: GenerateKey, UnwrapKey.

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_Decrypt. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice JavaScript

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

Firma e verifica dei dati

GREP11 fornisce una serie di funzioni per firmare i dati e verificare le firme o i codici di autenticazione dei messaggi (MAC). Potrebbe essere necessario richiamare una serie di funzioni secondarie per eseguire un'operazione di firma. Ad esempio, l'operazione di firma dei dati in più parti consiste nelle operazioni secondarie SignInit, SignUpdate e SignFinal.

SignInit

La funzione SignInit inizializza un'operazione di firma. È necessario richiamare prima questa funzione per eseguire un'operazione di firma.

Descrizione Si collega a EP11 m_SignInit , che è un'implementazione di PKCS #11 C_SignInit.
Parametri
    message SignInitRequest {
        Mechanism Mech = 2;
        bytes PrivKey = 3;
    }
    message SignInitResponse {
        bytes State = 1;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione Implementazione di C_SignInit PKCS #11.
Parametri
    CK_RV m_SignInit (
        unsigned char * state, size_t * statelen,
        CK_MECHANISM_PTR mech,
        const unsigned char *privKey, size_t privKeylen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_Decrypt. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_SignInit inizializza un'operazione di firma, dove la firma è un'appendice ai dati. hSession è l'handle della sessione; pMechanism punta al meccanismo di firma; hKey è l'handle della chiave di firma.

L'attributo CKA_SIGN della chiave di firma, che indica se la chiave supporta le firme con l'appendice, deve essere CK_TRUE.

Dopo che l'applicazione ha richiamato C_SignInit, può richiamare C_Sign per accedere a una singola parte oppure C_SignUpdate una o più volte, seguito da C_SignFinal, per firmare i dati in più parti. L'operazione di firma è attiva fino a quando l'applicazione non utilizza una chiamata a C_Sign o a C_SignFinal per ottenere la firma. Per elaborare ulteriori dati (in una o più parti), l'applicazione deve richiamare nuovamente C_SignInit .

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_SignInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_CONSENTE, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENTE, CKR_MECHANISM_INVALID, _SESS_INVALID,

Frammenti di codice

  • Frammento di codice Golang

    SignInitRequest := &pb.SignInitRequest {
        Mech:    &pb.Mechanism{Mechanism: ep11.CKM_SHA1_RSA_PKCS},
        PrivKey: GenerateKeyPairResponse.PrivKeyBytes,
    }
    
    SignInitResponse, err := cryptoClient.SignInit(context.Background(), SignInitRequest)
    
  • Frammento di codice JavaScript

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

Firma

La funzione Sign firma i dati di una singola parte. Non è necessario eseguire le operazioni secondarie SignUpdate e SignFinal per una firma a parte singola. Prima di richiamare questa funzione, assicurarsi di eseguire prima SignInit.

Descrizione Esegue il bind a m_Sign EP11, che è un'implementazione di C_Sign PKCS #11.
Parametri
    message SignRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message SignResponse {
        bytes Signature = 3;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_Sign PKCS #11.

Non aggiorna (state, slen).

Il blob state,slen deve essere associato dal parametro hSession PKCS #11. (La libreria host deve associare la sessione allo stato archiviato).

Il blob state veniva generato in output da: SignInit.

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_Sign. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_Sign firma i dati in una singola parte, dove la firma è un'appendice ai dati. hSession è la gestione della sessione; pData punta ai dati; ulDataLen è la lunghezza dei dati; pSignature punta all'ubicazione che riceve la firma; pulSignatureLen punta alla posizione che contiene la lunghezza della firma.

C_Sign utilizza la convenzione descritta nella Sezione 5.2 della specifica API PKCS #11 sulla produzione dell'output.

L'operazione di firma deve essere inizializzata con C_SignInit. Una chiamata a C_Sign termina sempre l'operazione di firma attiva a meno che non restituisca CKR_BUFFER_TOO_SMALL o sia una chiamata riuscita (ovvero, una che restituisce CKR_OK) per determinare la lunghezza del buffer necessario per conservare la firma.

C_Sign non può essere utilizzata per terminare un'operazione in più parti e deve essere richiamata dopo C_SignInit senza chiamate C_SignUpdate intermedie.

Per la maggior parte dei meccanismi, C_Sign è equivalente a una sequenza di operazioni C_SignUpdate seguita da C_SignFinal.

Parametri
    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
    );
    
Valori restituiti 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_ANNULLA, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_INVALID, CKR_SESSION_CLOSED

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice JavaScript

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

SignUpdate

La funzione SignUpdate contiene un'operazione di firma di più parti. Prima di richiamare questa funzione, assicurarsi di eseguire prima SignInit.

Descrizione Esegue il bind a m_SignUpdate EP11, che è un'implementazione di C_SignUpdate PKCS #11.
Parametri
    message SignUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message SignUpdateResponse {
        bytes State = 1;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_SignUpdate PKCS #11.

Il blob state,slen deve essere associato dal parametro hSession PKCS #11. (La libreria host deve associare la sessione allo stato archiviato).

Il blob state veniva generato in output da: SignInit.

Parametri
    CK_RV m_SignUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_SignUpdate. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_SignUpdate continua un'operazione di firma a più parti, elaborando un'altra parte di dati. hSession è l'handle della sessione, pPart punta alla parte di dati; ulPartLen è la lunghezza della parte di dati.

L'operazione di firma deve essere inizializzata con C_SignInit. Questa funzione può essere chiamata un numero qualsiasi di volte in successione. Una chiamata C_SignUpdate che produce un errore termina l'attuale operazione di firma.

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_SignUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_ANNULLATI, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOTEDIN.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice JavaScript

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

SignFinal

La funzione SignFinal termina un'operazione di firma di più parti.

Descrizione Esegue il bind a m_SignFinal EP11, che è un'implementazione di C_SignFinal PKCS #11.
Parametri
    message SignFinalRequest {
        bytes State = 1;
    }
    message SignFinalResponse {
        bytes Signature = 2;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_SignFinal PKCS #11.

Non aggiorna (state, slen).

Il blob state,slen deve essere associato dal parametro hSession PKCS #11. (La libreria host deve associare la sessione allo stato archiviato).

Il blob state veniva generato in output da: SignInit, SignUpdate.

Parametri
    CK_RV m_SignFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_SignFinal. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_SignFinal termina un'operazione di firma a più parti, restituendo la firma. hSession è l'handle della sessione; pSignature punta all'ubicazione che riceve la firma; pulSignatureLen punta all'ubicazione che contiene la lunghezza della firma.

C_SignFinal utilizza la convenzione descritta nella sezione 5.2 della specifica API PKCS #11 sulla produzione di output.

L'operazione di firma deve essere inizializzata con C_SignInit. Una chiamata a C_SignFinal termina sempre l'operazione di firma attiva a meno che non restituisca CKR_BUFFER_TOO_SMALL o sia una chiamata riuscita (ovvero, una che restituisce CKR_OK) per determinare la lunghezza del buffer necessario per conservare la firma.

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_SignFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pSignature,
        CK_ULONG_PTR pulSignatureLen
    );
    
Valori restituiti 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_CANCELLALIZED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID

Frammenti di codice

  • Frammento di codice Golang

    SignFinalRequest := &pb.SignFinalRequest {
        State: SignUpdateResponse.State,
    }
    
    SignFinalResponse, err := cryptoClient.SignFinal(context.Background(), SignFinalRequest)
    
  • Frammento di codice JavaScript

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

SignSingle

La funzione SignSingle firma i dati MAC in un unico passaggio con una chiamata e senza costruire lo stato intermedio del digest. Non restituisce alcuno stato all'host e restituisce solo il risultato. Questa funzione è un'estensione IBM EP11 alla specifica PKCS #11 standard ed è una combinazione delle funzioni SignInit e Sign. Consente di completare un'operazione di firma con una singola chiamata invece di una serie di chiamate.

Descrizione Esegue il bind a EP11 m_SignSingle.
Parametri
    message SignSingleRequest {
        bytes PrivKey = 1;
        Mechanism Mech = 2;
        bytes Data = 3;
    }
    message SignSingleResponse {
        bytes Signature = 4;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Estensione non standard, combinazione di SignInit e Sign. Firma o protegge con una chiave MAC i dati in un singolo passaggio, con una singola chiamata, senza creare uno stato di digest intermedio. Non restituisce alcuno stato all'host, solo il risultato.

Questo è il modo preferito di firma, senza un ulteriore roundtrip, crittografia e decrittografia. Funzionalmente, SignSingle è equivalente a SignInit seguita immediatamente da Sign.

Il blob (key, klen) e il meccanismo pmech insieme devono essere passabili a SignInit.

Sono supportate le richieste multi - dati per le firme HMAC e CMAC (sottovariante 2 e 3).

Vedi anche: SignInit, Sign, VerifySingle.

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_Decrypt. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice JavaScript

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

VerifyInit

La funzione VerifyInit inizializza un'operazione di verifica. È necessario richiamare prima questa funzione per verificare una firma.

Descrizione Esegue il bind a m_VerifyInit EP11, che è un'implementazione di C_VerifyInit PKCS #11.
Parametri
    message VerifyInitRequest {
        Mechanism Mech = 2;
        bytes PubKey = 3;
    }
    message VerifyInitResponse {
        bytes State = 1;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_VerifyInit PKCS #11. Dato un blob chiave (key, klen), inizializza uno stato di verifica della sessione in (state, slen). Il blob chiave può essere un oggetto chiave pubblica o byte chiave HMAC. Il tipo di blob chiave deve essere congruente con pmech.

Per i meccanismi a chiave pubblica, (key, klen) deve contenere una SPKI. Questo SPKI CKA_UNWRAP può essere MACed (come restituito in precedenza dalla coppia GenerateKeyPair) o solo lo stesso SPKI (se ottenuto da un'origine esterna, come un certificato).

Se viene inizializzata un'operazione HMAC, le limitazioni di sessione dell'oggetto Verifica vengono ereditate dalla chiave HMAC. Poiché le SPKI non sono collegate alle sessioni, gli stati Verify di chiave pubblica sono senza sessione.

Il blob key,klen deve essere associato dal parametro hKey PKCS #11

Nota: SignInit e VerifyInit sono internamente i lo stesso per HMAC e altri meccanismi simmetrici / MAC.

Parametri
    CK_RV m_VerifyInit (
        unsigned char * state, size_t * statelen,
        CK_MECHANISM_PTR mech,
        const unsigned char *pubKey, size_t pubKeylen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_VerifyInit. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_VerifyInit inizializza un'operazione di verifica, in cui la firma è un'appendice ai dati. hSession è l'handle della sessione; pMechanism punta alla struttura che specifica il meccanismo di verifica; hKey è l'handle della chiave di verifica.

L'attributo CKA_VERIFY della chiave di verifica, che indica se la chiave supporta la verifica dove la firma è un'appendice ai dati, deve essere CK_TRUE.

Dopo che l'applicazione ha richiamato C_VerifyInit, l'applicazione può richiamare C_Verify per verificare una firma sui dati in una singola parte; oppure richiamare C_VerifyUpdate una o più volte, seguito da C_VerifyFinal, per verificare una firma sui dati in più parti. L'operazione di verifica è attiva finché l'applicazione non richiama C_Verify o C_VerifyFinal. Per elaborare dati supplementari (in una o più parti), l'applicazione deve richiamare nuovamente C_VerifyInit .

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_CONSENTE, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENTE, CKR_MECHANISM_INVALID, _SESS_INVALID,

Frammenti di codice

  • Frammento di codice Golang

    VerifyInitRequest := &pb.VerifyInitRequest {
      Mech:   &pb.Mechanism{Mechanism: ep11.CKM_SHA1_RSA_PKCS},
      PubKey: GenerateKeyPairResponse.PubKeyBytes,
    }
    
    VerifyInitResponse, err := cryptoClient.VerifyInit(context.Background(), VerifyInitRequest)
    
  • Frammento di codice JavaScript

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

Verifica

La funzione Verify verifica una firma sui dati di una singola parte. Non è necessario eseguire le operazioni secondarie VerifyUpdate e VerifyFinal per una verifica di una singola parte. Prima di richiamare questa funzione, assicurarsi di eseguire prima VerifyInit.

Descrizione Esegue il bind a m_Verify EP11, che è un'implementazione di C_Verify PKCS #11.
Parametri
    message VerifyRequest {
        bytes State = 1;
        bytes Data = 2;
        bytes Signature = 3;
    }
    message VerifyResponse {
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_Verify PKCS #11.

Non aggiorna (state, slen).

L'ordine relativo dei dati e della firma sono invertiti in VerifySingle.

Il blob state,slen deve essere associato dal parametro hSession PKCS #11. (La libreria host deve associare la sessione allo stato archiviato).

Il blob state veniva generato in output da: VerifyInit.

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_Verify. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_Verify verifica una firma in un'operazione a parte singola, dove la firma è un'appendice ai dati. hSession è la gestione della sessione; pData punta ai dati; ulDataLen è la lunghezza dei dati; pSignature punta alla firma; ulSignatureLen è la lunghezza della firma.

L'operazione di verifica deve essere inizializzata con C_VerifyInit. Una chiamata a C_Verify termina sempre l'operazione di verifica attiva.

Una chiamata eseguita correttamente a C_Verify deve restituire il valore CKR_OK (che indica che la firma fornita è valida) o CKR_SIGNATURE_INVALID (che indica che la firma fornita non è valida). Se la firma non è valida esclusivamente in base alla sua lunghezza, è necessario restituire CKR_SIGNATURE_LEN_RANGE . In uno qualsiasi di questi casi, l'operazione di firma attiva viene terminata.

C_Verify non può essere utilizzata per terminare un'operazione in più parti e deve essere richiamata dopo C_VerifyInit senza chiamate C_VerifyUpdate intermedie.

Per la maggior parte dei meccanismi, C_Verify è equivalente a una sequenza di operazioni C_VerifyUpdate seguita da C_VerifyFinal.

Parametri
    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
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_INVALID, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_OPERATION_NOTALIZED, CKR_SESSION_CLOSED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOTALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKRR_RANGE

Frammenti di codice

  • Frammento di codice Golang

    VerifyRequest := &pb.VerifyRequest {
        State:     VerifyInitResponse.State,
        Data:      msgHash[:],
        Signature: SignResponse.Signature,
    }
    
    VerifyResponse, err := cryptoClient.Verify(context.Background(), VerifyRequest)
    
  • Frammento di codice JavaScript

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

VerifyUpdate

La funzione VerifyUpdate continua un'operazione di verifica di più parti. Prima di richiamare questa funzione, assicurarsi di eseguire prima VerifyInit.

Descrizione Esegue il bind a m_VerifyUpdate EP11, che è un'implementazione di C_VerifyUpdate PKCS #11.
Parametri
    message VerifyUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message VerifyUpdateResponse {
        bytes State = 1;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_VerifyUpdate PKCS #11.

Il blob state,slen deve essere associato dal parametro hSession PKCS #11. (La libreria host deve associare la sessione allo stato archiviato).

Il blob state veniva generato in output da: VerifyInit.

Parametri
    CK_RV m_VerifyUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_VerifyUpdate. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_VerifyUpdate continua un'operazione di verifica di più parti, elaborando un'altra parte di dati. hSession è la gestione della sessione, pPart punta alla parte di dati; ulPartLunghezza è la lunghezza della parte di dati.

L'operazione di verifica deve essere inizializzata con C_VerifyInit. Questa funzione può essere chiamata un numero qualsiasi di volte in successione. Una chiamata a C_VerifyUpdate che causa un errore termina l'operazione di verifica corrente.

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice JavaScript

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

VerifyFinal

La funzione VerifyFinal termina un'operazione di verifica di più parti.

Descrizione Esegue il bind a m_VerifyFinal EP11, che è un'implementazione di C_VerifyFinal PKCS #11.
Parametri
    message VerifyFinalRequest {
        bytes State = 1;
        bytes Signature = 2;
    }
    message VerifyFinalResponse {
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_VerifyFinal PKCS #11.

Non aggiorna (state, slen).

Il blob state,slen deve essere associato dal parametro hSession PKCS #11. (La libreria host deve associare la sessione allo stato archiviato).

Il blob state veniva generato in output da: VerifyInit, VerifyUpdate.

Parametri
    CK_RV m_VerifyFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR signature, CK_ULONG signaturelen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_VerifyFinal. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_VerifyFinal termina un'operazione di verifica di più parti, controllando la firma. hSession è l'handle della sessione; pSignature punta alla firma; ulSignatureLen è la lunghezza della firma.

L'operazione di verifica deve essere inizializzata con C_VerifyInit. Una chiamata a C_VerifyFinal termina sempre l'operazione di verifica attiva.

Una chiamata eseguita correttamente a C_VerifyFinal deve restituire il valore CKR_OK (che indica che la firma fornita è valida) o CKR_SIGNATURE_INVALID (che indica che la firma fornita non è valida). Se la firma non è valida in base alla sua lunghezza, è necessario restituire CKR_SIGNATURE_LEN_RANGE . In uno qualsiasi di questi casi, l'operazione di verifica attiva viene terminata.

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pSignature,
        CK_ULONG ulSignatureLen
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_ANNULLATI, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SIGNATURE_RANGE NON VALIDO,

Frammenti di codice

  • Frammento di codice Golang

    VerifyFinalRequest := &pb.VerifyFinalRequest {
        State:     VerifyUpdateResponse.State,
        Signature: SignResponse.Signature,
    }
    
    VerifyFinalResponse, err := cryptoClient.VerifyFinal(context.Background(), VerifyFinalRequest)
    
  • Frammento di codice JavaScript

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

VerifySingle

La funzione VerifySingle firma i dati MAC in un unico passaggio con una chiamata e senza costruire lo stato intermedio del digest. Non restituisce alcuno stato all'host e restituisce solo il risultato della verifica. Questa funzione è un'estensione IBM EP11 alla specifica PKCS #11 standard ed è una combinazione delle funzioni VerifyInit e Verify. Consente di completare un'operazione di verifica con una singola chiamata invece di una serie di chiamate.

Descrizione Si collega a EP11 m_VerifySingle.
Parametri
    message VerifySingleRequest {
        bytes PubKey = 1;
        Mechanism Mech = 2;
        bytes Data = 3;
        bytes Signature = 4;
    }
    message VerifySingleResponse {
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Estensione non standard, combinazione di VerifyInit e Verify. Firma o protegge con una chiave MAC i dati in un singolo passaggio, con una singola chiamata, senza creare uno stato di digest intermedio. Non restituisce alcuno stato all'host, fatta eccezione per il risultato della verifica. Nessuna query di dimensione disponibile perché questa funzione restituisce un valore booleano.

Questo è il modo preferito di verificare una firma, senza un ulteriore roundtrip, crittografia, decrittografia. Funzionalmente, VerifySingle è equivalente a VerifyInit seguita immediatamente da una Verify.

Il blob (key, klen) e il meccanismo pmech insieme devono essere passabili a VerifyInit.

Per i meccanismi a chiave pubblica, (key, klen) deve contenere una SPKI. Questo SPKI può essere MACed (come ad esempio restituito come una chiave pubblica da GenerateKeyPair) o solo lo stesso SPKI (se ottenuto da un'origine esterna, come ad esempio un certificato).

Vedi anche: VerifyInit, Verify, SignSingle.

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_VerifySingle. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice JavaScript

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

Protezione dell'integrità dei dati attraverso i digest dei messaggi

GREP11 fornisce una serie di funzioni per creare digest di messaggi progettati per proteggere l'integrità di una parte di dati. Potrebbe essere necessario richiamare una serie di funzioni secondarie per eseguire un'operazione di digestione. Ad esempio, l'operazione di digest a più parti è costituita dalle operazioni secondarie DigestInit, DigestUpdate e DigestFinal.

DigestInit

La funzione DigestInit inizializza un'operazione di esecuzione del digest dei messaggi. È necessario eseguire questa funzione prima di eseguire un'operazione di digestione.

Descrizione Esegue il bind a m_DigestInit EP11, che è un'implementazione di C_DigestInit PKCS #11.
Parametri
    message DigestInitRequest {
        Mechanism Mech = 2;
    }
    message DigestInitResponse {
        bytes State = 1;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_DigestInit PKCS #11.

Crea uno stato di digest impacchettato.

Nota: le query di dimensione sono supportate ma lo stato impacchettato viene sempre restituito dal backend, a differenza della maggior parte delle query di dimensione (che restituiscono una dimensione di output, invece dell'output effettivo). Gli stati Digest sono sufficientemente piccoli da non introdurre un sovraccarico rilevante del trasporto.

Durante le query di dimensione, l'host semplicemente scarta lo stato restituito e notifica la dimensione di blob (in len). Quando viene restituito blob, len viene controllato rispetto alla dimensione restituita.

Il blob state,len deve essere associato dal parametro hSession PKCS #11. (La libreria host deve collegare il blob alla sessione).

Parametri
    CK_RV m_DigestInit (
        unsigned char * state, siz_t * len,
        const CK_MECHANISM_PTR mech,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_DigestInit. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_DigestInit inizializza un'operazione di digest del messaggio. hSession è l'handle della sessione; pMechanism punta al meccanismo di digestione.

Dopo che l'applicazione ha richiamato C_DigestInit, l'applicazione può richiamare C_Digest per digest i dati in una singola parte oppure richiamare C_DigestUpdate zero o più volte, seguito da C_DigestFinal, per digest i dati in più parti. L'operazione di digest del messaggio è attiva finché l'applicazione non utilizza una chiamata a C_Digest o C_DigestFinal per ottenere il digest del messaggio. Per elaborare ulteriori dati (in una o più parti), l'applicazione deve richiamare nuovamente 1C_DigestInit1 .

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_DigestInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOTALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_ANNULLATO, 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_invalid

Frammenti di codice

  • Frammento di codice Golang

    DigestInitRequest := &pb.DigestInitRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_SHA256},
    }
    
    DigestInitResponse, err := cryptoClient.DigestInit(context.Background(), DigestInitRequest)
    
  • Frammento di codice JavaScript

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

Digest

La funzione Digest esegue il digest di dati di una singola parte. Non è necessario richiamare le funzioni di DigestUpdate e DigestFinal per la gestione dei dati a parte singola. Prima di richiamare questa funzione, assicurarsi di eseguire prima DigestInit. Quando si impostano i parametri, non specificare la lunghezza dei dati di input come zero e il puntatore che punta all'ubicazione dei dati di input come NULL.

Descrizione Esegue il bind a m_Digest EP11, che è un'implementazione di C_Digest PKCS #11.
Parametri
    message DigestRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message DigestResponse {
        bytes Digest = 3;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_Digest PKCS #11.

Se un oggetto digest ha esattamente 0 (zero) byte che vengono accodati ad esso dopo la creazione, in qualsiasi combinazione di trasferimenti zero - byte, può ancora eseguire un Digest one - pass, anche se deve essere rifiutato da un'implementazione rigorosa.

Non aggiorna (state, slen).

Le implementazioni potrebbero essere eseguite DigestUpdate, DigestFinalo Digest richiama oggetti digest in testo non codificato nel codice host, ignorando completamente i backend HSM. Questa scelta potrebbe essere visibile o meno al codice host e non influisce sulla sicurezza dell'operazione (poiché gli oggetti di eliminazione potrebbero non digest i dati sensibili).

Il blob state,slen deve essere associato dal parametro hSession PKCS #11. Il blob state veniva generato in output da: DigestInit.

Parametri
    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,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_Digest. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_Digest esegue il digest dei dati in una singola parte. hSession è l'handle della sessione, pData punta ai dati; ulDataLen è la lunghezza dei dati; pDigest punta all'ubicazione che riceve il messaggio digest; pulDigestLen punta all'ubicazione che contiene la lunghezza del messaggio digest.

C_Digest utilizza la convenzione descritta nella sezione 5.2 della specifica API PKCS #11 sulla produzione dell'output.

L'operazione digest deve essere inizializzata con C_DigestInit. Una chiamata a C_Digest termina sempre l'operazione digest attiva a meno che non restituisca CKR_BUFFER_TOO_SMALL o sia una chiamata riuscita (ovvero, una che restituisce CKR_OK) per determinare la lunghezza del buffer necessario per conservare il digest del messaggio.

C_Digest non può essere utilizzata per terminare un'operazione in più parti e deve essere richiamata dopo C_DigestInit senza chiamate C_DigestUpdate intermedie.

I dati di input e l'output del digest possono essere nello stesso posto, vale a dire, è OK se pData e pDigest puntano alla stessa ubicazione.

C_Digest è equivalente a una sequenza di operazioni C_DigestUpdate seguita da C_DigestFinal.

Parametri
    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
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_ANNULLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Frammenti di codice

  • Frammento di codice Golang

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

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

DigestUpdate

La funzione DigestUpdate continua un'operazione di digest di più parti. Prima di richiamare questa funzione, assicurarsi di eseguire prima DigestInit. Quando si impostano i parametri, non specificare la lunghezza dei dati di input come zero e il puntatore che punta all'ubicazione dei dati di input come NULL.

Descrizione Esegue il bind a m_DigestUpdate EP11, che è un'implementazione di C_DigestUpdate PKCS #11.
Parametri
    message DigestUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message DigestUpdateResponse {
        bytes State = 1;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_DigestUpdate PKCS #11.

DigestUpdate è polimorfico, accettare entrambi gli oggetti digest con o senza ritorno a capo, aggiornando lo stato nello stesso formato.

Il blob state,slen deve essere associato dal parametro hSession PKCS #11. (La libreria host deve associare la sessione allo stato archiviato).

Il blob state veniva generato in output da: DigestInit, DigestUpdate, DigestKey.

Vedi anche: DigestInit

Parametri
    CK_RV m_DigestUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_DigestUpdate. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_DigestUpdate continua un'operazione di digest di più parti, elaborando un'altra parte di dati. hSession è l'handle della sessione, pPart punta alla parte di dati; ulPartLen è la lunghezza della parte di dati.

L'operazione di digest del messaggio deve essere inizializzata con C_DigestInit. Le chiamate a questa funzione e C_DigestKey possono essere intervallate un numero qualsiasi di volte in qualsiasi ordine. Una chiamata C_DigestUpdate che produce un errore termina l'attuale operazione di digest.

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_DigestUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_ANNULLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice JavaScript

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

DigestFinal

La funzione DigestFinal termina un'operazione di digest di più parti.

Descrizione Esegue il bind a m_DigestFinal EP11, che è un'implementazione di C_DigestFinal PKCS #11.
Parametri
    message DigestFinalRequest {
        bytes State = 1;
    }
    message DigestFinalResponse {
        bytes Digest = 2;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Implementazione di C_DigestFinal PKCS #11.

DigestFinal è polimorfico, che accetta sia oggetti digest in chiaro che impacchettati.

Non aggiorna (state, slen).

Il blob state,slen deve essere associato dal parametro hSession PKCS #11.

Il blob state veniva generato in output da: DigestInit, DigestUpdate, DigestKey.

Parametri
    CK_RV m_DigestFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_DigestFinal. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.
Descrizione

C_DigestFinal termina un'operazione di digest del messaggio in più parti, restituendo il digest del messaggio. hSession è l'handle della sessione; pDigest punta all'ubicazione che riceve il digest del messaggio; pulDigestLen punta all'ubicazione che contiene la lunghezza del digest del messaggio.

C_DigestFinal utilizza la convenzione descritta nella sezione 5.2 della specifica API PKCS #11 sulla produzione dell'output.

L'operazione digest deve essere inizializzata con C_DigestInit. Una chiamata a C_DigestFinal termina sempre l'operazione digest attiva a meno che non restituisca CKR_BUFFER_TOO_SMALL o sia una chiamata riuscita (ovvero, una chiamata che restituisce CKR_OK) per stabilire la lunghezza del buffer necessaria per conservare il digest del messaggio.

Parametri
    CK_DEFINE_FUNCTION(CK_RV, C_DigestFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pDigest,
        CK_ULONG_PTR pulDigestLen
    );
    
Valori restituiti CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_ANNULLATO, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Frammenti di codice

  • Frammento di codice Golang

    DigestFinalRequest := &pb.DigestFinalRequest {
        State: DigestUpdateResponse.State,
    }
    
    DigestFinalResponse, err := cryptoClient.DigestFinal(context.Background(), DigestFinalRequest)
    
  • Frammento di codice JavaScript

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

DigestSingle

La funzione DigestSingle esegue il digest dei dati in un unico passaggio con una chiamata e senza costruire uno stato di digest intermedio e roundtrip non necessari. Questa funzione è un'estensione IBM EP11 alla specifica PKCS #11 standard ed è una combinazione delle funzioni DigestInit e Digest. Consente di completare un'operazione di digestione con una singola chiamata invece di una serie di chiamate.

Descrizione Collega a EP11 m_DigestSingle.
Parametri
    message DigestSingleRequest {
        Mechanism Mech = 1;
        bytes Data = 2;
    }
    message DigestSingleResponse {
        bytes Digest = 3;
    }
    
Valori restituiti Impacchetta l'errore EP11 in message Grep11Error.
Descrizione

Estensione non standard, combinazione di DigestInit e Digest. Esegue il digest dei dati in un singolo passaggio, senza creare uno stato di digest intermedio e roundtrip non necessari.

Questo è il metodo preferito di esecuzione di digest di testo non crittografato per le applicazioni in grado di riconoscere XCP. Funzionalmente, DigestSingle è equivalente a DigestInit seguita immediatamente da Digest.

Se deve essere eseguito il digest di una chiave, devi utilizzare DigestInit e DigestKey, poiché questa funzione non gestisce i blob di chiave.

Non restituisce alcuno stato all'host, fatta eccezione per il risultato del digest. Non ci sono parametri non PKCS #11 poiché tutto viene utilizzato direttamente dalla chiamata PKCS #11.

Parametri
    CK_RV m_DigestSingle (
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        destinazione_t
    );
    
Valori restituiti Un sottoinsieme dei valori restituiti C_DigestSingle. Per ulteriori informazioni, consultare il capitolo Valori di ritorno del documento Enterprise PKCS #11 (EP11) Library structure.

Frammenti di codice

  • Frammento di codice 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)
    
  • Frammento di codice JavaScript

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

Esempi di codice

L'API GREP11 supporta i linguaggi di programmazione con le librerie gRPC. Vengono forniti due repository GitHub di esempio per testare l'API GREP11: