La documentation pour EVP_PKEY_new indique directement qu'il est utilisé pour stocker des clés privées. Et je suis perdu comme l'auteur original l'est aussi puisque x509foo.get_pubkey() renvoie simplement une instance EVP.PKey et que stocker l'instance en pem montre PRIVATE KEY. Je ne peux pas prétendre connaître l'intention de l'équipe M2Crypto puisque de nombreuses fonctions qui utilisent PKey ne sont pas documentées. Par exemple, un objet de requête x509 a une méthode verify(self,pkey) mais ne me dit rien sur le type d'objet pkey. De même, il n'y a aucune documentation. Je suis aussi confus que l'auteur original puisque je pense à RSA au moins en termes de (e,n)#Clé publique (d,n)#Clé privée
et au mieux je pense aux clés privées (d,n,p,q,dp,dq,qinv,t) où p et q sont les grands nombres premiers dp et dq et qinv sont des coéfficients supplémentaires pour rendre le déchiffrement plus rapide et t comme la fonction totient.
La raison pour laquelle la distinction aurait dû être clarifiée dans la documentation est parfois vous voulez chiffrer avec les clés privées(dans le cas d'une signature) afin que tout le monde puisse vérifier en déchiffrant en utilisant la clé publique. h = hash(m) sig = h^d (mod n) seul quelqu'un qui connait d (La clé privée) pourrait créer la signature. La vérification est faite par
h = sig^e (mod n)
si les deux hashes correspondent vous savez que le message est authentique.
Le problème que j'ai est que EVP.Pkey prétend représenter une clé publique pourtant sa méthode assign_rsa() déclare qu'elle prend une paire de clés RSA en argument ("Je suppose que cela signifie la clé privée à ce stade". Tous les exemples que j'ai trouvés jusque-là ne sont que pour la création d'un certificat auto-signé (y compris les propres tests unitaires de M2Crypto. Je ne vois aucun test qui prend une requête x509 tierce et la signe avec son propre certificat et sa propre clé comme nous le verrions normalement en réalité. Les tests unitaires ne m'aident pas à comprendre comment signer des CSR généraux puisque les Requêtes X509 ne contiendront pas la clé privée. Pourtant les exemples des tests unitaires fonctionnent bien puisqu'ils sont auto-signés et le signataire avait déjà accès aux clés privées. En fait, le test_mkcert fait exactement cela; il prend la clé privée renvoyée par la méthode mkreq qui génère la requête x509.
Les docs de M2Crypto sont confuses puisqu'ils utilisent les termes pk,pkey et même pubkey de façon interchangeable.