Verschlüsselungsoperationen: GREP11-API

IBM Cloud® Hyper Protect Crypto Services stellt eine Reihe von Verschlüsselungsfunktionen bereit, die in einem Hardwaresicherheitsmodul(HSM)A physical appliance that provides on-demand encryption, key management, and key storage as a managed service. in der Cloud ausgeführt werden. Sie können Verschlüsselungsoperationen über einen Fernzugriff auf diese Funktionen mit Enterprise PKCS #11 (EP11) über gRPC-API-Aufrufen (auch als GREP11 bezeichnet) durchführen.

Weitere Informationen zur Art der Beziehungen zwischen den GREP11-Funktionen und PKCS #11 und EP11 finden Sie in Einführung in GREP11.

Die API GREP11 kann bis zu 500 Anforderungen/Sekunde für eine einzelne Verschlüsselungseinheit verarbeiten.

Auf die API zugreifen

Ein GREP11-API-Endpunkt, ein Service-ID-API-Schlüssel, ein IAM-Endpunkt sind für die Initialisierung erforderlich, bevor GREP11-API-Funktionsaufrufe ausgeführt werden. Weitere Informationen dazu finden Sie in GREP11-API-Anforderung generieren.

Fehlerbehandlung

GREP11 basiert auf der Spezifikation gRPC für die Fehlerbehandlung. Wenn ein Fehler auftritt, empfangen gRPC-Clients einen message Status-Protokollpuffer.

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

In der Fehlernachricht gilt Folgendes:

  • code enthält den Statuscode, der ein Aufzählungswert (enum) des Felds google.rpc.Code sein muss.
  • Die message enthält eine Fehlernachricht für die Entwickler auf Englisch. Jede an den Benutzer gerichtete Fehlernachricht muss lokalisiert und im Feld google.rpc.Status.details gesendet werden oder sie muss vom Benutzer lokalisiert werden.
  • details listet Nachrichten auf, die die Fehlerdetails enthalten. Für die Verwendung durch die API steht eine Gruppe allgemeiner Nachrichtentypen zur Verfügung.

GREP11 hängt mithilfe des Felds Detail zusätzliche Fehlercodeinformationen an.

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

Das Feld Code kann in den Wert CK_RV in PKCS #11umgesetzt werden. Dieses Feld enthält die Fehlercodes, die in der PKCS #11 -Spezifikation definiert sind, oder die Anbietererweiterungen, die in EP11definiert sind. EP11 verwendet nur eine Untergruppe der von PKCS #11 definierten Rückgabewerte. Weitere Informationen finden Sie im Abschnitt 10.1.6 Rückgabewerte in der Enterprise PKCS #11-Bibliotheksstruktur.

Ein Beispiel in Golang, das Fehler behandelt, ist verfügbar.

GREP11-Funktionsliste

PKCS #11-Funktionen, die in der Tabelle mit einem Stern (*) markiert sind, werden von EP11 über gRPC implementiert. Andere Funktionen werden nicht implementiert.

Tabelle 1. Beschreibt die implementierten Funktionen in EP11 über gRPC
PKCS #11 Enterprise PKCS #11 Enterprise PKCS #11 über gRPC Beschreibung
C_Initialize Nicht zutreffend Nicht zutreffend Initialisiert Cryptoki.
C_Finalize Nicht zutreffend Nicht zutreffend Bereinigt verschiedene zu Cryptoki gehörige Ressourcen.
C_GetInfo Nicht zutreffend Nicht zutreffend Ruft allgemeine Informationen zu Cryptoki ab.
C_GetFunctionList Nicht zutreffend Nicht zutreffend Ruft Eingangspunkte von Cryptoki-Bibliotheksfunktionen ab.
C_GetSlotList Nicht zutreffend Nicht zutreffend Ruft eine Liste der Slots im System ab.
C_GetSlotInfo Nicht zutreffend Nicht zutreffend Ruft Informationen zu einem bestimmten Slot ab.
C_GetTokenInfo Nicht zutreffend Nicht zutreffend Ruft Informationen zu einem bestimmten Token ab.
C_WaitForSlotEvent Nicht zutreffend Nicht zutreffend Wartet auf das Eintreten eines Slotereignisses (Tokeneinfügung, -entfernung usw.).
C_GetMechanismList* m_GetMechanismList GetMechanismList Ruft eine Liste der Mechanismen ab, die von einem Token unterstützt werden.
C_GetMechanismInfo* m_GetMechanismInfo GetMechanismInfo Ruft Informationen zu einem bestimmten Verfahren ab.
C_InitToken Nicht zutreffend Nicht zutreffend Initialisiert ein Token.
C_InitPIN Nicht zutreffend Nicht zutreffend Initialisiert die PIN des normalen Benutzers.
C_SetPIN Nicht zutreffend Nicht zutreffend Ändert die PIN des aktuellen Benutzers.
C_OpenSession Nicht zutreffend Nicht zutreffend Öffnet eine Verbindung zwischen einer Anwendung und einem bestimmten Token oder richtet einen Anwendungsrückruf für das Einfügen von Tokens ein.
C_CloseSession Nicht zutreffend Nicht zutreffend Schließt eine Sitzung.
C_CloseAllSessions Nicht zutreffend Nicht zutreffend Schließt alle Sitzungen mit einem Token.
C_GetSessionInfo Nicht zutreffend Nicht zutreffend Ruft Informationen zu der Sitzung ab.
C_GetOperationState Nicht zutreffend Nicht zutreffend Ruft den Status der Verschlüsselungsoperationen einer Sitzung ab.
C_SetOperationState Nicht zutreffend Nicht zutreffend Legt den Status der Verschlüsselungsoperationen einer Sitzung fest.
C_Login Nicht zutreffend Nicht zutreffend Meldet sich bei einem Token an.
C_Logout Nicht zutreffend Nicht zutreffend Meldet sich von einem Token ab.
C_CreateObject Nicht zutreffend Nicht zutreffend Erstellt ein Objekt.
C_CopyObject Nicht zutreffend Nicht zutreffend Erstellt eine Kopie eines Objekts.
C_DestroyObject Nicht zutreffend Nicht zutreffend Löscht ein Objekt.
C_GetObjectSize Nicht zutreffend Nicht zutreffend Ruft die Größe eines Objekts in Byte ab.
C_GetAttributeValue* m_GetAttributeValue GetAttributeValue Ruft einen Attributwert eines Objekts ab.
C_SetAttributeValue* m_SetAttributeValue SetAttributeValue Ändert einen Attributwert eines Objekts. Es können nur boolesche Attribute geändert werden.
C_FindObjectsInit Nicht zutreffend Nicht zutreffend Initialisiert eine Objektsuchoperation.
C_FindObjects Nicht zutreffend Nicht zutreffend Setzt eine Objektsuchoperation fort.
C_FindObjectsFinal Nicht zutreffend Nicht zutreffend Beendet eine Objektsuchoperation.
C_EncryptInit* m_EncryptInit EncryptInit Initialisiert eine Verschlüsselungsoperation.
C_Encrypt* m_Encrypt Verschlüsseln Verschlüsselt einteilige Daten.
C_EncryptUpdate* m_EncryptUpdate EncryptUpdate Setzt eine mehrteilige Verschlüsselungsoperation fort.
C_EncryptFinal* m_EncryptFinal EncryptFinal Beendet eine mehrteilige Verschlüsselungsoperation.
Nicht zutreffend m_EncryptSingle EncryptSingle IBM-Erweiterung, vom Standard abweichende Variante von Encrypt. Verarbeitet Daten in einem Durchgang, mit einem einzigen Aufruf. Gibt keinen Status an den Host zurück, nur die verschlüsselten Daten.
Nicht zutreffend m_ReencryptSingle ReencryptSingle IBM-Erweiterung, vom Standard abweichende Variante von Encrypt. Entschlüsselt Daten mit dem Originalschlüssel und verschlüsselt die Rohdaten mit einem anderen Schlüssel in einem einzigen Aufruf innerhalb des Cloud-HSM. Gibt keinen Status an den Host zurück, nur die erneut verschlüsselten Daten.
C_DecryptInit* m_DecryptInit DecryptInit Initialisiert eine Entschlüsselungsoperation.
C_Decrypt* m_Decrypt Entschlüsseln Entschlüsselt einteilige verschlüsselte Daten.
C_DecryptUpdate* m_DecryptUpdate DecryptUpdate Setzt eine mehrteilige Entschlüsselungsoperation fort.
C_DecryptFinal* m_DecryptFinal DecryptFinal Beendet eine mehrteilige Entschlüsselungsoperation.
Nicht zutreffend m_DecryptSingle DecryptSingle IBM-Erweiterung, vom Standard abweichende Variante von Decrypt. Verarbeitet Daten in einem Durchgang, mit einem einzigen Aufruf. Gibt keinen Status an den Host zurück, nur die entschlüsselten Daten.
C_DigestInit* m_DigestInit DigestInit Initialisiert eine Operation für den Message-Digest.
C_Digest* m_Digest Digest Verarbeitet einteilige Daten. Die Länge der Eingabedaten darf nicht null sein und der Zeiger, der auf die Eingabedatenposition verweist, darf nicht NULL sein.
C_DigestUpdate* m_DigestUpdate DigestUpdate Setzt eine mehrteilige Digest-Operation fort. Die Länge der Eingabedaten darf nicht null sein und der Zeiger, der auf die Eingabedatenposition verweist, darf nicht NULL sein.
C_DigestKey Nicht zutreffend Nicht zutreffend Verarbeitet einen Schlüssel.
C_DigestFinal* m_DigestFinal DigestFinal Beendet eine mehrteilige Digest-Operation.
Nicht zutreffend m_DigestSingle DigestSingle IBM-Erweiterung, vom Standard abweichende Erweiterung, Kombination von 'DigestInit' und 'Digest'. Verarbeitet Daten in einem Durchgang, mit einem einzigen Aufruf, ohne einen temporären Digest-Status und unnötige Umläufe aufzubauen.
C_SignInit* m_SignInit SignInit Initialisiert eine Signaturoperation.
C_Sign* m_Sign Unterzeichnen Signiert einteilige Daten.
C_SignUpdate* m_SignUpdate SignUpdate Setzt eine mehrteilige Signaturoperation fort.
C_SignFinal* m_SignFinal SignFinal Beendet eine mehrteilige Signaturoperation.
C_SignRecoverInit Nicht zutreffend Nicht zutreffend Initialisiert eine Signaturoperation, wobei die Daten anhand der Signatur wiederhergestellt werden.
C_SignRecover Nicht zutreffend Nicht zutreffend Signiert einteilige Daten, wobei die Daten anhand der Signatur wiederhergestellt werden.
Nicht zutreffend m_SignSingle SignSingle IBM-Erweiterung, vom Standard abweichende Erweiterung, Kombination von 'SignInit' und 'Sign'. Signiert Daten oder verarbeitet sie mit MAC in einem Durchgang, mit einem einzigen Aufruf, ohne einen temporären Digest-Status aufzubauen. Gibt keinen Status an den Host zurück, nur das Ergebnis.
C_VerifyInit* m_VerifyInit VerifyInit Initialisiert eine Verifizierungsoperation.
C_Verify* m_Verify Verify Verifiziert eine Signatur für einteilige Daten.
C_VerifyUpdate* m_VerifyUpdate VerifyUpdate Setzt eine mehrteilige Verifizierungsoperation fort.
C_VerifyFinal* m_VerifyFinal VerifyFinal Beendet eine mehrteilige Verifizierungsoperation.
C_VerifyRecoverInit Nicht zutreffend Nicht zutreffend Initialisiert eine Verifizierungsoperation, wobei die Daten von der Signatur wiederhergestellt werden.
C_VerifyRecover Nicht zutreffend Nicht zutreffend Verifiziert eine Signatur für einteilige Daten, wobei die Daten von der Signatur wiederhergestellt werden.
Nicht zutreffend m_VerifySingle VerifySingle IBM-Erweiterung, vom Standard abweichende Erweiterung, Kombination von 'VerifyInit' und 'Verify'. Signiert Daten oder verarbeitet sie mit MAC in einem Durchgang, mit einem einzigen Aufruf, ohne einen temporären Digest-Status aufzubauen. Gibt keinen Status an den Host zurück, nur das Verifizierungsergebnis.
C_DigestEncryptUpdate Nicht zutreffend Nicht zutreffend Setzt simultane mehrteilige Digest- und Verschlüsselungsoperationen fort.
C_DecryptDigestUpdate Nicht zutreffend Nicht zutreffend Setzt simultane mehrteilige Entschlüsselungs- und Digest-Operationen fort.
C_SignEncryptUpdate Nicht zutreffend Nicht zutreffend Setzt simultane mehrteilige Signatur- und Verschlüsselungsoperationen fort.
C_DecryptVerifyUpdate Nicht zutreffend Nicht zutreffend Setzt simultane mehrteilige Entschlüsselungs- und Verifizierungsoperationen fort.
C_GenerateKey* m_GenerateKey GenerateKey Generiert einen geheimen Schlüssel.
C_GenerateKeyPair* m_GenerateKeyPair GenerateKeyPair Generiert ein Paar aus öffentlichem Schlüssel und privatem Schlüssel.
C_WrapKey* m_WrapKey WrapKey Führt Wrapping für einen Schlüssel aus (verschlüsselt einen Schlüssel).
C_UnwrapKey* m_UnwrapKey UnwrapKey Führt Unwrapping für einen Schlüssel aus (entschlüsselt einen Schlüssel).
Nicht zutreffend Nicht zutreffend RewrapKeyBlob Überträgt die Eigentümerschaft an einem BLOB, das durch den aktuellen Masterschlüssel gesteuert wird, auf den neuen Masterschlüssel, wenn der neue Masterschlüssel festgeschrieben ist. Diese Funktion ist ein spezieller Verwaltungsbefehl, der nur von GREP11 unterstützt wird.
C_DeriveKey* m_DeriveKey DeriveKey Leitet einen Schlüssel aus einem Basisschlüssel ab.
C_SeedRandom Nicht zutreffend Nicht zutreffend Fügt Seedmaterial zum Zufallsgenerator hinzu.
C_GenerateRandom* m_GenerateRandom GenerateRandom Generiert Zufallsdaten. Die Länge der Zufallsdaten darf nicht null sein und der Zeiger, der auf die Zufallsdatenposition verweist, darf nicht NULL sein. Die maximale Länge der Zufallsdaten, die angefordert werden können, beträgt 1 Million Byte.
C_GetFunctionStatus Nicht zutreffend Nicht zutreffend Traditionelle Funktion, die immer CKR_FUNCTION_NOT_PARALLEL zurückgibt.
C_CancelFunction Nicht zutreffend Nicht zutreffend Traditionelle Funktion, die immer CKR_FUNCTION_NOT_PARALLEL zurückgibt.

Unterstützte Mechanismen

Als Mechanismus wird ein Prozess zur Implementierung einer Verschlüsselungsoperation bezeichnet. Dies kann je nach Firmware-Version auf der Verschlüsselungskarte variieren. In der folgenden Tabelle werden die Mechanismen, die gegenwärtig unterstützt werden, und ihre Beziehung zu allgemeinen GREP11-Funktionskategorie gezeigt.

Tabelle 2. Beschreibt die unterstützten GREP11-Mechanismen
Funktionsgruppe Unterstützte Mechanismen
Verschlüsseln und entschlüsseln CKM_RSA_PKCS1, CKM_RSA_PKCS_OAEP1, CKM_AES_ECB, CKM_AES_CBC, CKM_AES_CBC_PAD, CKM_DES3_ECB, CKM_DES3_CBC, CKM_DES3_CBC_PAD
Signieren und prüfen CKM_RSA_PKCSCS1, CKM_RSA_PKCS_PSS1, CKM_RSA_X9_311, CKM_SHA1_RSA_PKCS, CKM_SHA256_RSA_PKCS, CKM_SHA224_RSA_PKCS, CKM_SHA384_RSA_PKCS, CKM_SHA512_RSA_PKCS, CKM_SHA1_RSA_PKCS_PSS, CKM_SHA224_RSA_PKCS_PSS, CKM_SHA256_RSA_PKCS_PSS, CKM_SHA384_RSA_PKCS_PSS, CKM_SHA512_RSA_PKCS_PSS, CKM_SHA1_RSA_X9_31, CKM-DSA1, CKM_DSA_SHA1, CKM_ECDSA1, CKM_ECDSA_SHA1, CKM_ECDSA_SHA224, CKM_ECDSA_SHA256, CKM_ECDSA_SHA384, CKM_ECDSA_SHA512, CKM_SHA1_HMAC, CKM_SHA256_HMAC, CKM_SHA384_HMAC, CKM_SHA512_HMAC CKM_SHA512_224_HMAC, CKM_SHA512_256_HMAC, CKM_IBM_ED25519_SHA5124, CKM_IBM_ECDSA_OTHER2, CKM_IBM_DILITHIUM3
Digest CKM_SHA_1, CKM_SHA224, CKM_SHA256, CKM_SHA384, CKM_SHA512, CKM_SHA512_224, CKM_SHA512_256
Schlüssel oder Schlüsselpaar generieren 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
Key-Wrapping durchführen und aufheben CKM_RSA_PKCS, CKM_RSA_PKCS_OAEP, CKM_AES_ECB, CKM_AES_CBC, CKM_AES_CBC_PAD, CKM_DES3_ECB, CKM_DES3_CBC, CKM_DES3_CBC_PAD
Ableiten CKM_ECDH1_DERIVE, CKM_DH_PKCS_DERIVE, CKM_DES3_ECB_ENCRYPT_DATA, CKM_SHA1_KEY_DERIVATION, CKM_SHA224_KEY_DERIVATION, CKM_SHA256_KEY_DERIVATION, CKM_SHA384_KEY_DERIVATION, CKM_SHA512_KEY_DERIVATION, CKM_IBM_BTC_DERIVE

