Cinnabar

Cinnabar

Version 1.0.0
Bibliothèque tous systèmes

Télécharger

Code source sur GitHub

Aperçu

Le cinabre est la poudre minérale qui donne cette teinte rouge vermillon aux sceaux utilisés en Extrême-Orient. C’est également un morceau de code C portable pour générer et vérifier des signature numériques RSA.

Fonctionalités :

  • Implémente RSASSA-PKCS1-v1_5 avec SHA-256 comme fonction de hachage
  • Supporte toute taille de clef > 496 bits
  • Intégration facile : il suffit de copier cinnabar.h et cinnabar.c dans votre projet
  • Utilisable sur toute plateforme ayant un compilateur C 32 ou 64 bits correct
  • Fonctionne aussi bien sur les plateformes little endian que big endian

Ce code a été conçu à l’origine pour les systèmes embarqués où les bibliothèques de crypto habituelles ne sont pas toujours disponibles, ou pour les applications dont le même code source doit pouvoir compiler sur des plateformes parfois très différentes.

Génération des clefs

Signer nécessite d’avoir une clef privée RSA. Vérifier une signature nécessite la clef public correspondante. Cinnabar accepte les clefs au format PEM. Vous pouvez facilement générer ces clefs en utilisant openssl, qui est disponible sur tous les systèmes Unix.

Pour générer une clef privée, tapez la commande suivante dans un terminal :

openssl genrsa -out private.pem 2048

Ceci génèrera une clef RSA de 2048 bits et l’enregistrera dans le fichier private.pem. À partir de cette clef privée, vous pouvez ensuite dériver la clef publique :

openssl rsa -in private.pem -outform PEM -pubout -out public.pem

Vous pouvez ouvrir ces deux fichiers dans un éditeur de texte pour vérifier que la clef privée est bien comprise entre deux lignes -----BEGIN RSA PRIVATE KEY----- et -----END RSA PRIVATE KEY----- et la clef publique entre deux lignes -----BEGIN PUBLIC KEY----- et -----END PUBLIC KEY-----.

N’oubliez pas que votre clef privée doit demeurer, eh bien… privée. Ce qui signifie que vous devez la générer sur votre ordinateur (ou sur l’ordinateur de l’utilisateur final) et ne jamais la récupérer sur un site web quelconque. Une clef privée ne doit jamais être transmise par un canal non sécurisé tel qu’un email. Ce n’est généralement pas une bonne idée non plus de l’embarquer dans le code source de votre application : un fichier exécutable n’est pas un endroit sûr et de plus, si votre clef est compromise, vous ne pourrez plus la changer facilement lorsque votre application sera déployée sur des milliers de machines. Cela étant, le schéma exact de gestion des clef dépendra du type de votre application.

Utilisation

Afin de rester portable et de ne pas dépendre d’un système de fichiers ou d’un système d’exploitation précis, Cinnabar ne lit pas directement des fichiers PEM. Votre code doit lire le contenu de ces fichiers par le moyen approprié à votre situation, puis passer aux fonctions de Cinnabar un pointeur sur ces données.

Le calcul de la signature d’un bloc de données se fait en appelant la fonction suivante :

CnbrStatus CnbrSignature(CNBR_SIGNATURE * signature, const void * document_data, size_t document_length, const char * pem_private_key)
  • signature est un pointeur vers une structure CNBR_SIGNATURE allouée statiquement, qui recevra au retour les informations de signature
  • document_data est un pointeur vers les données à signer
  • document_length est la longueur (en octets) du bloc de données à signer
  • pem_private_key est un pointeur vers le contenu d’un fichier PEM contenant la clef privée RSA

Si tout se passe bien, la fonction retourne CnbrSuccess et la structure CNBR_SIGNATURE passée en paramètre reçoit les informations de signature. En cas d’ereur, la fonction retourne l’un des codes d’erreur définis dans l’énumération CnbrStatus. Les données signées ne sont pas altérées. (Notez que le paramètre est défini comme un pointeur const.)

La structure CNBR_SIGNATURE reçoit les données de la signature. La façon d’utiliser cette signature dépend de voytre application et de votre cas d’usage. Par exemple, si votre application est destinée à signer un email, vous pouvez encoder la signature en base64 et l’attacher en pièce jointe au message.

Lorsque vous avez terminé d’utiliser les informations de signature, vous devez appeler CnbrEraseSignature pour effacer les données sensible qu’elle contient et libérer la mémoire.

La vérification d’une signature se fait en appelant la fonction suivante :

CnbrStatus CnbrVerifySignature(const uint8_t * signature_data, size_t signature_length, const void * document_data, size_t document_length, const char * pem_public_key)
  • signature_data est un pointeur vers une signature précédemment générée par la fonction CnbrSignature (ou par toute autre implémentation compatible de RSASSA-PKCS1-v1_5)
  • signature_length est la longueur (en octets) de la signature
  • document_data est un pointeur vers les données dont la signature doit être vérifiée
  • document_length est la longueur (en octets) de ces données
  • pem_public_key est un pointeur vers le contenu d’un fichier PEM contenant la clef publique

Si la signature est valide, la fonction retourne CnbrSuccess. Si une erreur est survenue ou si la signature est invalide, la fonction retourne l’un des codes d’erreur définis dans l’énumération CnbrStatus.

Une signature valide garantit l’authenticité, la non-répudiation et l’intégrité : elle donne une forte présomption que le message a été expédié par un expéditeur connu, que cet expéditeur ne peut pas nier avoir signé ce message, et que le message n’a pas été altéré après-coup.