Mappage des handles d'objet
L'un des aspects clés de la bibliothèque DuoKey PKCS#11 est le système de mappage des handles d'objet, qui fait le pont entre les handles d'objet entiers de PKCS#11 et les identifiants de clé durables de DuoKey Cockpit.
Vue d'ensemble
Le problème
PKCS#11 référence les objets à l'aide de handles entiers (entiers non signés sur 32 bits), tandis que DuoKey Cockpit référence les clés à l'aide d'identifiants durables (chaînes au format UUID). Le système de mappage effectue la traduction entre les deux.
Handles PKCS#11
- Type :
CK_OBJECT_HANDLE(entier) - Portée : par session (les handles sont spécifiques à la session)
- Durée de vie : valides uniquement tant que la session est ouverte
Identifiants de clé DuoKey
- Type : chaîne (format UUID, par exemple
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) - Portée : durables et uniques sur l'ensemble de la plateforme
- Durée de vie : persistante (les identifiants ne changent pas)
Fonctionnement
Processus de mappage
Génération des handles
Les handles sont générés par session :
Algorithme :
- Attribuer le premier handle au premier objet.
- Incrémenter pour chaque nouvel objet.
- Stocker le mappage dans la table de handles de la session.
Table de mappage
Chaque session maintient sa propre table de mappage avec deux vues :
- Directe : handle → identifiant de clé
- Inverse : identifiant de clé → handle (pour une recherche inverse rapide)
Opérations : insérer un nouveau mappage, rechercher l'identifiant correspondant à un handle, effectuer une recherche inverse du handle correspondant à un identifiant, et supprimer un mappage lorsqu'un objet est détruit.
Types d'objets
Clés secrètes
Clés AES utilisées pour les opérations de wrap / unwrap.
Handle: 0x12345
Type: CKO_SECRET_KEY
Algorithm: AES-256
Objets de données
Objets de métadonnées qu'Oracle utilise pour suivre les informations du keystore.
Handle: 0x12346
Type: CKO_DATA
Label: ORACLE.TDE.CDB$ROOT.MK.IDENT
Cycle de vie des handles
Création
Les handles sont créés lorsque des objets sont trouvés (C_FindObjects), lorsqu'une clé est générée (C_GenerateKey), ou lorsqu'un objet de données est créé (C_CreateObject).
Utilisation
Opérations qui prennent un handle : C_Encrypt / C_Decrypt (wrap / unwrap), C_GetAttributeValue et C_DestroyObject.
Nettoyage
Les handles sont invalidés à la fermeture de la session ; un mappage individuel est retiré lorsque son objet est détruit.
Scénarios d'exemple
Scénario 1 : trouver une clé maître existante
- Oracle appelle
C_FindObjectsavec un modèle tel que{ CKA_LABEL: "TDE-MASTER-20251219" }. - La bibliothèque demande au Cockpit de localiser la clé par ce label.
- Le Cockpit renvoie l'identifiant de clé.
- La bibliothèque vérifie sa table de mappage ; l'identifiant étant nouveau, elle attribue un handle (par exemple
0x12345) et stocke le mappage. - Elle renvoie le handle
0x12345à Oracle.
Scénario 2 : wrapper une clé de tablespace
- Oracle appelle
C_Encrypt(session, 0x12345, tablespaceKey). - La bibliothèque recherche l'identifiant de clé correspondant au handle
0x12345. - La bibliothèque demande au Cockpit de wrapper la clé de tablespace sous cette clé maître (AES-CBC-PAD préservant la longueur).
- Le Cockpit renvoie la clé enveloppée.
- La bibliothèque renvoie la clé enveloppée à Oracle.
Scénario 3 : générer une nouvelle clé maître
- Oracle appelle
C_GenerateKey(session, mechanism, template)pour une clé AES-256. - La bibliothèque demande au Cockpit de provisionner la clé.
- Le Cockpit renvoie le nouvel identifiant de clé.
- La bibliothèque attribue un handle (par exemple
0x12346) et stocke le mappage. - Elle renvoie le handle
0x12346à Oracle.
Considérations de performance
- Recherche : O(1) en moyenne (recherche dans une table de hachage).
- Réutilisation des handles : si le même identifiant est demandé à nouveau, le handle existant est renvoyé afin d'éviter les mappages en double.
- Recherche inverse : une table identifiant → handle permet des recherches inverses rapides.
- Mémoire : les mappages sont effacés à la fermeture de la session.
Gestion des erreurs
| Scénario | Réponse |
|---|---|
| Oracle fournit un handle absent de la table de mappage | CKR_OBJECT_HANDLE_INVALID |
| Un identifiant de clé renvoyé précédemment n'existe plus (objet supprimé entre deux opérations) | CKR_DEVICE_ERROR |
Bonnes pratiques
- Ne pas mettre en cache les handles entre les sessions — ils sont spécifiques à la session.
- Valider les handles avant utilisation.
- Nettoyer les mappages à la fermeture de la session.
- Supprimer correctement avec
C_DestroyObjectafin que les mappages soient retirés.
Étapes suivantes
- Couche interface PKCS#11 → - Voir comment les handles sont utilisés
- Flux de communication → - Comprendre le flux de bout en bout
- Mécanismes cryptographiques → - En savoir plus sur les opérations prises en charge