1: Dieser Mechanismus unterstützt nur einteilige Operationen, die keine der GREP11-Update-Funktionen wie EncryptUpdate, DecryptUpdate und DigestUpdate verwenden können.

2: Dieser Mechanismus ist nur bei GREP11 SignSingle- und VerifySingle-Operationen verfügbar.

3: Dieser Mechanismus wird von der Verschlüsselungskarte IBM 4768 nicht unterstützt und ist nicht für SignUpdate- und VerifyUpdate-Operationen verfügbar.

4: Dieser Mechanismus unterstützt einteilige Operationen (SignInit, Sign, VerifyInit, Verify), SignSingle und VerifySingle.

Unterstützte Attribute und Schlüsseltypen

GREP11-Attribute definieren Objektmerkmale, die festlegen, wie ein Objekt verwendet werden kann und wie auf das Objekt zugegriffen werden kann. In der folgenden Tabelle werden die unterstützten Attribute und ihre Beziehungen zu den verschiedenen unterstützten Schlüsseltypen gezeigt.

Tabelle 3. Beschreibt die unterstützten Attribute
Attribut Beschreibung Unterstützte Schlüsseltypen
CKA_CHECK_VALUE Die Kontrollsumme des Schlüssels AES-Schlüssel, DES-Schlüssel
CKA_COPYABLAGE Wenn CKA_TRUE festgelegt ist, kann das Objekt mit der Funktion PKCS#11 C_CopyObject kopiert werden. Private EC-Schlüssel, öffentliche EC-Schlüssel, private RSA-Schlüssel, öffentliche RSA-Schlüssel, private DH-Schlüssel, öffentliche DH-Schlüssel, private DSA-Schlüssel, öffentliche DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_DECRYPT CK_TRUE, wenn der Schlüssel eine Entschlüsselung unterstützt. Private EC-Schlüssel, private RSA-Schlüssel, private DH-Schlüssel, private DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_DERIVE CK_TRUE, wenn der Schlüssel die Schlüsselableitung unterstützt (d. h., andere Schlüssel können aus diesem Schlüssel abgeleitet werden). Der Standardwert lautet CK_FALSE. Private EC-Schlüssel, öffentliche EC-Schlüssel, private RSA-Schlüssel, öffentliche RSA-Schlüssel, private DH-Schlüssel, öffentliche DH-Schlüssel, private DSA-Schlüssel, öffentliche DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_EC_PARAMS (CKA_ECDSA_PARAMS) DER-Codierung eines ANSI X9.62-Parameterwerts. Private EC-Schlüssel, öffentliche EC-Schlüssel
CKA_ENCRYPT CK_TRUE, wenn der Schlüssel eine Verschlüsselung unterstützt. Öffentliche EC-Schlüssel, öffentliche RSA-Schlüssel, öffentliche DH-Schlüssel, öffentliche DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_EXTRACTABLE CK_TRUE, wenn der Schlüssel extrahierbar ist und gewrappt werden kann. Private EC-Schlüssel, private RSA-Schlüssel, private DH-Schlüssel, private DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_IBM_PQC_PARAMS Unterstützung von Parametern für Post-Quantum-Verschlüsselungsmechanismen. Im Fall des Dilithium-Mechanismus CKM_IBM_DILITHIUM wird eine Marshaling-Objekt-ID (OID) bereitgestellt, welche die Stärke des zu verwendenden Dilithium-Algorithmus darstellt. Derzeit wird nur die Stärke von Dilithium 4 round 2 unterstützt. Dilithium-Schlüssel
CKA_KEY_TYPE Typ des Schlüssels. Private EC-Schlüssel, öffentliche EC-Schlüssel, private RSA-Schlüssel, öffentliche RSA-Schlüssel, private DH-Schlüssel, öffentliche DH-Schlüssel, private DSA-Schlüssel, öffentliche DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_LOCAL CK_TRUE nur, wenn der Schlüssel lokal (im Token) mit einem C_GenerateKey- oder C_GenerateKeyPair-Aufruf generiert oder mit einem C_CopyObject-Aufruf als Kopie eines Schlüssels erstellt wurde, dessen CKA_LOCAL-Attribut auf CK_TRUE gesetzt ist. Private EC-Schlüssel, öffentliche EC-Schlüssel, private RSA-Schlüssel, öffentliche RSA-Schlüssel, private DH-Schlüssel, öffentliche DH-Schlüssel, private DSA-Schlüssel, öffentliche DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_MODIFIABLE Wird auf CK_TRUE gesetzt, wenn das Objekt geändert werden kann Private EC-Schlüssel, öffentliche EC-Schlüssel, private RSA-Schlüssel, öffentliche RSA-Schlüssel, private DH-Schlüssel, öffentliche DH-Schlüssel, private DSA-Schlüssel, öffentliche DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_MODULUS_BITS Länge in Bits des Modulus n. Öffentliche RSA-Schlüssel
CKA_PUBLIC_EXPONENT Öffentlicher Exponent e. Private RSA-Schlüssel
CKA_PUBLIC_KEY_INFO DER-Codierung von SubjectPublicKeyInfo für den öffentlichen Schlüssel. Der Wert wird aus den zugrunde liegenden Daten des öffentlichen Schlüssels abgeleitet und ist standardmäßig leer. Öffentliche RSA-Schlüssel, öffentliche EC-Schlüssel
CKA_SIGN CK_TRUE, wenn der Schlüssel Signaturen unterstützt, wobei die Signatur ein Anhang an die Daten ist. Private EC-Schlüssel, private RSA-Schlüssel, private DH-Schlüssel, private DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_TRUSTED Das Zertifikat oder der Schlüssel kann für die Anwendung, die erstellt wurde, als vertrauenswürdig eingestuft werden. Öffentliche EC-Schlüssel, öffentliche RSA-Schlüssel, öffentliche DH-Schlüssel, öffentliche DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_UNWRAP CK_TRUE, wenn der Schlüssel das Aufheben des Wrappings unterstützt (d. h., er kann verwendet werden, um das Wrapping anderer Schlüssel aufzuheben). Private EC-Schlüssel, private RSA-Schlüssel, private DH-Schlüssel, private DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_VALUE_LEN Länge in Byte des Schlüsselwerts. AES-Schlüssel
CKA_VERIFY CK_TRUE, wenn der Schlüssel Verifizierung unterstützt, wobei die Signatur ein Anhang an die Daten ist. Öffentliche EC-Schlüssel, öffentliche RSA-Schlüssel, öffentliche DH-Schlüssel, öffentliche DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_WRAP CK_TRUE, wenn der Schlüssel Wrapping unterstützt (d. h., er kann zum Wrappen anderer Schlüssel verwendet werden). Öffentliche EC-Schlüssel, öffentliche RSA-Schlüssel, öffentliche DH-Schlüssel, öffentliche DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel
CKA_WRAP_WITH_TRUSTED CK_TRUE, wenn das Wrapping des Schlüssels nur mit einem Wrapping-Schlüssel durchgeführt werden kann, für den CKA_TRUSTED auf CK_TRUE gesetzt ist. Der Standardwert lautet CK_FALSE. Private EC-Schlüssel, private RSA-Schlüssel, private DH-Schlüssel, private DSA-Schlüssel, AES-Schlüssel, DES-Schlüssel, generische Schlüssel

Unterstützte Kurven

Die EP11-Bibliothek unterstützt eine begrenzte Zahl von Kurventypen für bestimmte Mechanismen. In der folgenden Tabelle werden die Namen der unterstützten Kurven für verschiedene Mechanismen aufgelistet. Die Zahl im Kurvennamen bezeichnet die unterstützte vorbereitete Bitanzahl.

Unterstützte Kurven für die Generierung von EC-Schlüsseln (Elliptic Curve)

Der Mechanismus CKM_EC_KEY_PAIR_GEN wird unterstützt, wenn Sie die Funktion GenerateKeyPair aufrufen, um EC-Schlüssel (Elliptic Curve) zu generieren. Die Parameter für Kurvennamen müssen als Objekt-IDs (OIDs) mit CKA_EC_PARAMS angegeben werden. Sie können die OID abrufen, indem Sie den Kurvennamen im OID-Repositorysuchen.

Tabelle 4. Unterstützte Kurventypen für die Generierung von EC-Schlüsseln
GREP11-Mechanismus Unterstützte Kurventypen Unterstützte Kurvennamen
CKM_EC_KEY_PAIR_GEN NIST-Kurven(National Institute of Standards and Technology)
  • P-192, auch als secp192r1 und prime192v1 bezeichnet.
  • P-224, auch als secp224r1 bezeichnet.
  • P-256, auch als secp256r1 und prime256v1 bezeichnet.
  • P-384, auch als secp384r1 bezeichnet.
  • P-521, auch als secp521r bezeichnet.
CKM_EC_KEY_PAIR_GEN Kurven des regulären Hirnpools(BP)
  • BP-160R, auch als brainpoolP160r1 bezeichnet.
  • BP-192R, auch als brainpoolP192r1 bezeichnet.
  • BP-224R, auch als brainpoolP224r1 bezeichnet.
  • BP-256R, auch als brainpoolP256r1 bezeichnet.
  • BP-320R, auch als brainpoolP320r1 bezeichnet.
  • BP-384R, auch als brainpoolP384r1 bezeichnet.
  • BP-512R, auch als brainpoolP512r1 bezeichnet.
CKM_EC_KEY_PAIR_GEN Twisted Brain-Poolkurven(BP-Kurven)
  • BP-160T, auch als brainpoolP160t1 bezeichnet.
  • BP-192T, auch als brainpoolP192t1 bezeichnet.
  • BP-224T, auch als brainpoolP224t1 bezeichnet.
  • BP-256T, auch als brainpoolP256t1 bezeichnet.
  • BP-320T, auch als brainpoolP320t1 bezeichnet.
  • BP-384T, auch als brainpoolP384t1 bezeichnet.
  • BP-512T, auch als brainpoolP512t1 bezeichnet.
CKM_EC_KEY_PAIR_GEN SEC-Kurven(Standards for Efficient Cryptography)
  • secp256k1
CKM_EC_KEY_PAIR_GEN Kantenkurven
  • Ed25519

Unterstützte Kurven für die Verschlüsselung digitaler Assets und die Generierung von Signaturen

Die folgenden Kurven werden für Mechanismen unterstützt, die sich auf digitale Assets und digitale Signaturen beziehen.

Tabelle 5. Unterstützte Kurventypen für die Verschlüsselung digitaler Assets und Signaturen
Standard und Schema GREP11-Mechanismus Unterstützte Kurventypen Unterstützte Kurvennamen
BIP32/BIP44 CKM_IBM_BTC_ABLEITEN SEC-Kurven(Standards for Efficient Cryptography)
  • secp256k1
SLIP10 CKM_IBM_BTC_ABLEITEN NIST-Kurven(National Institute of Standards and Technology)
  • P-256, auch bekannt als secp256r1 und prime256v1
SLIP10 CKM_IBM_BTC_ABLEITEN SEC-Kurven(Standards for Efficient Cryptography)
  • secp256k1
SLIP10 CKM_IBM_BTC_ABLEITEN Kantenkurven
  • Ed25519
EdDSA CKM_IBM_ED25519_SHA512 Kantenkurven
  • Ed25519
Schnorr CKM_IBM_ECDSA_ANDERE SEC-Kurven(Standards for Efficient Cryptography)
  • secp256k1
Schnorr CKM_IBM_ECDSA_ANDERE NIST-Kurven(National Institute of Standards and Technology)
  • P-256, auch bekannt als secp256r1 und prime256v1
Schnorr CKM_IBM_ECDSA_ANDERE Kurven des regulären Hirnpools(BP)
  • BP-256R, auch bekannt als brainpoolP256r1
Schnorr CKM_IBM_ECDSA_ANDERE Twisted Brain-Poolkurven(BP-Kurven)
  • BP-256T, auch bekannt als brainpoolP256t1
Schnorr ECSG_IBM_ECSDSA_S256
  • secp256r1
  • secp256k1
  • BP-256R, auch bekannt als brainpoolP256r1
  • BP-256T, auch bekannt als brainpoolP256t1
Schnorr-Zilliqa ECSG_IBM_ECSDSA_COMPR_MULTI
  • secp256r1
  • secp256k1
  • BP-256R, auch bekannt als brainpoolP256r1
  • BP-256T, auch bekannt als brainpoolP256t1

Verschlüsselungsoperationen mit GREP11-Funktionen durchführen

Sie können Verschlüsselungsoperationen durch Aufrufen von GREP11-Funktionen durchführen, die auf Grundlage der EP11-Implementierung der PKCS #11-Spezifikation definiert sind. Die folgenden Funktionsbeschreibungen werden basierend auf der PKCS #11 -Spezifikationerstellt, mit Hinweisen speziell für EP11. Alle Parameterdefinitionen liegen im Originalformat von EP11 vor. Weitere Informationen zu EP11finden Sie unter Enterprise PKCS #11(EP11)Library structure.

EP11-Funktionsparameter werden den Protokollpuffertypen zugeordnet, die in den folgenden Funktionen zu finden sind. Weitere Informationen zu Protokollpuffertypen finden Sie in Google Developers.

Da es sich bei der EP11-Bibliothek um eine Untergruppe der PKCS #11-API-Bibliothek handelt und GREP11-Funktionen Varianten der entsprechenden EP11-Funktionen sind, werden die entsprechenden Funktionen von EP11 und PKCS #11 zu Ihrer Referenz auch in den GREP11-Funktionstabellen aufgelistet.

GREP11 unterstützt jede Programmiersprache mit einer gRPC-Bibliothek. In der aktuellen Phase sind in der API-Referenz nur Code-Snippets oder Beispiele für Golang und JavaScript enthalten. Der Inhalt wird in späteren Phasen erweitert. Die Code-Snippets basieren auf den folgenden externen GitHub-Repositorys, die vollständige Beispiele für die Verwendung der GREP11-API zur Verfügung stellen. Einige der Code-Snippets verweisen auf Helper-Funktionen in den Beispielrepositorys.

Unterstützte Verschlüsselungsalgorithmen

Sie können die folgenden Funktionen verwenden, um Verschlüsselungsalgorithmen oder Mechanismen abzurufen, die von GREP11 unterstützt werden. Durch diese Informationen werden die jeweiligen Mechanismen erläutert, die beim Aufrufen einer Funktion festgelegt werden können. Die vollständige Liste der unterstützten Mechanismen finden Sie außerdem unter Nach Funktionsgruppen kategorisierte Mechanismen.

GetMechanismList

Die Funktion GetMechanismList ruft eine Liste von Mechanismustypen ab, die von einem Token unterstützt werden.

Beschreibung Bindet an die EP11-Funktion m_GetMechanismList, die eine Implementierung der PKCS #11-Funktion C_GetMechanismList ist.
Parameter
    message GetMechanismListRequest {
    }
    message GetMechanismListResponse {
      repeated uint64 Mechs = 2;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung Implementierung der PKCS #11-Funktion C_GetMechanismList.
Parameter
    CK_RV m_GetMechanismList (
      CK_SLOT_ID slot,
      CK_MECHANISM_TYPE_PTR mechs, CK_ULONG_PTR mechslen,
      Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_GetMechanismList. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_GetMechanismList wird verwendet, um eine Liste der von einem Token unterstützten Mechanismen abzurufen. SlotID ist die ID des Slots des Tokens. pulCount verweist auf die Position, die die Anzahl der Mechanismen empfängt.

Es gibt zwei Möglichkeiten für eine Anwendung, C_GetMechanismList aufzurufen:

  1. Wenn pMechanismList den Wert NULL_PTR hat, gibt C_GetMechanismList ausschließlich (in *pulCount) die Anzahl der Mechanismen zurück, jedoch nicht die Liste der Mechanismen. Der Inhalt von *pulCount bei der Eingabe für C_GetMechanismList hat in diesem Fall keine Bedeutung, und der Aufruf gibt den Wert CKR_OK zurück.
  2. Wenn pMechanismList nicht NULL_PTR lautet, muss *pulCount die Größe (in Bezug auf CK_MECHANISM_TYPE-Elemente) des Puffers enthalten, auf den pMechanismList verweist. Wenn dieser Puffer groß genug ist, um die Liste der Mechanismen zu speichern, wird die Liste darin zurückgegeben und CKR_OK wird zurückgegeben. Wenn nicht, gibt der Aufruf von C_GetMechanismList den Wert CKR_BUFFER_TOO_SMALL zurück. In beiden Fällen wird der Wert für * pulCount so festgelegt, dass die Anzahl der Mechanismen gespeichert wird.

Da C_GetMechanismList keinen eigenen Speicherplatz zuordnet, ruft eine Anwendung häufig C_GetMechanismList zweimal auf. Dieses Verhalten ist jedoch keineswegs erforderlich.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_GetMechanismList)(
      CK_SLOT_ID slotID,
      CK_MECHANISM_TYPE_PTR pMechanismList,
      CK_ULONG_PTR pulCount
    );
    
Rückgabewerte CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_SLOT_ID_INVALID, CKR_TOKEN_NOT_PRESENT, CKR_TOKEN_NOT_RECOGNIZED, CKR_ARGUMENTS_BAD.

Code-Snippets

  • Golang-Code-Snippet

    GetMechanismListRequest := &pb.GetMechanismListRequest {
    }
    
    GetMechanismListResponse, err := cryptoClient.GetMechanismList(context.Background(), GetMechanismListRequest)
    
  • JavaScript-Code-Snippet

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

GetMechanismInfo

Die Funktion GetMechanismInfo ruft Informationen zu einem bestimmten Verfahren ab.

Beschreibung Bindet an die EP11-Funktion m_GetMechanismInfo, die eine Implementierung der PKCS #11-Funktion C_GetMechanismInfo ist.
Parameter
    message GetMechanismInfoRequest {
      uint64 Mech = 2;
    }
    message GetMechanismInfoResponse {
      MechanismInfo MechInfo = 3;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung Implementierung der PKCS #11-Funktion C_GetMechanismInfo.
Parameter
    CK_RV m_GetMechanismInfo (
      CK_SLOT_ID slot,
      CK_MECHANISM_TYPE mech,
      CK_MECHANISM_INFO_PTR mechInfo,
      Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_GetMechanismInfo. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

Informationen zu C_GetMechanismInfo ruft Informationen zu einem bestimmten Mechanismus ab, der von einem Token unterstützt wird. slotID ist die ID des Tokenslots; type ist der Typ des Mechanismus, pInfo verweist auf die Position, an der die Mechanismusinformationen empfangen werden.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_GetMechanismInfo)(
      CK_SLOT_ID slotID,
      CK_MECHANISM_TYPE type,
      CK_MECHANISM_INFO_PTR pInfo
    );
    
Rückgabewerte CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_MECHANISM_INVALID, CKR_OK, CKR_SLOT_ID_INVALID, CKR_TOKEN_NOT_PRESENT, CKR_TOKEN_NOT_RECOGNIZED, CKR_ARGUMENTS_BAD.

Code-Snippets

  • Golang-Code-Snippet

    GetMechanismInfoRequest := &pb.GetMechanismInfoRequest {
        Mech: ep11.CKM_RSA_PKCS,
    }
    
    GetMechanismInfoResponse, err := cryptoClient.GetMechanismInfo(context.Background(), GetMechanismInfoRequest)
    
  • JavaScript-Code-Snippet

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

Schlüssel generieren und ableiten

GREP11 stellt die folgenden Funktionen zum Generieren von symmetrischen und asymmetrischen Verschlüsselungsschlüsseln bereit. Basierend auf dem Mechanismus und der angegebenen Schlüssellänge können Sie verschiedene Schlüsseltypen für verschiedene Verwendungszwecke generieren. Sie können darüber hinaus einen Schlüssel aus einem Basisschlüssel ableiten, um Schlüssel in längere Schlüssel zu strecken oder Schlüssel eines erforderlichen Formats zu erhalten.

GenerateKey

Die Funktion GenerateKey generiert einen geheimen Schlüssel für symmetrische Verschlüsselung.

Beschreibung Bindet an die EP11-Funktion m_GenerateKey, die eine Implementierung der PKCS #11-Funktion C_GenerateKey ist.
Parameter
    message GenerateKeyRequest {
      Mechanism Mech = 1;
      map<uint64,AttributeValue> Template = 6;
    }
    message GenerateKeyResponse {
      bytes KeyBytes = 4;
      bytes CheckSum = 5;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_GenerateKey.

TDES-Schlüssel werden mit der richtigen Parität generiert, die vom Host nicht beobachtet werden kann. Dies ist jedoch für die ordnungsgemäße Interoperabilität erforderlich: andere PKCS #11-Implementierungen müssen die DES-Schlüssel mit Paritätsproblemen zurückweisen.

Wird ein Objekt an eine Sitzung gebunden, muss (pin, plen) bei der Anmeldung bei dieser Sitzung von Login zurückgegeben worden sein. Bei der Beibehaltung von pin NULL wird ein öffentliches Objekt erstellt, das nicht an eine Anmeldesitzung gebunden ist.

(key, klen) gibt den Schlüssel-BLOB zurück. (csum, clen) enthält die Kontrollsumme des Schlüssels, d. h. die höchstwertigen Byte eines durch den Schlüssel verschlüsselten Blocks mit allen Nullen. NULL clen ist möglich, beispielsweise für symmetrische Schlüsselmechanismen ohne CKA_CHECK_VALUE-Parameter (z. B. RC4).

ptempl wird nur verwendet, wenn die Schlüssellänge (d. h. das Attribut CKA_VALUE_LEN) von dem Mechanismus benötigt wird. Wenn der Mechanismus implizit die Schlüsselgröße angibt, wird die Größe von ptempl nicht überprüft.

Beim Generieren von DSA-und DH-Parametern wird (csum, clen) ignoriert, sodass nur Parameterstrukturen generiert werden.

DSA, DH-Parameter (CKM_DSA_PARAMETER_GEN): Übergeben die Modulusbitanzahl im Teil CKA_PRIME_BITS der Attribute. Die "P,Q,G"-Struktur wird als Klartext ausgegeben (also nicht als BLOB).

Das BLOB pin wurde von Login ausgegeben.

Der PKCS #11-Schlüssel phKey ist keinem EP11-Parameter zugeordnet. (Die Hostbibliothek muss den Schlüssel mit Wrapping an die Kennung binden.)

Parameter
    CK_RV m_GenerateKey (
      CK_MECHANISM_PTR mech,
      CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
      const unsigned char *pin, size_t pinlen,
      Zeichen ohne Vorzeichen * key, size_t * keylen,
      Zeichen ohne Vorzeichen *checkSum, size_t *checkSumlen,
      Ziel 'target_t'
      );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_GenerateKey. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_GenerateKey generiert einen geheimen Schlüssel oder eine Gruppe von Domänenparametern und erstellt ein neues Objekt. hSession ist die Kennung der Sitzung, pMechanism verweist auf den Generierungsmechanismus, pTemplate verweist auf die Vorlage für den neuen Schlüssel oder die neue Gruppe von Domänenparametern, ulCount ist die Anzahl der Attribute in der Vorlage, phKey verweist auf die Position, an der die Kennung des neuen Schlüssels oder der neuen Gruppe von Domänenparametern empfangen wird.

Wenn der Generierungsmechanismus für die Generierung von Domänenparametern vorgesehen ist, hat das Attribut CKA_CLASS den Wert CKO_DOMAIN_PARAMETERS, andernfalls den Wert CKO_SECRET_KEY.

Da der Typ des Schlüssels oder der Domänenparameter, die generiert werden sollen, implizit im Generierungsmechanismus vorhanden ist, muss die Vorlage keinen Schlüsseltyp bereitstellen. Wenn ein Schlüsseltyp angegeben wird, der mit dem Generierungsmechanismus nicht konsistent ist, schlägt C_GenerateKey fehl und gibt den Fehlercode CKR_TEMPLATE_INCONSISTENT zurück. Das Attribut CKA_CLASS wird auf dieselbe Weise behandelt.

Wenn ein Aufruf von C_DeriveKey die dafür bereitgestellten Vorlagen nicht unterstützen kann, schlägt er fehl und wird ohne die Erstellung eines Schlüsselobjekts zurückgegeben.

Das Objekt, das durch einen erfolgreichen Aufruf von C_GenerateKey erstellt wurde, hat das Attribut CKA_LOCAL auf CK_TRUE gesetzt.

Parameter
    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
      );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_ATTRIBUTE_READ_ONLY, CKR_ATTRIBUTE_TYPE_INVALID, CKR_ATTRIBUTE_VALUE_INVALID, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_CURVE_NOT_SUPPORTED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SESSION_READ_ONLY, CKR_TEMPLATE_INCOMPLETE, CKR_TEMPLATE_INCONSISTENT, CKR_TOKEN_WRITE_PROTECTED, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

    // 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)
    
  • JavaScript-Code-Snippet

    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

Die Funktion GenerateKeyPair generiert einen öffentlichen Schlüssel und ein privates Schlüsselpaar.

Beschreibung Bindet an die EP11-Funktion m_GenerateKeyPair, die eine Implementierung der PKCS #11-Funktion C_GenerateKeyPair ist.
Parameter
    message GenerateKeyPairRequest {
      Mechanism Mech = 1;
      map<uint64,AttributeValue> PrivKeyTemplate = 7;
      map<uint64,AttributeValue> PubKeyTemplate = 8;
      }
    message GenerateKeyPairResponse {
      bytes PrivKeyBytes = 5;
      bytes PubKeyBytes = 6;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_GenerateKeyPair.

KeyPair-Parameter werden aus den Parametern pmech, ppublic und pprivate abgerufen. Bei RSA-Schlüssel gibt ppublic die Modulusgröße an.

Im FIPS-Modus werden nur RSA-Modulverwendungen von 1024 + 256 n Bit unterstützt (Ganzzahl n). Im Nicht-FIPS-Modus lassen sich Schlüssel mit einer beliebigen Anzahl von Bit innerhalb der Grenzwerte in der Parameterliste des Mechanismus generieren.

Der öffentliche Schlüssel ist als Standard-SPKI (Subject Public Key Information) formatiert, die von den meisten Bibliotheken gelesen werden kann. Seine Integrität wird durch eine transportschlüsselspezifische MAC-Operation geschützt, die nicht zur eigentlichen SPKI gehört. Die Generierung von DSA-Parametern gibt eine Nicht-SPKI-Struktur im Feld für den öffentlichen Schlüssel zurück.

Wird ein Objekt an eine Sitzung gebunden, muss (pin, plen) bei der Anmeldung bei dieser Sitzung von Login zurückgegeben worden sein. Wenn pin NULL belassen wird, wird ein öffentliches Objekt erstellt, das die Anmeldesitzung überdauert.

Gibt einen privatem Schlüssel mit Wrapping an (key, klen) und einen öffentlichen Schlüssel als mit MAC verarbeitete ASN.1/DER-Struktur in (pubkey, pklen) zurück.

Die folgenden unterstützten Parameterkombinationen mit speziellen Hinweisen gehen über die PKCS #11-Dokumentation hinaus:

RSA-Schlüssel weisen öffentliche Exponenten unter 17 (0x11) zurück. Kontrollpunkte können das akzeptierte Minimum weiter einschränken. Der Fermat4-Exponent, 0x10001, wird von einem speziellen Kontrollpunkt gesteuert, der die Einschränkungen für öffentliche Exponenten von FIPS 186-3 erfüllt (Abschnitt B.3.1).

EC-Schlüssel (CKM_EC_KEY_PAIR_GEN): Kurvenparameter können als OIDs oder symbolische Namen (unsere namedCurve-Variante) angegeben werden. Unterstützte symbolische Namen sind "P-nnn" für NIST-Kurven (nnn ist eine unterstützte Bitanzahl für Primzahlen, 192-521), "BP-nnnR" für reguläre BP-Kurven. (Namen müssen als ASCII-Zeichenfolgen angegeben werden, ohne Nullen am Ende.)

DSA-Schlüssel (CKM_DSA_KEY_PAIR_GEN): Übergeben die "P,Q,G"-Struktur als Attribut CKA_IBM_STRUCT_PARAMS öffentlicher Attribute. P,Q,G-Parameter können nicht einzeln durch reguläre PKCS #11-Parameter übergeben werden, sie müssen zu einer Struktur kombiniert werden.

DH-Schlüssel (CKM_DH_PKCS_KEY_PAIR_GEN): Übergeben die "P,G"-Struktur als Attribut CKA_IBM_STRUCT_PARAMS öffentlicher Attribute. P,G-Parameter können nicht einzeln durch reguläre PKCS #11-Parameter übergeben werden, sie müssen zu einer Struktur kombiniert werden. Verwenden Sie zur Auswahl einer Bitanzahl privater Schlüssel (X) das Attribut XCP_U32_VALUE_BITS. Wenn es nicht vorhanden ist oder explizit der Wert 0 angegeben wird, wird die Bitanzahl auf Basis der P-Bitanzahl ausgewählt.

Die Verwendung des Sitzungsstatus (Anmeldestatus) ersetzt die Standardverwendung von Sitzungen. Die Zuordnung erfolgt außerhalb des Bibliotheksbereichs.

Das BLOB pin wurde von Login ausgegeben.

Der PKCS #11-Schlüssel hSession ist keinem EP11-Parameter zugeordnet. (Der Aufruf wird keiner Sitzung direkt zugeordnet.)

Der PKCS #11-Schlüssel phPublicKey ist keinem EP11-Parameter zugeordnet. (Die Hostbibliothek muss den öffentlichen Schlüssel (SPKI) der Kennung zuordnen.)

Der PKCS #11-Schlüssel phPrivateKey ist keinem EP11-Parameter zugeordnet. (Die Hostbibliothek muss den privaten Schlüssel der Kennung zuordnen.)

Parameter
    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,
      Zeichen ohne Vorzeichen *privKey, size_t *privKeylen
      unsigned char *pubKey, size_t *pubKeylen,
      Ziel 'target_t'
      );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_GenerateKeyPair. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_GenerateKeyPair generiert ein Paar aus öffentlichem und privatem Schlüssel und erstellt neue Schlüsselobjekte. hSession ist die Kennung der Sitzung, pMechanism verweist auf den Mechanismus zur Schlüsselgenerierung, pPublicKeyTemplate verweist auf die Schablone für den öffentlichen Schlüssel, ulPublicKeyAttributeCount ist die Anzahl der Attribute in der Schablone für öffentliche Schlüssel, pPrivateKeyTemplate verweist auf die Schablone für den privaten Schlüssel, ulPrivateKeyAttributeCount ist die Anzahl der Attribute in der Schablone für private Schlüssel; phPublicKey verweist auf die Position, welche die Kennung des neuen öffentlichen Schlüssels erhält, phPrivateKey verweist auf die Position, an der die Kennung des neuen privaten Schlüssels empfangen wird.

Da die Typen der zu generierenden Schlüssel implizit im Mechanismus für die Schlüsselpaargenerierung enthalten sind, müssen die Vorlagen keine Schlüsseltypen bereitstellen. Wenn eine der Vorlagen einen Schlüsseltyp angibt, der nicht mit dem Schlüsselgenerierungsmechanismus konsistent ist, schlägt C_GenerateKeyPair fehl und gibt den Fehlercode CKR_TEMPLATE_INCONSISTENT zurück. Das Attribut CKA_CLASS wird ähnlich behandelt.

Wenn ein Aufruf von C_GenerateKeyPair die dafür bereitgestellten Vorlagen nicht unterstützen kann, schlägt er fehl und wird ohne die Erstellung von Schlüsselobjekten zurückgegeben.

Ein Aufruf von C_GenerateKeyPair erstellt nie nur einen Schlüssel und kehrt dann zurück. Ein Aufruf kann fehlschlagen und keine Schlüssel erstellen; oder er kann erfolgreich sein und ein Paar aus öffentlichem und privatem Schlüssel erstellen.

Für die Schlüsselobjekte, die durch einen erfolgreichen Aufruf von C_GenerateKeyPair erstellt wurden, ist das Attribut CKA_LOCAL auf CK_TRUE gesetzt.

Beachten Sie die Reihenfolge der Argumente für C_GenerateKeyPair genau. Die beiden letzten Argumente haben nicht dieselbe Reihenfolge wie im ursprünglichen Cryptoki-Dokument Version 1.0. Unglücklicherweise stiftete die Reihenfolge dieser beiden Argumente Verwirrung.

Parameter
    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
      );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_ATTRIBUTE_READ_ONLY, CKR_ATTRIBUTE_TYPE_INVALID, CKR_ATTRIBUTE_VALUE_INVALID, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_CURVE_NOT_SUPPORTED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_DOMAIN_PARAMS_INVALID, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SESSION_READ_ONLY, CKR_TEMPLATE_INCOMPLETE, CKR_TEMPLATE_INCONSISTENT, CKR_TOKEN_WRITE_PROTECTED, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

    // 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)
    
  • JavaScript-Code-Snippet

    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

Die Funktion DeriveKey leitet einen Schlüssel aus einem Basisschlüssel ab.

Beschreibung Bindet an die EP11-Funktion m_DeriveKey, die eine Implementierung der PKCS #11-Funktion C_DeriveKey ist.
Parameter
    message DeriveKeyRequest {
        Mechanism Mech = 1;
        bytes BaseKey = 3;
        bytes Data = 4;
        map<uint64,AttributeValue> Template = 8;
    }
    message DeriveKeyResponse {
        bytes NewKeyBytes = 6;
        bytes CheckSum = 7;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_DeriveKey.

Das BLOB basekey,bklen muss aus dem PKCS #11-Parameter hBaseKey zugeordnet werden.

Der PKCS #11-Schlüssel hSession ist keinem EP11-Parameter zugeordnet. (Der Aufruf wird keiner Sitzung direkt zugeordnet.)

Der PKCS #11-Schlüssel phKey ist keinem EP11-Parameter zugeordnet. (Die Hostbibliothek muss den zurückgegebenen Schlüssel an die Kennung binden.)

Parameter
    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,
        Zeichen ohne Vorzeichen *checkSum, size_t *checkSumlen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_DeriveKey. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_DeriveKey leitet einen Schlüssel aus einem Basisschlüssel ab und erstellt ein neues Schlüsselobjekt. hSession ist die Kennung der Sitzung, pMechanism verweist auf eine Struktur, welche die Schlüsselableitungsstruktur angibt, hBaseKey ist die Kennung des Basisschlüssels, pTemplate verweist auf die Vorlage für den neuen Schlüssel, ulAttributeCount ist die Anzahl der Attribute in der Vorlage und phKey verweist auf die Position, an der die Kennung des abgeleiteten Schlüssels empfangen wird.

Die Werte der Attribute CKA_SENSITIVE, CKA_ALWAYS_SENSITIVE, CKA_EXTRACTABLE und KA_NEVER_EXTRACTABLE für den Basisschlüssel wirken sich auf die Werte aus, die diese Attribute für den neu abgeleiteten Schlüssel enthalten können. Informationen zu Einschränkungen dieses Typs finden Sie in der Beschreibung der einzelnen Schlüsselableitungsmechanismen in Abschnitt 5.16.2 der PKCS #11-API-Spezifikation.

Wenn ein Aufruf von C_DeriveKey die dafür bereitgestellte Vorlage nicht unterstützen kann, schlägt er fehl und wird ohne die Erstellung eines Schlüsselobjekts zurückgegeben.

Das Attribut CKA_LOCAL des Schlüsselobjekts, das mit einem erfolgreichen Aufruf von C_DeriveKey erstellt wird, wird auf CK_FALSE eingestellt.

Parameter
    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
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_ATTRIBUTE_READ_ONLY, CKR_ATTRIBUTE_TYPE_INVALID, CKR_ATTRIBUTE_VALUE_INVALID, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_CURVE_NOT_SUPPORTED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_DOMAIN_PARAMS_INVALID, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENT, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SESSION_READ_ONLY, CKR_TEMPLATE_INCOMPLETE, CKR_TEMPLATE_INCONSISTENT, CKR_TOKEN_WRITE_PROTECTED, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

    // 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)
    
  • JavaScript-Code-Snippet

    //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);
    });
    }
    

Schlüssel schützen

Sie können einen Schlüssel schützen, indem Sie ein Wrapping des Schlüssels durchführen und den Schlüssel anschließend entschlüsseln, indem Sie die Funktion zum Aufheben des Wrappings (Unwrapping) aufrufen.

WrapKey

Die Funktion WrapKey führt ein Wrapping eines Schlüssels aus (verschlüsselt einen Schlüssel).

Beschreibung Bindet an die EP11-Funktion m_WrapKey, die eine Implementierung der PKCS #11-Funktion C_WrapKey ist.
Parameter
    message WrapKeyRequest {
        bytes Key = 1;
        bytes KeK = 2;
        bytes MacKey = 3;
        Mechanism Mech = 4;
    }
    message WrapKeyResponse {
        bytes Wrapped = 5;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung Implementierung der PKCS #11-Funktion C_WrapKey.
Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_WrapKey. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_WrapKey schließt einen privaten oder geheimen Schlüssel ein (d. h. verschlüsselt). hSession ist die Kennung der Sitzung, pMechanism verweist auf den Wrapping-Mechanismus, hWrappingKey ist die Kennung des Wrapping-Schlüssels, hKey ist die Kennung des Schlüssels, der eingeschlossen werden soll, pWrappedKey verweist auf die Position, an der der eingeschlossene Schlüssel empfangen wird, und pulWrappedKeyLen verweist auf die Position, an der die Länge des eingeschlossenen Schlüssels empfangen wird.

C_WrapKey verwendet die in Abschnitt 5.2 der PKCS #11-API-Spezifikation beschriebene Konvention für die Ausgabeerstellung.

Das Attribut CKA_WRAP des Wrapping-Schlüssels, das angibt, ob der Schlüssel die Wrapping-Operation unterstützt, muss CK_TRUE sein. Das Attribut CKA_EXTRACTABLE des Schlüssels, für den Wrapping ausgeführt werden soll, muss ebenfalls CK_TRUE sein.

Wenn das Wrapping für den entsprechenden Schlüssel aufgrund einer tokenspezifischen Ursache nicht ausgeführt werden kann, obwohl sein Attribut CKA_EXTRACTABLE auf CK_TRUE eingestellt wurde, schlägt C_WrapKey mit dem Fehlercode CKR_KEY_NOT_WRAPPABLE fehl. Wenn das Wrapping des Schlüssels mit dem angegebenen Wrapping-Schlüssel und -Mechanismus nur aufgrund seiner Länge nicht möglich ist, schlägt C_WrapKey mit dem Fehlercode CKR_KEY_SIZE_RANGE fehl.

C_WrapKey kann in den folgenden Situationen verwendet werden:

  • Zum Wrapping eines geheimen Schlüssels mit einem öffentlichen Schlüssel, der die Verschlüsselung und Entschlüsselung unterstützt.
  • Zum Wrapping eines geheimen Schlüssels mit einem beliebigen anderen geheimen Schlüssel. Dabei ist auf die Schlüsselgröße und die Stärke des Mechanismus zu achten. Andernfalls lässt das Token die Operation möglicherweise nicht zu.
  • Zum Wrapping eines privaten Schlüssels mit einem beliebigen geheimen Schlüssel.

Token variieren in Bezug darauf, für welche Schlüsseltypen das Wrapping mit welchen Mechanismen durchgeführt werden kann.

Um die Wrapping-Schlüssel zu partitionieren, sodass sie nur eine Teilmenge der extrahierbaren Schlüssel einschließen können, kann das Attribut CKA_WRAP_TEMPLATE im Wrapping-Schlüssel verwendet werden, um eine Attributgruppe anzugeben, die mit den Attributen des Schlüssels verglichen werden kann, der eingeschlossen werden soll. Wenn alle Attribute den C_FindObject-Regeln zum Attributabgleich entsprechen, wird die Wrapping-Operation fortgesetzt. Der Wert dieses Attributs ist eine Attributvorlage, und die Größe ist die Anzahl der Elemente in der Vorlage, multipliziert mit der Größe von CK_ATTRIBUTE. Wenn dieses Attribut nicht angegeben wird, ist jede beliebige Vorlage akzeptabel. Wenn ein Attribut nicht vorhanden ist, wird es nicht überprüft. Weist ein Attribut bei einem Wrapping-Versuch für einen Schlüssel eine fehlende Übereinstimmung auf, gibt die Funktion CKR_KEY_HANDLE_INVALID zurück.

Parameter
    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
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_HANDLE_INVALID, CKR_KEY_NOT_WRAPPABLE, CKR_KEY_SIZE_RANGE, CKR_KEY_UNEXTRACTABLE, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN, CKR_WRAPPING_KEY_HANDLE_INVALID, CKR_WRAPPING_KEY_SIZE_RANGE, CKR_WRAPPING_KEY_TYPE_INCONSISTENT.

Code-Snippets

  • Golang-Code-Snippet

    WrapKeyRequest := &pb.WrapKeyRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_RSA_PKCS},
        KeK:  GenerateKeyPairResponse.PubKeyBytes,
        Key:  GenerateKeyResponse.KeyBytes,
    }
    
    WrapKeyResponse, err := cryptoClient.WrapKey(context.Background(), WrapKeyRequest)
    
  • JavaScript-Code-Snippet

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

UnwrapKey

Die Funktion UnwrapKey hebt das Wrapping (die Verschlüsselung) eines Schlüssels auf.

Beschreibung Bindet an die EP11-Funktion m_UnwrapKey, die eine Implementierung der PKCS #11-Funktion C_UnwrapKey ist.
Parameter
    message UnwrapKeyRequest {
        bytes Wrapped = 1;
        bytes KeK = 2;
        bytes MacKey = 3;
        Mechanism Mech = 5;
        map<uint64,AttributeValue> Template = 9;
    }
    message UnwrapKeyResponse {
        bytes UnwrappedBytes = 7;
        bytes CheckSum = 8;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_UnwrapKey.

uwmech gibt den Verschlüsselungsmechanismus an, der zum Entschlüsseln eingeschlossener Daten verwendet wird. ptempl ist eine Schlüssel(-paar) -Parameterliste, die angibt, wie die nicht eingeschlossenen Daten in einen neuen Schlüssel umgewandelt werden sollen (muss CKA_KEY_TYPE enthalten).

Das generierte Objekt wird unter (unwrapped, uwlen) als BLOB zurückgegeben. Symmetrische Schlüssel geben ihre Schlüsselkontrollsumme (3 Byte) unter (csum, cslen)zurück. Objekte mit öffentlichem Schlüssel geben ihren öffentlichen Schlüssel als SPKI in (csum, cslen) zurück. Auf beide Formate folgt ein 4-Byte-Big-Endian-Wert, der die Bitanzahl des Schlüssels mit aufgehobenem Wrapping codiert.

Wenn eine SPKI in eine MACed SPKI umgesetzt wird, muss CKM_IBM_TRANSPORTKEY als Unwrapping-Mechanismus verwendet werden. Dieser Modus stellt die unformatierte SPKI als Daten mit Wrapping bereit und ignoriert den KEK.

UnwrapKey erzeugt paritätsbereinigte DES-Schlüssel (innerhalb der Blobs), toleriert jedoch Eingaben mit unzulässiger Parität.

Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_UnwrapKey. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_UnwrapKey hebt das Wrapping eines eingeschlossenen Schlüssels auf (d. h. entschlüsselt ihn) und erstellt einen neuen privaten Schlüssel oder ein neues Objekt für einen geheimen Schlüssel. hSession ist die Kennung der Sitzung, pMechanism verweist auf den Unwrapping-Mechanismus, hUnwrappingKey ist die Kennung des Unwrapping-Schlüssels, pWrappedKey verweist auf den eingeschlossenen Schlüssel, ulWrappedKeyLen ist die Länge des eingeschlossenen Schlüssels, pTemplate verweist auf die Vorlage für den neuen Schlüssel, ulAttributeCount ist die Anzahl der Attribute in der Vorlage, phKey verweist auf die Position, an der die Kennung des wiederhergestellten Schlüssels empfangen wird.

Das Attribut CKA_UNWRAP des Schlüssels zum Aufheben des Wrappings, das angibt, ob der Schlüssel die Unwrapping-Operation unterstützt, muss CK_TRUE sein.

Das Attribut CKA_ALWAYS_SENSITIVE des neuen Schlüssels wird auf CK_FALSE eingestellt und das Attribut CKA_NEVER_EXTRACTABLE auf CK_FALSE. Das Attribut CKA_EXTRACTABLE wird standardmäßig auf CK_TRUE eingestellt.

Einige Mechanismen können Änderungen vornehmen oder dies versuchen. Der Inhalt der pMechanism-Struktur zu dem Zeitpunkt, an dem das Wrapping des Schlüssels aufgehoben wird.

Wenn ein Aufruf von C_UnwrapKey die dafür bereitgestellte Vorlage nicht unterstützen kann, schlägt er fehl und wird ohne die Erstellung eines Schlüsselobjekts zurückgegeben.

Das Attribut CKA_LOCAL des Schlüsselobjekts, das mit einem erfolgreichen Aufruf von C_UnwrapKey erstellt wird, wird auf CK_FALSE eingestellt.

Um die Unwrapping-Schlüssel zu partitionieren, sodass sie das Wrapping nur für eine Untergruppe von Schlüsseln aufheben können, kann das Attribut CKA_UNWRAP_TEMPLATE auf den Unwrapping-Schlüssel angewendet werden, um eine Attributgruppe anzugeben, die zu den Attributen des Schlüssels hinzugefügt wird, für den das Wrapping aufgehoben werden soll. Wenn es keinen Konflikt zwischen den Attributen und der vom Benutzer bereitgestellten Attributvorlage in pTemplate gibt, wird die Operation zum Aufheben des Wrappings fortgesetzt. Der Wert dieses Attributs ist eine Attributvorlage, und die Größe ist die Anzahl der Elemente in der Vorlage, multipliziert mit der Größe von CK_ATTRIBUTE. Wenn dieses Attribut im Unwrapping-Schlüssel nicht vorhanden ist, werden keine zusätzlichen Attribute hinzugefügt. Wenn bei dem Versuch, das Wrapping eines Schlüssels aufzuheben, ein Attributkonflikt auftritt, gibt die Funktion SHALL den Wert CKR_TEMPLATE_INKONSISTENT zurück.

Parameter
    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
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_ATTRIBUTE_READ_ONLY, CKR_ATTRIBUTE_TYPE_INVALID, CKR_ATTRIBUTE_VALUE_INVALID, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_CURVE_NOT_SUPPORTED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_DOMAIN_PARAMS_INVALID, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SESSION_READ_ONLY, CKR_TEMPLATE_INCOMPLETE, CKR_TEMPLATE_INCONSISTENT, CKR_TOKEN_WRITE_PROTECTED, CKR_UNWRAPPING_KEY_HANDLE_INVALID, CKR_UNWRAPPING_KEY_SIZE_RANGE, CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT, CKR_USER_NOT_LOGGED_IN, CKR_WRAPPED_KEY_INVALID, CKR_WRAPPED_KEY_LEN_RANGE.

Code-Snippets

  • Golang-Code-Snippet

    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)
    
  • JavaScript-Code-Snippet

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

RewrapKeyBlob

Die Funktion RewrapKeyBlob führt eine erneute Verschlüsselung von großen Binärobjekten (BLOBs) mit dem neuen festgeschriebenen Masterschlüssel aus, der in dem HSM enthalten ist. Schlüssel, die erneut verschlüsselt werden, können erst verwendet werden, nachdem das HSM die Verarbeitung des neuen festgeschriebenen Masterschlüssels abgeschlossen ('Finalize') hat.

Diese Funktion ist ein spezieller Verwaltungsbefehl, der nur von GREP11 unterstützt wird. Für RewrapKeyBlob gibt es keine entsprechende EP11-Funktion oder PKCS #11-Funktion.

Beschreibung Überträgt die Eigentümerschaft an einem BLOB, das durch den aktuellen Masterschlüssel gesteuert wird, auf den neuen Masterschlüssel, wenn der neue Masterschlüssel festgeschrieben ist.
Parameter
    message RewrapKeyBlobRequest {
    	bytes WrappedKey = 1;
    }
    message RewrapKeyBlobResponse {
    	bytes RewrappedKey = 1;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.

Code-Snippets

  • Golang-Code-Snippet

    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)
    
  • JavaScript-Code-Snippet

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

Attribute für Schlüssel abrufen und ändern

Wenn Sie Schlüssel generieren oder Operationen an Schlüsseln durchführen, definieren Sie eine Attributvorlage als einen der Parameter. Sie können die Attribute für ein bestimmtes Schlüsselobjekt abrufen und einige der Attribute ändern, nachdem der Schlüssel erstellt wurde.

GetAttributeValue

Die Funktion GetAttributeValue ruft einen Attributwert eines Objekts ab.

Beschreibung Bindet an die EP11-Funktion m_GetAttributeValue, die eine Implementierung der PKCS #11-Funktion C_GetAttributeValue ist.
Parameter
    message GetAttributeValueRequest {
        bytes Object = 1;
        map<uint64,AttributeValue> Attributes = 3;
    }
    message GetAttributeValueResponse {
        map<uint64,AttributeValue> Attributes = 4;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_GetAttributeValue.

Benötigt keine Sitzungen (Teil eines BLOB) und stellt keine Sitzungen dar, verwendet daher nicht den Parameter hSession.

EP11 verwendet unkompliziertere Entschlüsselungsmethoden wie z. B. das Nummerieren tatsächlicher Werte anstelle generischerer Verfahren.

Parameter
    CK_RV m_GetAttributeValue (
        const unsigned char *object, size_t objectlen,
        CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_GetAttributeValue. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

Das Attribut c_GetAttributeValue ruft den Wert eines oder mehrerer Attribute eines Objekts ab. hSession ist die Kennung der Sitzung, hObject ist die Kennung des Objekts, pTemplate verweist auf eine Vorlage, die angibt, welche Attributwerte abgerufen werden sollen, und empfängt die Attributwerte, ulCount ist die Anzahl der Attribute in der Vorlage.

Für jedes Tripel (type, pValue, ulValueLen) in der Vorlage führt C_GetAttributeValue den folgenden Algorithmus aus:

  1. Wenn das angegebene Attribut (d. h. das durch das Typfeld angegebene Attribut) für das Objekt nicht angezeigt werden kann, weil das Objekt sensibel oder nicht extrahierbar ist, wird das Feld ulValueLen in diesem Tripel so geändert, dass es den Wert CK_UNAVAILABLE_INFORMATION enthält.
  2. Andernfalls, wenn der angegebene Wert für das Objekt ungültig ist (wenn das Objekt kein solches Attribut besitzt), wird das Feld ulValueLen in diesem Tripel so geändert, dass es den Wert CK_UNAVAILABLE_INFORMATION enthält.
  3. Andernfalls, wenn das Feld pValue den Wert NULL_PTR aufweist, wird das Feld ulValueLen so geändert, dass es die genaue Länge des angegebenen Attributs für das Objekt enthält.
  4. Andernfalls, wenn die in ulValueLen angegebene Länge groß genug ist, um den Wert des angegebenen Attributs für das Objekt zu enthalten, wird dieses Attribut in den Puffer unter pValue kopiert, und das Feld ulValueLenwird so geändert, dass es die genaue Länge des Attributs enthält.
  5. Andernfalls wird das Feld ulValueLen so geändert, dass es den Wert CK_UNAVAILABLE_INFORMATIONenthält.

Wenn Fall 1 auf eines der angeforderten Attribute zutrifft, muss der Aufruf den Wert CKR_ATTRIBUTE_SENSITIVEzurückgeben. Wenn Fall 2 auf eines der angeforderten Attribute zutrifft, muss der Aufruf den Wert CKR_ATTRIBUTE_TYPE_INVALIDzurückgeben. Wenn Fall 5 auf eines der angeforderten Attribute zutrifft, muss der Aufruf den Wert CKR_BUFFER_TOO_SMALLzurückgeben. Wenn mehrere dieser Fehlercodes zutreffen, kann Cryptoki wie üblich einen beliebigen dieser Fehlercodes zurückgeben. Nur wenn keiner von ihnen auf eines der angeforderten Attribute zutrifft, wird CKR_OK zurückgegeben.

Im besonderen Fall eines Attributs, dessen Wert ein Array aus Attributen darstellt, wie zum Beispiel CKA_WRAP_TEMPLATE, und das mit pValue ungleich NULL weitergegeben wird, lautet der pValue der Elemente innerhalb des Arrays NULL_PTR und ulValueLen der Elemente innerhalb des Arrays wird auf die erfordrliche Länge gesetzt. Wenn der Wert pValue von Elementen in dem Array nicht NULL_PTR ist, muss das Element ulValueLen von Attributen in dem Array den Speicherplatz angeben, auf den der entsprechende Wert pValue verweist und der mit pValue gefüllt wird, wenn der Speicherplatz ausreicht. Daher ist es wichtig, den Inhalt eines Puffers zu initialisieren, bevor C_GetAttributeValue aufgerufen wird, um einen solchen Array-Wert abzurufen. Wenn ein Wert für ulValueLen in dem Array nicht groß genug ist, wird er auf CK_UNAVAILABLE_INFORMATION festgelegt, und die Funktion gibt CKR_BUFFER_TOO_SMALL zurück, ebenso wie in dem Fall, dass ein Attribut im Argument pTemplate einen zu kleinen Wert für ulValueLen hat. Jedes Attribut, dessen Wert ein Array von Attributen ist, kann anhand der Gruppe CKF_ARRAY_ATTRIBUTE des Attributtyps identifiziert werden.

Die Fehlercodes CKR_ATTRIBUTE_SENSITIVE, CKR_ATTRIBUTE_TYPE_INVALID und CKR_BUFFER_TOO_SMALL bedeuten keine wirklichen Fehler für C_GetAttributeValue. Wenn ein Aufruf von C_GetAttributeValue einen dieser drei Werte zurückgibt, muss der Aufruf trotzdem jedes Attribut in der Vorlage verarbeitet haben, die an C_GetAttributeValue bereitgestellt wird. Jedes Attribut in der Vorlage, dessen Wert mit einem Aufruf von C_GetAttributeValue zurückgegeben werden kann, wird mit dem Aufruf von C_GetAttributeValue zurückgegeben.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_GetAttributeValue)(
        CK_SESSION_HANDLE hSession,
        CK_OBJECT_HANDLE hObject,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulCount
    );
    
Rückgabewerte 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.

Code-Snippets

  • Golang-Code-Snippet

    // 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)
    
  • JavaScript-Code-Snippet

    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

Die Funktion SetAttributeValue ändert einen Attributwert eines Objekts.

Beschreibung Bindet an die EP11-Funktion m_SetAttributeValue, die eine Implementierung der PKCS #11-Funktion C_SetAttributeValue ist.
Parameter
    message SetAttributeValueRequest {
        bytes Object = 1;
        map<uint64,AttributeValue> Attributes = 3;
    }
    message SetAttributeValueResponse {
        bytes Object = 1;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_SetAttributeValue.

Attributliste: siehe _GetAttrValue

Derzeit sendet Ep11 nur boolesche Attribute. Alle anderen Attribute werden vom Host verarbeitet (und Ep11 modifiziert keine Arrays wie WRAP_TEMPLATE).

Benötigt keine Sitzungen (Teil eines BLOB) und stellt keine Sitzungen dar, verwendet daher nicht den PKCS #11-Parameter hSession.

Parameter
    CK_RV m_SetAttributeValue (
        unsigned char *object, size_t objectlen,
        CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_SetAttributeValue. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_SetAttributeValue ändert den Wert eines oder mehrerer Attribute eines Objekts. hSession ist die Kennung der Sitzung, hObject ist die Kennung des Objekts; pTemplate verweist auf eine Vorlage, die angibt, welche Attributwerte geändert werden sollen, sowie ihre neuen Werte; ulCount ist die Anzahl der Attribute in der Vorlage.

Bestimmte Objekte können nicht geändert werden. Wenn Sie C_SetAttributeValue für solche Objekte aufrufen, wird der Fehlercode CKR_ACTION_PROHIBITED angezeigt. Eine Anwendung kann mithilfe des Attributs CKA_MODIFIABLE des Objekts bestimmen, ob ein Objekt geändert werden kann.

Nur Sitzungsobjekte können während einer schreibgeschützten Sitzung geändert werden.

Die Vorlage kann neue Werte für alle Attribute des Objekts angeben, die geändert werden können. Wenn die Schablone einen Wert für ein Attribut angibt, das mit anderen vorhandenen Attributen des Objekts nicht kompatibel ist, schlägt der Aufruf mit dem Rückkehrcode CKR_TEMPLATE_INCONSISTENT fehl.

Nicht alle Attribute können geändert werden. Weitere Informationen hierzu finden Sie im Abschnitt 4.1.2 der PKCS #11-API-Spezifikation.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_SetAttributeValue)(
        CK_SESSION_HANDLE hSession,
        CK_OBJECT_HANDLE hObject,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulCount
    );
    
Rückgabewerte CKR_ACTION_PROHIBITED, CKR_ARGUMENTS_BAD, CKR_ATTRIBUTE_READ_ONLY, CKR_ATTRIBUTE_TYPE_INVALID, CKR_ATTRIBUTE_VALUE_INVALID, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OBJECT_HANDLE_INVALID, CKR_OK, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SESSION_READ_ONLY, CKR_TEMPLATE_INCONSISTENT, CKR_TOKEN_WRITE_PROTECTED, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

    // 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)
    
  • JavaScript-Code-Snippet

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

Zufallsdaten generieren

Sie können Zufallsdaten hoher Qualität, wie zum Beispiel Initialisierungswerte (IV), PINs und Kennwörter zur Verwendung in Verschlüsselungsoperationen generieren.

GenerateRandom

Die Funktion GenerateRandom generiert Zufallsdaten. Stellen Sie bei Verwendung dieser Funktion sicher, dass Sie die Länge der Zufallsdaten nicht auf null setzen und den Zeiger, der auf die Postion der Zufallsdaten verweist, nicht auf NULL setzen.

Beschreibung Bindet an die EP11-Funktion m_GenerateRandom, die eine Implementierung der PKCS #11-Funktion C_GenerateRandom ist.
Parameter
    message GenerateRandomRequest {
        uint64 Len = 1;
    }
    message GenerateRandomResponse {
        bytes Rnd = 1;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_GenerateRandom.

GenerateRandom ist äquivalent zu der ursprünglichen PKCS #11-Funktion. Intern wird eine durch die Hardware ausgelöste Entropie über einen FIPS-konformen DRNG (ANSI X9.31/ISO 18031, je nach Clic-Version) übertragen.

Die Hostbibliothek könnte Zufallszahlen generieren, ohne sie an das Back-End zu senden, wenn die entsprechende Funktionalität auf dem Host verfügbar wäre. Dies wird in der aktuellen Implementierung nicht gemacht.

Diese Funktion unterstützt keine Größenabfrage.

Parameter
    CK_RV m_GenerateRandom (
        CK_BYTE_PTR rnd, CK_ULONG rndlen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_GenerateRandom. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung C_GenerateRandom generiert Zufallsdaten oder Pseudozufallsdaten. hSession ist die Sitzungskennung, pRandomData verweist auf die Position, an der die Zufallsdaten empfangen werden, und ulRandomLen ist die Länge der zu generierenden Zufallsdaten oder Pseudozufallsdaten in Byte.
Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_GenerateRandom)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pRandomData,
        CK_ULONG ulRandomLen
    );
    
Rückgabewerte CKR_ARGUMENTS_SCHLECHT, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_ACTIVE, CKR_RANDOM_NO_RNG, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

    GenerateRandomRequest := &pb.GenerateRandomRequest {
      Len: 1024,
    }
    
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(), GenerateRandomRequest)
    
  • JavaScript-Code-Snippet

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

Daten verschlüsseln und entschlüsseln

Durch Angabe des Verschlüsselungsmechanismus können Sie Funktionen zur symmetrischen oder asymmetrische Ver- und Entschlüsselung ausführen. Möglicherweise müssen Sie eine Reihe von Unterfunktionen aufrufen, um Daten zu verschlüsseln oder zu entschlüsseln. Zum Beispiel setzt sich die mehrteilige Datenverschlüsselungsoperation aus den Teiloperationen EncryptInit, EncryptUpdate und EncryptFinal zusammen.

EncryptInit

Die Funktion EncryptInit initialisiert eine Verschlüsselungsoperation. Sie müssen als Erstes diese Funktion aufrufen, um eine Verschlüsselung durchzuführen.

Beschreibung Bindet an die EP11-Funktion m_EncryptInit, die eine Implementierung der PKCS #11-Funktion C_EncryptInit ist.
Parameter
    message EncryptInitRequest {
        Mechanism Mech = 2;
        bytes Key = 3;
    }
    message EncryptInitResponse {
        bytes State = 1;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_EncryptInit.

Das BLOB (key, klen) kann ein Objekt mit öffentlichem Schlüssel oder ein BLOB mit geheimem Schlüssel sein. Der Schlüsseltyp muss mit pmech konsistent sein.

Bei Mechanismen mit öffentlichem Schlüssel muss (key, klen) eine SPKI enthalten. Dieses SPKI verfügt über einen Integritätsschutz mit einem MAC-Schlüssel, der von GenerateKeyPair zurückgegeben wird (alternativ auch UnwrapKey). Der Verschlüsselungsstatus wird ohne Sitzungseinschränkungen erstellt.

Bei Mechanismen für geheime Schlüssel übernimmt der Verschlüsselungsstatus die Einschränkungen für die Objektsitzung aus (key, klen).

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden.

(key, klen) muss ein Schlüssel-BLOB sein.

Parameter
    CK_RV m_EncryptInit (
        unsigned char * state, size_t * statelen,
        CK_MECHANISM_PTR mech,
        const unsigned char *key, size_t keylen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_EncryptInit. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_EncryptInit initialisiert eine Verschlüsselungsoperation. hSession ist die Kennung der Sitzung, pMechanism verweist auf den Verschlüsselungsmechanismus, hKey ist die Kennung des Verschlüsselungsschlüssels.

Das Attribut CKA_ENCRYPT des Verschlüsselungsschlüssels, das angibt, ob der Schlüssel die Verschlüsselung unterstützt, muss CK_TRUE sein.

Nach dem Anwendungsaufruf von C_EncryptInit kann die Anwendung entweder C_Encrypt aufrufen, um Daten in einem einzigen Teil zu verschlüsseln, oder sie kann C_EncryptUpdate null Mal oder mehrmals aufrufen, gefolgt von C_EncryptFinal, um Daten in mehreren Teilen zu verschlüsseln. Die Verschlüsselungsoperation ist so lange aktiv, bis die Anwendung den endgültigen Abschnitt mit verschlüsseltem Text mit einem Aufruf an C_Encrypt oder C_EncryptFinal abruft. Zur Verarbeitung weiterer Daten (in einem oder mehreren Teilen) muss die Anwendung C_EncryptInit erneut aufrufen.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_EncryptInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
Rückgabewerte CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_PERMITTED, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENT, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

    // 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)
    
  • JavaScript-Code-Snippet

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

Verschlüsseln

Die Funktion Encrypt verschlüsselt einteilige Daten. Für eine einteilige Verschlüsselung brauchen die Teiloperationen EncryptUpdate und EncryptFinal nicht ausgeführt zu werden. Bevor Sie diese Funktion aufrufen, stellen Sie sicher, dass zuerst EncryptInit ausgeführt wird.

Beschreibung Bindet an die EP11-Funktion m_Encrypt, die eine Implementierung der PKCS #11-Funktion C_Encrypt ist.
Parameter
    message EncryptRequest {
        bytes State = 1;
        bytes Plain = 2;
    }
    message EncryptResponse {
        bytes Ciphered = 3;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_Encrypt.

Aktualisiert (state, slen) nicht.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden.

Das BLOB state wurde von EncryptInit ausgegeben.

Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_Encrypt. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_Encrypt verschlüsselt einteilige Daten. hSession ist die Kennung der Sitzung, pData verweist auf die Daten, ulDataLen ist die Länge der Daten in Byte, pEncryptedData verweist auf die Position, welche die verschlüsselten Daten empfängt, pulEncryptedDataLen verweist auf die Position, welche die Länge der verschlüsselten Daten in Byte enthält.

C_Encrypt verwendet die in Abschnitt 5.2 der PKCS #11-API-Spezifikation beschriebene Konvention für die Ausgabeerstellung.

Die Verschlüsselungsoperation muss mit C_EncryptInit initialisiert werden. Ein Aufruf von C_Encrypt beendet stets die aktive Verschlüsselungsoperation, es sei denn, es wird CKR_BUFFER_TOO_SMALL zurückgegeben oder es ist ein erfolgreicher Aufruf (d. h. ein Aufruf, der CKR_OK zurückgibt), um die Länge des Puffers zu bestimmen, der zum Speichern des verschlüsselten Texts erforderlich ist.

C_Encrypt kann nicht verwendet werden, um eine mehrteilige Operation zu beenden, und muss ohne intervenierende C_EncryptUpdate-Aufrufe nach C_EncryptInit aufgerufen werden.

Bei einigen Verschlüsselungsmechanismen haben die eingegebenen Klartextdaten bestimmte Längenbeschränkungen (entweder weil der Mechanismus nur relativ kurze Klartextteile verschlüsseln kann oder weil die Eingabedaten des Mechanismus aus einer ganzzahligen Anzahl von Blöcken bestehen müssen). Wenn diese Bedingungen nicht erfüllt sind, schlägt C_Encrypt mit dem Rückgabecode CKR_DATA_LEN_RANGE fehl.

Der Klartext und der verschlüsselte Text können sich an derselben Position befinden, d. h., es ist OK, wenn pData und pEncryptedData auf dieselbe Position verweisen.

Bei den meisten Mechanismen ist C_Encrypt äquivalent zu einer Folge von C_EncryptUpdate-Operationen mit anschließendem C_EncryptFinal.

Parameter
    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
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_INVALID, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID

Code-Snippets

  • Golang-Code-Snippet

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

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

EncryptUpdate

Die Funktion EncryptUpdate setzt eine mehrteilige Verschlüsselungsoperation fort. Bevor Sie diese Funktion aufrufen, stellen Sie sicher, dass zuerst EncryptInit ausgeführt wird.

Beschreibung Bindet an die EP11-Funktion m_EncryptUpdate, die eine Implementierung der PKCS #11-Funktion C_EncryptUpdate ist.
Parameter
    message EncryptUpdateRequest {
        bytes State = 1;
        bytes Plain = 2;
    }
    message EncryptUpdateResponse {
        bytes State = 1;
        bytes Ciphered = 3;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_EncryptUpdate.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden.

Das BLOB state wurde von EncryptInit ausgegeben.

Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_EncryptUpdate. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_EncryptUpdate setzt eine mehrteilige Verschlüsselungsoperation fort und verarbeitet einen anderen Datenabschnitt. hSession ist die Kennung der Sitzung, pPart verweist auf den Datenteil, ulPartLen ist die Länge des Datenteils, pEncryptedPart verweist auf die Position, die den verschlüsselten Datenteil empfängt, pulEncryptedPartLen verweist auf die Position, welche die Länge des verschlüsselten Datenteils in Byte enthält.

C_EncryptUpdate verwendet die in Abschnitt 5.2 der PKCS #11-API-Spezifikation beschriebene Konvention für die Ausgabeerstellung.

Die Verschlüsselungsoperation muss mit C_EncryptInit initialisiert werden. Diese Funktion kann beliebig oft hintereinander aufgerufen werden. Ein Aufruf von C_EncryptUpdate, der zu einem Fehler führt (mit Ausnahme von CKR_BUFFER_TOO_SMALL), beendet die aktuelle Verschlüsselungsoperation.

plaintext und ciphertext können sich an derselben Position befinden, d. h., es ist zulässig, wenn pPart und pEncryptedPart auf dieselbe Position verweisen.

Parameter
    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
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Code-Snippets

  • Golang-Code-Snippet

    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...)
    
  • JavaScript-Code-Snippet

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

EncryptFinal

Die Funktion EncryptFinal beendet eine mehrteilige Verschlüsselungsoperation.

Beschreibung Bindet an die EP11-Funktion m_EncryptFinal, die eine Implementierung der PKCS #11-Funktion C_EncryptFinal ist.
Parameter
    message EncryptFinalRequest {
        bytes State = 1;
    }
    message EncryptFinalResponse {
        bytes Ciphered = 2;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_EncryptFinal.

Aktualisiert (state, slen) nicht.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden.

Das BLOB state wurde von EncryptInit und EncryptUpdate ausgegeben.

Parameter
    CK_RV m_EncryptFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_EncryptFinal. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_EncryptFinal beendet eine mehrteilige Verschlüsselungsoperation. hSession ist die Kennung der Sitzung, pLastEncryptedPart verweist auf die Position, die den letzten verschlüsselten Datenabschnitt empfängt (falls vorhanden), pulLastEncryptedPartLen verweist auf die Position, welche die Länge des letzten verschlüsselten Datenabschnitts enthält.

C_EncryptFinal verwendet die in Abschnitt 5.2 von PKCS #11-API-Spezifikation beschriebene Konvention für die Ausgabeerstellung.

Die Verschlüsselungsoperation muss mit C_EncryptInit initialisiert werden. Ein Aufruf von C_EncryptFinal beendet immer die aktive Verschlüsselungsoperation, sofern er nicht CKR_BUFFER_TOO_SMALL zurückgibt oder ein erfolgreicher Aufruf ist (d. h. ein Aufruf, der CKR_OK zurückgibt), um die Länge des Puffers zu bestimmen, der für die Aufnahme des verschlüsselten Texts erforderlich ist.

Bei einigen mehrteiligen Verschlüsselungsmechanismen gelten für die Klartexteingabedaten bestimmte Längenbeschränkungen, da die Eingabedaten des Mechanismus aus einer ganzzahligen Anzahl von Blöcken bestehen müssen. Wenn diese Bedingungen nicht beachtet werden, schlägt C_EncryptFinal mit dem Rückkehrcode CKR_DATA_LEN_RANGE fehl.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_EncryptFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pLastEncryptedPart,
        CK_ULONG_PTR pulLastEncryptedPartLen
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Code-Snippets

  • Golang-Code-Snippet

    EncryptFinalRequest := &pb.EncryptFinalRequest {
        State: EncryptUpdateResponse.State,
    }
    
    EncryptFinalResponse, err := cryptoClient.EncryptFinal(context.Background(), EncryptFinalRequest)
    
  • JavaScript-Code-Snippet

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

EncryptSingle

Die Funktion EncryptSingle verarbeitet Daten in einem Durchgang mit einem Aufruf. Es gibt keinen Status an den Host zurück, nur die verschlüsselten Daten. Diese Funktion ist eine IBM EP11-Erweiterung zur PKCS #11-Standardspezifikation und stellt eine Kombination aus den Funktionen EncryptInit und Encrypt dar. Sie ermöglicht Ihnen die Durchführung einer Verschlüsselungsoperation durch nur einen Aufruf anstatt durch eine Reihe von Aufrufen.

Beschreibung Bindet an die EP11-Funktion m_EncryptSingle.
Parameter
    message EncryptSingleRequest {
        bytes Key = 1;
        Mechanism Mech = 2;
        bytes Plain = 3;
    }
    message EncryptSingleResponse {
        bytes Ciphered = 4;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Vom Standard abweichende Variante von Encrypt. Verarbeitet Daten in einem Durchgang, mit einem einzigen Aufruf. Gibt keinen Status an den Host zurück, nur die verschlüsselten Daten.

Das ist die bevorzugte Methode zur Verschlüsselung von Daten in einem Durchgang für XCP-sensitive Anwendungen. Sie ist funktional äquivalent zu EncryptInit mit sofort anschließendem Encrypt, erspart jedoch Umläufe und Wrapping/Unwrapping.

Wenn das Back-End residente Schlüssel unterstützt, kann es sich bei dem Schlüssel auch um eine Kennung mit residenten Schlüsseln handeln.

Siehe auch: Encrypt, EncryptInit, DecryptSingle.

Das BLOB key wurde von GenerateKey und UnwrapKey ausgegeben.

Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_Encrypt. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.

Code-Snippets

  • Golang-Code-Snippet

    // 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)
    
  • JavaScript-Code-Snippet

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

ReencryptSingle

Mit der Funktion ReencryptSingle können Sie Daten mit dem ursprünglichen Schlüssel entschlüsseln und anschließend die Rohdaten mit einem anderen Schlüssel in einem einzigen Aufruf innerhalb des Cloud-HSM verschlüsseln. Die für diese Operation verwendeten Schlüsseltypen können identisch oder unterschiedlich sein. Diese Funktion ist eine IBM EP11-Erweiterung zur PKCS #11-Standardspezifikation. Dieser einzelne Aufruf ist eine praktikable Option, wenn eine große Datenmenge mit verschiedenen Schlüsseln erneut verschlüsselt werden muss. So lässt sich vermeiden, eine Kombination aus den Funktionen DecryptSingle und EncryptSingle für jedes Datenelement auszuführen, das erneut verschlüsselt werden muss. Es gibt keinen Status an den Host zurück, nur die erneut verschlüsselten Daten.

Beschreibung Bindet an EP11 m_ReencryptSingle.
Parameter
    message ReencryptSingleRequest {
        bytes DecKey = 1;
        bytes EncKey = 2;
        Mechanism DecMech = 3;
        Mechanism EncMech = 4;
        bytes Ciphered = 5;
    }
    message ReencryptSingleResponse {
        bytes Reciphered = 6;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Vom Standard abweichende Variante von Encrypt. Verarbeitet Daten in einem Durchgang, mit einem einzigen Aufruf. Gibt keinen Status an den Host zurück, nur die erneut verschlüsselten Daten.

Entschlüsselt Daten mit dem Originalschlüssel und verschlüsselt dann die Rohdaten mit einem anderen Schlüssel innerhalb des Cloud-HSM.

Parameter
    CK_RV m_ReencryptSingle (
        const unsigned char * dkey, size_t dkeylen,
        const ohne Vorzeichen char * ekey, size_t ekeylen,
        CK_MECHANISM_PTR decmech,
        CK_MECHANISM_PTR encmech,
        CK_BYTE_PTR in, CK_ULONG inlen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_Encrypt und C_Decrypt. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.

Code-Snippets

  • Golang-Code-Snippet

    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)
    
  • JavaScript-Code-Snippet

    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

Die Funktion DecryptInit initialisiert eine Entschlüsselungsoperation. Sie müssen als Erstes diese Funktion aufrufen, um eine Entschlüsselung durchzuführen.

Beschreibung Bindet an die EP11-Funktion m_DecryptInit, die eine Implementierung der PKCS #11-Funktion C_DecryptInit ist.
Parameter
    message DecryptInitRequest {
        Mechanism Mech = 2;
        bytes Key = 3;
    }
    message DecryptInitResponse {
        bytes State = 1;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung Implementierung der PKCS #11-Funktion C_DecryptInit.
Parameter
    CK_RV m_DecryptInit (
        unsigned char * state, size_t * statelen,
        CK_MECHANISM_PTR mech,
        const unsigned char *key, size_t keylen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_DecryptInit. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_DecryptInit initialisiert eine Entschlüsselungsoperation. hSession ist die Kennung der Sitzung, pMechanism verweist auf den Entschlüsselungsmechanismus, hKey ist die Kennung des Entschlüsselungsschlüssels.

Das Attribut CKA_DECRYPT des Entschlüsselungsschlüssels, das angibt, ob der Schlüssel die Entschlüsselung unterstützt, muss CK_TRUE sein.

Nachdem die Anwendung C_DecryptInit aufgerufen hat, kann die Anwendung entweder C_Decrypt aufrufen, um Daten in einem einzelnen Abschnitt zu entschlüsseln, oder C_DecryptUpdate null oder mehrere Male aufrufen, gefolgt von C_DecryptFinal, um Daten in mehreren Abschnitten zu entschlüsseln. Die Entschlüsselungsoperation ist so lange aktiv, bis die Anwendung den endgültigen Abschnitt mit Klartext mit einem Aufruf an C_Decrypt oder C_DecryptFinal abruft. Zur Verarbeitung weiterer Daten (in einem oder mehreren Teilen) muss die Anwendung C_DecryptInit erneut aufrufen.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_DecryptInit)(
        K_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_PERMITTED, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENT, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

    // 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)
    
  • JavaScript-Code-Snippet

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

Entschlüsseln

Die Funktion Decrypt entschlüsselt Daten in einem einzelnen Teil. Für eine einteilige Verschlüsselung brauchen die Teiloperationen DecryptUpdate und DecryptFinal nicht ausgeführt zu werden. Bevor Sie diese Funktion aufrufen, stellen Sie sicher, dass zuerst DecryptInit ausgeführt wird.

Beschreibung Bindet an die EP11-Funktion m_Decrypt, die eine Implementierung der PKCS #11-Funktion C_Decrypt ist.
Parameter
    message DecryptRequest {
        bytes State = 1;
        bytes Ciphered = 2;
    }
    message DecryptResponse {
       bytes Plain = 3;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung von PKCS #11 C_Decrypt. (state, slen) wird nicht aktualisiert.

Das große Binärobjekt (BLOB) "state, slen" muss aus dem PKCS #11-Parameter hSession zugeordnet werden. Das BLOB "state" wurde von DecryptInit ausgegeben.

Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_Decrypt. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_Decrypt entschlüsselt verschlüsselte Daten in einem einzigen Teil.

  • hSession ist die Sitzungskennung.
  • pEncryptedData verweist auf die verschlüsselten Daten.
  • ulEncryptedDataLen ist die Länge der verschlüsselten Daten.
  • pData verweist auf die Position, die die wiederhergestellten Daten empfängt.
  • pulDataLen verweist auf die Position, die die Länge der wiederhergestellten Daten enthält.

C_Decrypt verwendet die in Abschnitt 5.2 der PKCS #11-API-Spezifikation beschriebene Konvention für die Ausgabeerstellung.

Die Entschlüsselungsoperation muss mit C_DecryptInit initialisiert werden. Ein Aufruf von C_Decrypt beendet immer die aktive Entschlüsselungsoperation, es sei denn, es wird CKR_BUFFER_TOO_SMALL zurückgegeben oder es handelt sich um einen erfolgreichen Aufruf mit der Rückgabe von CKR_OK , um die Länge des Puffers zu ermitteln, der zum Speichern des Klartexts erforderlich ist.

C_Decrypt kann nicht verwendet werden, um eine mehrteilige Operation zu beenden, und muss ohne intervenierende C_DecryptUpdate-Aufrufe nach C_DecryptInit aufgerufen werden.

Der verschlüsselte Text und der einfache Text können sich an derselben Stelle befinden. Dies bedeutet, dass es zulässig ist, wenn pEncryptedData und pData auf dieselbe Position verweisen.

Wenn die eingegebenen verschlüsselten Textdaten nicht entschlüsselt werden können, weil sie eine unzulässige Länge aufweisen, kann CKR_ENCRYPTED_DATA_INVALID oder CKR_ENCRYPTED_DATA_LEN_RANGE zurückgegeben werden.

Parameter
    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
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_ENCRYPTED_DATA_INVALID, CKR_ENCRYPTED_DATA_LEN_RANGE, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

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

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

DecryptUpdate

Die Funktion DecryptUpdate setzt eine mehrteilige Entschlüsselungsoperation fort. Bevor Sie diese Funktion aufrufen, stellen Sie sicher, dass zuerst DecryptInit ausgeführt wird.

Beschreibung Bindet an die EP11-Funktion m_DecryptUpdate, die eine Implementierung der PKCS #11-Funktion C_DecryptUpdate ist.
Parameter
    message DecryptUpdateRequest {
        bytes State = 1;
        bytes Ciphered = 2;
    }
    message DecryptUpdateResponse {
        bytes State = 1;
        bytes Plain = 3;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_DecryptUpdate.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden.

Das BLOB state wurde von DecryptInit ausgegeben.

Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_DecryptUpdate. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_DecryptUpdate setzt eine mehrteilige Entschlüsselungsoperation fort und verarbeitet einen weiteren verschlüsselten Datenabschnitt. hSession ist die Kennung der Sitzung, pEncryptedPart verweist auf den Abschnitt für verschlüsselte Daten, ulEncryptedPartLen ist die Länge des Abschnitts für verschlüsselte Daten, pPart verweist auf die Position, die den Abschnitt für wiederhergestellte Daten empfängt, pulPartLen verweist auf die Position, welche die Länge des Abschnitts für wiederhergestellte Daten enthält.

C_DecryptUpdate verwendet die in Abschnitt 5.2 der PKCS #11-API-Spezifikation beschriebene Konvention für die Ausgabeerstellung.

Die Verschlüsselungsoperation muss mit C_DecryptInit initialisiert werden. Diese Funktion kann beliebig oft hintereinander aufgerufen werden. Ein Aufruf von C_DecryptUpdate, der zu einem Fehler führt (mit Ausnahme von CKR_BUFFER_TOO_SMALL), beendet die aktuelle Entschlüsselungsoperation.

Der verschlüsselte Text und der einfache Text können sich an derselben Stelle befinden, d. h., es ist OK, wenn pEncryptedPart und pPart auf dieselbe Position verweisen.

Parameter
    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
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_PERMITTED, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENT, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

    // 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...)
    
  • JavaScript-Code-Snippet

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

DecryptFinal

Die Funktion DecryptFinal beendet eine mehrteilige Entschlüsselungsoperation.

Beschreibung Bindet an die EP11-Funktion m_DecryptFinal, die eine Implementierung der PKCS #11-Funktion C_DecryptFinal ist.
Parameter
    message DecryptFinalRequest {
        bytes State = 1;
    }
    message DecryptFinalResponse {
        bytes Plain = 2;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_DecryptFinal.

Aktualisiert (state, slen) nicht.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden.

Das BLOB state wurde von DecryptInit und DecryptUpdate ausgegeben.

Parameter
    CK_RV m_DecryptFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_DecryptFinal. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_DecryptFinal beendet eine mehrteilige Entschlüsselungsoperation. hSession ist die Kennung der Sitzung, pLastPart verweist auf die Position, die den zuletzt wiederhergestellten Datenteil empfängt (falls vorhanden), pulLastPartLen verweist auf die Position, welche die Länge des zuletzt wiederhergestellten Datenteils enthält.

C_DecryptFinal verwendet die in Abschnitt 5.2 der PKCS #11-API-Spezifikation beschriebene Konvention für die Ausgabeerstellung.

Die Verschlüsselungsoperation muss mit C_DecryptInit initialisiert werden. Ein Aufruf von C_DecryptFinal beendet immer die aktive Entschlüsselungsoperation, es sei denn, es gibt CKR_BUFFER_TOO_SMALL zurück oder es handelt sich um einen erfolgreichen Aufruf (d. h. einen Aufruf, der CKR_OKzurückgibt), um die Länge des Puffers zu ermitteln, der zum Speichern des Klartexts erforderlich ist.

Wenn die eingegebenen verschlüsselten Textdaten nicht entschlüsselt werden können, weil sie eine unzulässige Länge aufweisen, kann CKR_ENCRYPTED_DATA_INVALID oder CKR_ENCRYPTED_DATA_LEN_RANGE zurückgegeben werden.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_DecryptFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pLastPart,
        CK_ULONG_PTR pulLastPartLen
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_ENCRYPTED_DATA_INVALID, CKR_ENCRYPTED_DATA_LEN_RANGE, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

    DecryptFinalRequest := &pb.DecryptFinalRequest {
      State: DecrypUpdateResponse.State,
    }
    
    DecryptFinalResponse, err := cryptoClient.DecryptFinal(context.Background(), DecryptFinalRequest)
    
  • JavaScript-Code-Snippet

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

DecryptSingle

Die Funktion DecryptSingle verarbeitet Daten in einem Durchgang mit einem Aufruf. Es gibt keinen Status an den Host zurück, nur die entschlüsselten Daten. Diese Funktion ist eine IBM EP11-Erweiterung zur PKCS #11-Standardspezifikation und stellt eine Kombination aus den Funktionen DecryptInit und Decrypt dar. Sie ermöglicht Ihnen die Durchführung einer Entschlüsselungsoperation durch nur einen Aufruf anstatt durch eine Reihe von Aufrufen.

Beschreibung Bindet an EP11 m_DecryptSingle.
Parameter
    message DecryptSingleRequest {
        bytes Key = 1;
        Mechanism Mech = 2;
        bytes Ciphered = 3;
    }
    message DecryptSingleResponse {
        bytes Plain = 4;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Vom Standard abweichende Variante von Decrypt. Verarbeitet Daten in einem Durchgang, mit einem einzigen Aufruf. Gibt keinen Status an den Host zurück, nur die entschlüsselten Daten.

Das ist die bevorzugte Methode zur Verschlüsselung von Daten in einem Durchgang für XCP-sensitive Anwendungen. Sie ist funktional äquivalent zu DecryptInit mit sofort anschließendem Decrypt, erspart jedoch Umläufe und Wrapping/Unwrapping.

Wenn das Back-End residente Schlüssel unterstützt, kann es sich bei dem Schlüssel auch um eine Kennung mit residenten Schlüsseln handeln.

Siehe auch: Decrypt, DecryptInit, EncryptSingle.

Das BLOB key wurde von GenerateKey und UnwrapKey ausgegeben.

Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_Decrypt. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.

Code-Snippets

  • Golang-Code-Snippet

    // 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)
    
  • JavaScript-Code-Snippet

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

Daten signieren und prüfen

GREP11 stellt eine Gruppe von Funktionen bereit, mit denen Daten signiert sowie Signaturen oder Nachrichtenauthentifizierungscodes (MACs - Message Authentication Codes) geprüft werden können. Möglicherweise müssen Sie eine Reihe von Unterfunktionen aufrufen, um eine Signieroperation auszuführen. Zum Beispiel setzt sich die mehrteilige Datensignaturoperation aus den Teiloperationen SignInit, SignUpdate und SignFinal zusammen.

SignInit

Die Funktion SignInit initialisiert eine Signaturoperation. Sie müssen als Erstes diese Funktion aufrufen, um eine Signaturoperation durchzuführen.

Beschreibung Stellt eine Bindung zu EP11 m_SignInit her, einer Implementierung von PKCS #11 C_SignInit.
Parameter
    message SignInitRequest {
        Mechanism Mech = 2;
        bytes PrivKey = 3;
    }
    message SignInitResponse {
        bytes State = 1;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung Implementierung der PKCS #11-Funktion C_SignInit.
Parameter
    CK_RV m_SignInit (
        unsigned char * state, size_t * statelen,
        CK_MECHANISM_PTR mech,
        const unsigned char *privKey, size_t privKeylen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_Decrypt. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_SignInit initialisiert eine Signaturoperation, bei der die Signatur einen Anhang der Daten darstellt. hSession ist die Kennung der Sitzung, pMechanism verweist auf den Signaturmechanismus, hKey ist die Kennung des Signaturschlüssels.

Das Attribut CKA_SIGN des Signaturschlüssels, das angibt, ob der Schlüssel die Signatur unterstützt, muss CK_TRUE sein.

Nach dem Anwendungsaufruf von C_SignInit kann die Anwendung entweder C_Sign aufrufen, um Daten in einem einzigen Teil zu signieren, oder sie kann C_SignUpdate einmal oder mehrmals aufrufen, gefolgt von C_SignFinal, um Daten in mehreren Teilen zu signieren. Die Signaturoperation ist so lange aktiv, bis die Anwendung die Signatur mit einem Aufruf an C_Sign oder C_SignFinal abruft. Zur Verarbeitung weiterer Daten (in einem oder mehreren Teilen) muss die Anwendung C_SignInit erneut aufrufen.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_SignInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_PERMITTED, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENT, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

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

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

Unterzeichnen

Die Funktion Sign signiert einteilige Daten. Für eine einteilige Signatur Verifizierung brauchen die Teiloperationen SignUpdate und SignFinal nicht ausgeführt zu werden. Bevor Sie diese Funktion aufrufen, stellen Sie sicher, dass zuerst SignInit ausgeführt wird.

Beschreibung Bindet an die EP11-Funktion m_Sign, die eine Implementierung der PKCS #11-Funktion C_Sign ist.
Parameter
    message SignRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message SignResponse {
        bytes Signature = 3;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_Sign.

Aktualisiert (state, slen) nicht.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden. (Die Hostbibliothek muss die Sitzung dem gespeicherten Status zuordnen.)

Das BLOB state wurde von SignInit ausgegeben.

Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_Sign. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_Sign signiert Daten in einem einzelnen Abschnitt, wobei die Signatur ein Anhang der Daten ist. hSession ist die Kennung der Sitzung, pData verweist auf die Daten, ulDataLen ist die Länge der Daten, pSignature verweist auf die Position, an der die Signatur empfangen wird, pulSignatureLen verweist auf die Position, welche die Länge der Signatur enthält.

C_Sign verwendet die in Abschnitt 5.2 der PKCS #11-API-Spezifikation beschriebene Konvention für die Ausgabeerstellung.

Die Signieroperation muss mit C_SignInit initialisiert werden. Ein Aufruf von C_Sign beendet immer die aktive Signieroperation, sofern er nicht CKR_BUFFER_TOO_SMALL zurückgibt oder ein erfolgreicher Aufruf ist (d. h. ein Aufruf, der CKR_OK zurückgibt), um die Länge des Puffers zu bestimmen, der für die Aufnahme der Signatur erforderlich ist.

C_Sign kann nicht verwendet werden, um eine mehrteilige Operation zu beenden, und muss ohne intervenierende C_SignUpdate-Aufrufe nach C_SignInit aufgerufen werden.

Bei den meisten Mechanismen ist C_Sign äquivalent zu einer Folge von C_SignUpdate-Operationen mit anschließendem C_SignFinal.

Parameter
    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
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_INVALID, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN, CKR_FUNCTION_REJECTED.

Code-Snippets

  • Golang-Code-Snippet

    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)
    
  • JavaScript-Code-Snippet

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

SignUpdate

Die Funktion SignUpdate setzt eine mehrteilige Signaturoperation fort. Bevor Sie diese Funktion aufrufen, stellen Sie sicher, dass zuerst SignInit ausgeführt wird.

Beschreibung Bindet an die EP11-Funktion m_SignUpdate, die eine Implementierung der PKCS #11-Funktion C_SignUpdate ist.
Parameter
    message SignUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message SignUpdateResponse {
        bytes State = 1;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_SignUpdate.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden. (Die Hostbibliothek muss die Sitzung dem gespeicherten Status zuordnen.)

Das BLOB state wurde von SignInit ausgegeben.

Parameter
    CK_RV m_SignUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_SignUpdate. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_SignUpdate setzt eine mehrteilige Signaturoperation fort und verarbeitet einen anderen Datenabschnitt. hSession ist die Kennung der Sitzung, pPart verweist auf den Datenteil, ulPartLen ist die Länge des Datenteils.

Die Signaturoperation muss mit C_SignInit initialisiert werden. Diese Funktion kann beliebig oft hintereinander aufgerufen werden. Ein Aufruf von C_SignUpdate, der zu einem Fehler führt, beendet die aktuelle Signaturoperation.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_SignUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

    // 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)
    
  • JavaScript-Code-Snippet

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

SignFinal

Die Funktion SignFinal beendet eine mehrteilige Signaturoperation.

Beschreibung Bindet an die EP11-Funktion m_SignFinal, die eine Implementierung der PKCS #11-Funktion C_SignFinal ist.
Parameter
    message SignFinalRequest {
        bytes State = 1;
    }
    message SignFinalResponse {
        bytes Signature = 2;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_SignFinal.

Aktualisiert (state, slen) nicht.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden. (Die Hostbibliothek muss die Sitzung dem gespeicherten Status zuordnen.)

Das BLOB state wurde von SignInit und SignUpdate ausgegeben.

Parameter
    CK_RV m_SignFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_SignFinal. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_SignFinal beendet eine mehrteilige Signaturoperation und gibt die Signatur zurück. hSession ist die Kennung der Sitzung, pSignature verweist auf die Position, welche die Signatur empfängt, pulSignatureLen verweist auf die Position, welche die Länge der Signatur enthält.

C_SignFinal verwendet die in Abschnitt 5.2 der PKCS #11-API-Spezifikation beschriebene Konvention für die Ausgabeerstellung.

Die Signieroperation muss mit C_SignInit initialisiert werden. Ein Aufruf von C_SignFinal beendet immer die aktive Signieroperation, sofern er nicht CKR_BUFFER_TOO_SMALL zurückgibt oder ein erfolgreicher Aufruf ist (d. h. ein Aufruf, der CKR_OK zurückgibt), um die Länge des Puffers zu bestimmen, der für die Aufnahme der Signatur erforderlich ist.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_SignFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pSignature,
        CK_ULONG_PTR pulSignatureLen
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN, CKR_FUNCTION_REJECTED.

Code-Snippets

  • Golang-Code-Snippet

    SignFinalRequest := &pb.SignFinalRequest {
        State: SignUpdateResponse.State,
    }
    
    SignFinalResponse, err := cryptoClient.SignFinal(context.Background(), SignFinalRequest)
    
  • JavaScript-Code-Snippet

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

SignSingle

Die Funktion SignSingle signiert Daten oder verarbeitet sie mit MAC in einem Durchgang mit einem Aufruf, ohne einen temporären Digest-Status aufzubauen. Es gibt keinen Status für den Host zurück, sondern nur das Ergebnis. Diese Funktion ist eine IBM EP11-Erweiterung zur PKCS #11-Standardspezifikation und stellt eine Kombination aus den Funktionen SignInit und Sign dar. Sie ermöglicht Ihnen die Durchführung einer Signaturoperation durch nur einen Aufruf anstatt durch eine Reihe von Aufrufen.

Beschreibung Bindet an EP11 m_SignSingle.
Parameter
    message SignSingleRequest {
        bytes PrivKey = 1;
        Mechanism Mech = 2;
        bytes Data = 3;
    }
    message SignSingleResponse {
        bytes Signature = 4;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Vom Standard abweichende Erweiterung, Kombination von SignInit und Sign. Signiert Daten oder verarbeitet sie mit MAC in einem Durchgang, mit einem einzigen Aufruf, ohne einen temporären Digest-Status aufzubauen. Sie gibt keinen Status an den Host zurück, nur das Ergebnis.

Dies ist die bevorzugte Art der Signierung, ohne einen zusätzlichen Umlauf und ohne zusätzliche Verschlüsselung und Entschlüsselung. Funktional ist SignSingle äquivalent zu SignInit mit sofort anschließendem Sign.

Das BLOB (key, klen) und der Mechanismus pmech müssen zusammen an SignInit übergeben werden können.

Mehrdatenanforderungen für HMAC- und CMAC-Signaturen werden unterstützt (Untervarianten 2 und 3).

Siehe auch: SignInit, Sign, VerifySingle.

Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_Decrypt. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.

Code-Snippets

  • Golang-Code-Snippet

    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)
    
  • JavaScript-Code-Snippet

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

VerifyInit

Die Funktion VerifyInit initialisiert eine Verifizierungsoperation. Sie müssen als Erstes diese Funktion aufrufen, um eine Signatur zu verifizieren.

Beschreibung Bindet an die EP11-Funktion m_VerifyInit, die eine Implementierung der PKCS #11-Funktion C_VerifyInit ist.
Parameter
    message VerifyInitRequest {
        Mechanism Mech = 2;
        bytes PubKey = 3;
    }
    message VerifyInitResponse {
        bytes State = 1;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_VerifyInit. Initialisieren Sie bei einem Schlüssel-BLOB (key, klen) einen Status zur Sitzungsverifizierung in (state, slen). Das Schlüssel-BLOB kann ein Objekt mit öffentlichem Schlüssel oder HMAC-Schlüsselbyte sein. Der Typ des Schlüssel-BLOBs muss mit pmech konsistent sein.

Bei Mechanismen mit öffentlichem Schlüssel muss (key, klen) eine SPKI enthalten. Diese SPKI CKA_UNWRAP kann mit MAC verarbeitet werden (wie zuvor von GenerateKeyPair zurückgegeben) oder es kann sich lediglich um die SPKI selbst handeln (wenn sie aus einer externen Quelle wie einem Zertifikat abgerufen wird).

Bei der Initialisierung einer HMAC-Operation werden Sitzungseinschränkungen des Objekts Verify von dem HMAC-Schlüssel übernommen. Da SPKIs nicht an Sitzungen gebunden sind, sind die Verifizierungszustände von öffentlichen Schlüsseln sitzungsfrei.

Das BLOB key,klen muss aus dem PKCS #11-Parameter hKey zugeordnet werden.

Hinweis: SignInit und VerifyInit sind intern die für HMAC und andere Symmetrie-/MAC-Mechanismen.

Parameter
    CK_RV m_VerifyInit (
        unsigned char * state, size_t * statelen,
        CK_MECHANISM_PTR mech,
        const unsigned char *pubKey, size_t pubKeylen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_VerifyInit. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_VerifyInit initialisiert eine Verifizierungsoperation, wobei die Signatur ein Anhang der Daten ist. hSession ist die Kennung der Sitzung, pMechanism verweist auf die Struktur, die den Prüfmechanismus angibt, hKey ist die Kennung des Prüfschlüssels.

Das Attribut CKA_VERIFY des Verifizierungsschlüssels, das angibt, ob der Schlüssel die Verifizierung unterstützt, wobei die Signatur ein Anhang an die Daten ist, muss CK_TRUE sein.

Nach dem Anwendungsaufruf von C_VerifyInit kann die Anwendung entweder C_Verify aufrufen, um eine Signatur für Daten in einem einzigen Teil zu verifizieren, oder sie kann C_VerifyUpdate einmal oder mehrmals aufrufen, gefolgt von C_VerifyFinal, um eine Signatur für Daten in mehreren Teilen zu verifizieren. Die Verifizierungsoperation ist aktiv, bis die Anwendung C_Verify oder C_VerifyFinal aufruft. Zur Verarbeitung weiterer Daten (in einem oder mehreren Teilen) muss die Anwendung C_VerifyInit erneut aufrufen.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_KEY_FUNCTION_NOT_PERMITTED, CKR_KEY_HANDLE_INVALID, CKR_KEY_SIZE_RANGE, CKR_KEY_TYPE_INCONSISTENT, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

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

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

Verify

Die Funktion Verify verifiziert eine Signatur für einteilige Daten. Für eine einteilige Verifizierung brauchen die Teiloperationen VerifyUpdate und VerifyFinal nicht ausgeführt zu werden. Bevor Sie diese Funktion aufrufen, stellen Sie sicher, dass zuerst VerifyInit ausgeführt wird.

Beschreibung Bindet an die EP11-Funktion m_Verify, die eine Implementierung der PKCS #11-Funktion C_Verify ist.
Parameter
    message VerifyRequest {
        bytes State = 1;
        bytes Data = 2;
        bytes Signature = 3;
    }
    message VerifyResponse {
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_Verify.

Aktualisiert (state, slen) nicht.

Die relative Reihenfolge von Daten und Signatur ist umgekehrt. in VerifySingle.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden. (Die Hostbibliothek muss die Sitzung dem gespeicherten Status zuordnen.)

Das BLOB state wurde von VerifyInit ausgegeben.

Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_Verify. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_Verify überprüft eine Signatur in einer einteiligen Operation, wobei die Signatur ein Anhang der Daten ist. hSession ist die Kennung der Sitzung, pData verweist auf die Daten, ulDataLen ist die Länge der Daten, pSignature verweist auf die Signatur, ulSignatureLen ist die Länge der Signatur.

Die Verifizierungsoperation muss mit C_VerifyInit initialisiert werden. Ein Aufruf von C_Verify beendet immer die aktive Verifizierungsoperation.

Ein erfolgreicher Aufruf von C_Verify muss den Wert CKR_OK (gibt an, das die bereitgestellte Signatur gültig ist) oder CKR_SIGNATURE_INVALID (gibt an, dass die bereitgestellte Signatur ungültig ist) zurückgeben. Wenn die Signatur nur aufgrund ihrer Länge ungültig ist, dann muss CKR_SIGNATURE_LEN_RANGE zurückgegeben werden. In allen diesen Fällen wird die aktive Signieroperation beendet.

C_Verify kann nicht verwendet werden, um eine mehrteilige Operation zu beenden, und muss ohne intervenierende C_VerifyUpdate-Aufrufe nach C_VerifyInit aufgerufen werden.

Bei den meisten Mechanismen ist C_Verify äquivalent zu einer Folge von C_VerifyUpdate-Operationen mit anschließendem C_VerifyFinal.

Parameter
    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
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_INVALID, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SIGNATURE_INVALID, CKR_SIGNATURE_LEN_RANGE.

Code-Snippets

  • Golang-Code-Snippet

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

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

VerifyUpdate

Die Funktion VerifyUpdate setzt eine mehrteilige Verifizierungsoperation fort. Bevor Sie diese Funktion aufrufen, stellen Sie sicher, dass zuerst VerifyInit ausgeführt wird.

Beschreibung Bindet an die EP11-Funktion m_VerifyUpdate, die eine Implementierung der PKCS #11-Funktion C_VerifyUpdate ist.
Parameter
    message VerifyUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message VerifyUpdateResponse {
        bytes State = 1;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_VerifyUpdate.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden. (Die Hostbibliothek muss die Sitzung dem gespeicherten Status zuordnen.)

Das BLOB state wurde von VerifyInit ausgegeben.

Parameter
    CK_RV m_VerifyUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_VerifyUpdate. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_VerifyUpdate setzt eine mehrteilige Verifizierungsoperation fort und verarbeitet einen anderen Datenabschnitt. hSession ist die Kennung der Sitzung, pPart verweist auf den Datenteil, ulPartLen gibt die Länge des Datenteils an.

Die Verifizierungsoperation muss mit C_VerifyInit initialisiert werden. Diese Funktion kann beliebig oft hintereinander aufgerufen werden. Ein Aufruf von C_VerifyUpdate, der zu einem Fehler führt, beendet die aktuelle Verifizierungsoperation.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Code-Snippets

  • Golang-Code-Snippet

    // 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)
    
  • JavaScript-Code-Snippet

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

VerifyFinal

Die Funktion VerifyFinal beendet eine mehrteilige Verifizierungsoperation.

Beschreibung Bindet an die EP11-Funktion m_VerifyFinal, die eine Implementierung der PKCS #11-Funktion C_VerifyFinal ist.
Parameter
    message VerifyFinalRequest {
        bytes State = 1;
        bytes Signature = 2;
    }
    message VerifyFinalResponse {
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_VerifyFinal.

Aktualisiert (state, slen) nicht.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden. (Die Hostbibliothek muss die Sitzung dem gespeicherten Status zuordnen.)

Das BLOB state wurde von VerifyInit und VerifyUpdate ausgegeben.

Parameter
    CK_RV m_VerifyFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR signature, CK_ULONG signaturelen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_VerifyFinal. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_VerifyFinal beendet eine mehrteilige Verifizierungsoperation und überprüft die Signatur. hSession ist die Kennung der Sitzung, pSignature verweist auf die Signatur, ulSignatureLen ist die Länge der Signatur.

Die Verifizierungsoperation muss mit C_VerifyInit initialisiert werden. Ein Aufruf von C_VerifyFinal beendet immer die aktive Verifizierungsoperation.

Ein erfolgreicher Aufruf von C_VerifyFinal muss den Wert CKR_OK (gibt an, das die bereitgestellte Signatur gültig ist) oder CKR_SIGNATURE_INVALID (gibt an, dass die bereitgestellte Signatur ungültig ist) zurückgeben. Wenn die Signatur aufgrund ihrer Länge ungültig ist, dann muss CKR_SIGNATURE_LEN_RANGE zurückgegeben werden. In allen diesen Fällen wird die aktive Verifizierungsoperation beendet.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pSignature,
        CK_ULONG ulSignatureLen
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DATA_LEN_RANGE, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_SIGNATURE_INVALID, CKR_SIGNATURE_LEN_RANGE.

Code-Snippets

  • Golang-Code-Snippet

    VerifyFinalRequest := &pb.VerifyFinalRequest {
        State:     VerifyUpdateResponse.State,
        Signature: SignResponse.Signature,
    }
    
    VerifyFinalResponse, err := cryptoClient.VerifyFinal(context.Background(), VerifyFinalRequest)
    
  • JavaScript-Code-Snippet

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

VerifySingle

Die Funktion VerifySingle signiert Daten oder verarbeitet sie mit MAC in einem Durchgang mit einem Aufruf, ohne einen temporären Digest-Status aufzubauen. Es gibt keinen Status für den Host zurück, sondern nur das Verifizierungsergebnis. Diese Funktion ist eine IBM EP11-Erweiterung zur PKCS #11-Standardspezifikation und stellt eine Kombination aus den Funktionen VerifyInit und Verify dar. Sie ermöglicht Ihnen die Durchführung einer Verifizierungsoperation durch nur einen Aufruf anstatt durch eine Reihe von Aufrufen.

Beschreibung Bindet an EP11 m_VerifySingle.
Parameter
    message VerifySingleRequest {
        bytes PubKey = 1;
        Mechanism Mech = 2;
        bytes Data = 3;
        bytes Signature = 4;
    }
    message VerifySingleResponse {
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Vom Standard abweichende Erweiterung, Kombination von VerifyInit und Verify. Signiert Daten oder verarbeitet sie mit MAC in einem Durchgang, mit einem einzigen Aufruf, ohne einen temporären Digest-Status aufzubauen. Sie gibt keinen Status an den Host zurück, nur das Verifizierungsergebnis. Es gibt keine Größenabfrage, da diese Funktion einen booleschen Wert zurückgibt.

Dies ist die bevorzugte Art der Signaturprüfung, ohne einen zusätzlichen Umlauf und ohne zusätzliche Verschlüsselung und Entschlüsselung. Funktional ist VerifySingle äquivalent zu VerifyInit mit sofort anschließendem Verify.

Das BLOB (key, klen) und der Mechanismus pmech müssen zusammen an VerifyInit übergeben werden können.

Bei Mechanismen mit öffentlichem Schlüssel muss (key, klen) eine SPKI enthalten. Diese SPKI kann mit MAC verarbeitet (beispielsweise als öffentlicher Schlüssel von GenerateKeyPair zurückgegeben) werden oder es kann sich lediglich um die SPKI selbst handeln (wenn sie aus einer externen Quelle wie einem Zertifikat abgerufen wird).

Siehe auch: VerifyInit, Verify, SignSingle.

Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_VerifySingle. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.

Code-Snippets

  • Golang-Code-Snippet

    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)
    
  • JavaScript-Code-Snippet

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

Datenintegrität durch Message-Digests schützen

GREP11 stellt eine Gruppe von Funktionen bereit, mit denen Message-Digests erstellt werden können, die dazu konzipiert sind, die Integrität einer Dateninformation zu schützen. Möglicherweise müssen Sie eine Reihe von Unterfunktionen aufrufen, um eine Digest-Operation auszuführen. Zum Beispiel setzt sich die mehrteilige Digest-Operation aus den Teiloperationen DigestInit, DigestUpdate und DigestFinal zusammen.

DigestInit

Die Funktion DigestInit initialisiert eine Message-Digest-Operation. Sie müssen als Erstes diese Funktion ausführen, um eine Digest-Operation durchzuführen.

Beschreibung Bindet an die EP11-Funktion m_DigestInit, die eine Implementierung der PKCS #11-Funktion C_DigestInit ist.
Parameter
    message DigestInitRequest {
        Mechanism Mech = 2;
    }
    message DigestInitResponse {
        bytes State = 1;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_DigestInit.

Erstellt einen Digest-Status mit Wrapping.

Hinweis: Größenabfragen werden unterstützt, aber im Gegensatz zu den meisten Größenabfragen (die anstelle der tatsächlichen Ausgabe eine Ausgabegröße zurückgeben) wird der Wrappingstatus immer vom Back-End zurückgegeben. Digest-Zustände sind so klein, dass sie keinen spürbaren Systemaufwand für Transport verursachen.

Bei Größenabfragen verwirft der Host nur den zurückgegebenen Status und meldet die BLOB-Größe (in len). Bei der Rückgabe eines BLOB wird len mit der zurückgegebenen Größe abgeglichen.

Das BLOB state,len muss aus dem PKCS #11-Parameter hSession zugeordnet werden. (Die Hostbibliothek muss das BLOB an die Sitzung binden.)

Parameter
    CK_RV m_DigestInit (
        unsigned char * state, size_t * len,
        const CK_MECHANISM_PTR mech,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_DigestInit. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_DigestInit initialisiert eine Message-Digest-Operation. hSession ist die Kennung der Sitzung, pMechanism verweist auf den Digest-Mechanismus.

Nach dem Anwendungsaufruf von C_DigestInit kann die Anwendung entweder C_Digest aufrufen, um Daten in einem einzigen Teil zu verarbeiten, oder sie kann C_DigestUpdate null Mal oder mehrmals aufrufen, gefolgt von C_DigestFinal, um Daten in mehreren Teilen zu verarbeiten. Die Message-Digest-Operation ist aktiv, bis die Anwendung einen Aufruf von C_Digest oder C_DigestFinal ausführt, um den Message-Digest abzurufen. Zur Verarbeitung weiterer Daten (in einem oder mehreren Teilen) muss die Anwendung 1C_DigestInit1 erneut aufrufen.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_DigestInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_MECHANISM_INVALID, CKR_MECHANISM_PARAM_INVALID, CKR_OK, CKR_OPERATION_ACTIVE, CKR_PIN_EXPIRED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID, CKR_USER_NOT_LOGGED_IN.

Code-Snippets

  • Golang-Code-Snippet

    DigestInitRequest := &pb.DigestInitRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_SHA256},
    }
    
    DigestInitResponse, err := cryptoClient.DigestInit(context.Background(), DigestInitRequest)
    
  • JavaScript-Code-Snippet

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

Digest

Die Funktion Digest verarbeitet einteilige Daten. Für eine Digest-Operation für einteilige Daten brauchen Sie die Funktionen DigestUpdate und DigestFinal nicht aufzurufen. Bevor Sie diese Funktion aufrufen, stellen Sie sicher, dass zuerst DigestInit ausgeführt wird. Achten Sie beim Festlegen von Parametern darauf, die Länge der Eingabedaten nicht auf null zu setzen und den Zeiger, der auf die Position der Eingabedaten verweist, nicht auf NULL zu setzen.

Beschreibung Bindet an die EP11-Funktion m_Digest, die eine Implementierung der PKCS #11-Funktion C_Digest ist.
Parameter
    message DigestRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message DigestResponse {
        bytes Digest = 3;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_Digest.

Wenn ein Digest-Objekt genau 0 (null) Bytes hat, die nach der Erstellung in einer beliebigen Kombination von Null-Byte-Übertragungen angehängt werden, kann es trotzdem einen One-Pass-Digest durchführen, auch wenn es von einer strikten Implementierung zurückgewiesen werden muss.

Aktualisiert (state, slen) nicht.

Implementierungen können DigestUpdate-, DigestFinal-oder Digest -Aufrufe für Klartext-Digest-Objekte im Host-Code unter Umgehung von HSM-Back-Ends. Diese Auswahl kann für den Host-Code sichtbar sein oder nicht und wirkt sich nicht auf die Sicherheit der Operation aus (da Klartextobjekte keine sensiblen Daten verarbeiten können).

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden. Das BLOB state wurde von DigestInit ausgegeben.

Parameter
    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,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_Digest. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_Digest verarbeitet Daten in einem einzelnen Teil. hSession ist die Kennung der Sitzung, pData verweist auf die Daten, ulDataLen ist die Länge der Daten, pDigest verweist auf die Position, die den Nachrichtenauszug empfängt, pulDigestLen verweist auf die Position, welche die Länge des Nachrichtenauszugs enthält.

C_Digest verwendet die in Abschnitt 5.2 der PKCS #11-API-Spezifikation beschriebene Konvention für die Ausgabeerstellung.

Die Digest-Operation muss mit C_DigestInit initialisiert werden. Ein Aufruf von C_Digest beendet immer die aktive Digest-Operation, sofern er nicht CKR_BUFFER_TOO_SMALL zurückgibt oder ein erfolgreicher Aufruf ist (d. h. ein Aufruf, der CKR_OK zurückgibt), um die Länge des Puffers zu bestimmen, der für die Aufnahme des Message-Digests erforderlich ist.

C_Digest kann nicht verwendet werden, um eine mehrteilige Operation zu beenden, und muss ohne intervenierende C_DigestUpdate-Aufrufe nach C_DigestInit aufgerufen werden.

Die Eingabedaten und die Digest-Ausgabe können sich an derselben Position befinden, d. h., es ist zulässig, wenn pData und pDigest auf dieselbe Position verweisen.

C_Digest ist äquivalent zu einer Folge von C_DigestUpdate-Operationen mit anschließendem C_DigestFinal.

Parameter
    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
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Code-Snippets

  • Golang-Code-Snippet

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

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

DigestUpdate

Die Funktion DigestUpdate setzt eine mehrteilige Digest-Operation fort. Bevor Sie diese Funktion aufrufen, stellen Sie sicher, dass zuerst DigestInit ausgeführt wird. Achten Sie beim Festlegen von Parametern darauf, die Länge der Eingabedaten nicht auf null zu setzen und den Zeiger, der auf die Position der Eingabedaten verweist, nicht auf NULL zu setzen.

Beschreibung Bindet an die EP11-Funktion m_DigestUpdate, die eine Implementierung der PKCS #11-Funktion C_DigestUpdate ist.
Parameter
    message DigestUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message DigestUpdateResponse {
        bytes State = 1;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_DigestUpdate.

DigestUpdate ist polymorph, Akzeptieren von eingeschlossenen oder leeren Digest-Objekten und Aktualisieren des Status in demselben Format.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden. (Die Hostbibliothek muss die Sitzung dem gespeicherten Status zuordnen.)

Das BLOB state wurde von DigestInit, DigestUpdate und DigestKey ausgegeben.

Siehe auch: DigestInit

Parameter
    CK_RV m_DigestUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_DigestUpdate. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_DigestUpdate setzt eine mehrteilige Message-Digest-Operation fort und verarbeitet einen anderen Datenteil. hSession ist die Kennung der Sitzung, pPart verweist auf den Datenteil, ulPartLen ist die Länge des Datenteils.

Die Message-Digest-Operation muss mit C_DigestInit initialisiert werden. Aufrufe an diese Funktion und an C_DigestKey können beliebig oft in beliebiger Reihenfolge eingefügt werden. Ein Aufruf von C_DigestUpdate, der zu einem Fehler führt, beendet die aktuelle Digest-Operation.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_DigestUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Code-Snippets

  • Golang-Code-Snippet

    // 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)
    
  • JavaScript-Code-Snippet

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

DigestFinal

Die Funktion DigestFinal beendet eine mehrteilige Digest-Operation.

Beschreibung Bindet an die EP11-Funktion m_DigestFinal, die eine Implementierung der PKCS #11-Funktion C_DigestFinal ist.
Parameter
    message DigestFinalRequest {
        bytes State = 1;
    }
    message DigestFinalResponse {
        bytes Digest = 2;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Implementierung der PKCS #11-Funktion C_DigestFinal.

DigestFinal ist polymorph und akzeptiert sowohl Digest-Objekte mit Wrapping als auch in Klartext.

Aktualisiert (state, slen) nicht.

Das BLOB state,slen muss aus dem PKCS #11-Parameter hSession zugeordnet werden.

Das BLOB state wurde von DigestInit, DigestUpdate und DigestKey ausgegeben.

Parameter
    CK_RV m_DigestFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_DigestFinal. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.
Beschreibung

C_DigestFinal beendet eine mehrteilige Message-Digest-Operation und gibt den Message-Digest zurück. hSession ist die Kennung der Sitzung, pDigest verweist auf die Position, die den Nachrichtenauszug empfängt, pulDigestLen verweist auf die Position, welche die Länge des Nachrichtenauszugs enthält.

C_DigestFinal verwendet die in Abschnitt 5.2 der PKCS #11-API-Spezifikation beschriebene Konvention für die Ausgabeerstellung.

Die Digest-Operation muss mit C_DigestInit initialisiert werden. Ein Aufruf von C_DigestFinal beendet immer die aktive Digest-Operation, sofern er nicht CKR_BUFFER_TOO_SMALL zurückgibt oder ein erfolgreicher Aufruf ist (d. h. ein Aufruf, der CKR_OK zurückgibt), um die Länge des Puffers zu bestimmen, der für die Aufnahme des Message-Digests erforderlich ist.

Parameter
    CK_DEFINE_FUNCTION(CK_RV, C_DigestFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pDigest,
        CK_ULONG_PTR pulDigestLen
    );
    
Rückgabewerte CKR_ARGUMENTS_BAD, CKR_BUFFER_TOO_SMALL, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCELED, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_OPERATION_NOT_INITIALIZED, CKR_SESSION_CLOSED, CKR_SESSION_HANDLE_INVALID.

Code-Snippets

  • Golang-Code-Snippet

    DigestFinalRequest := &pb.DigestFinalRequest {
        State: DigestUpdateResponse.State,
    }
    
    DigestFinalResponse, err := cryptoClient.DigestFinal(context.Background(), DigestFinalRequest)
    
  • JavaScript-Code-Snippet

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

DigestSingle

Die Funktion DigestSingle verarbeitet Daten in einem Durchgang mit einem Aufruf, ohne einen temporären Digest-Status und unnötige Umläufe aufzubauen. Diese Funktion ist eine IBM EP11-Erweiterung zur PKCS #11-Standardspezifikation und stellt eine Kombination aus den Funktionen DigestInit und Digest dar. Sie ermöglicht Ihnen die Durchführung einer Digest-Operation durch nur einen Aufruf anstatt durch eine Reihe von Aufrufen.

Beschreibung Bindet an EP11 m_DigestSingle.
Parameter
    message DigestSingleRequest {
        Mechanism Mech = 1;
        bytes Data = 2;
    }
    message DigestSingleResponse {
        bytes Digest = 3;
    }
    
Rückgabewerte Führt ein Wrapping des EP11-Fehlers in die Nachricht Grep11Error durch.
Beschreibung

Vom Standard abweichende Erweiterung, Kombination von DigestInit und Digest. Verarbeitet Daten in einem Durchgang, mit einem einzigen Aufruf, ohne einen temporären Digest-Status und unnötige Umläufe aufzubauen.

Das ist die bevorzugte Methode für Digest-Operationen mit Klartext für XCP-sensitive Anwendungen. Funktional ist DigestSingle äquivalent zu DigestInit mit sofort anschließendem Digest.

Wenn ein Schlüssel verarbeitet werden muss, müssen DigestInit und DigestKey verwendet werden, da diese Funktion keine Schlüssel-BLOBs verarbeitet.

Gibt keinen Status an den Host zurück, nur das Ergebnis der Digest-Operation. Es gibt keine anderen Parameter als PKCS #11-Parameter, da alles direkt aus dem PKCS #11-Aufruf verwendet wird.

Parameter
    CK_RV m_DigestSingle (
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        Ziel 'target_t'
    );
    
Rückgabewerte Eine Untergruppe der Rückgabewerte von C_DigestSingle. Weitere Informationen finden Sie im Kapitel Rückgabewerte im Dokument zur Enterprise PKCS #11 (EP11)-Bibliotheksstruktur.

Code-Snippets

  • Golang-Code-Snippet

    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)
    
  • JavaScript-Code-Snippet

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

Codebeispiele

GREP11-API unterstützt Programmiersprachen mit gRPC-Bibliotheken. Zum Testen der GREP11-API stehen zwei GitHub-Beispielrepositorys zur Verfügung: