Je n'arrive pas à vérifier les signatures DSA à l'aide de Python/M2Crypto. Les signatures sont générées en Java, en utilisant la classe java.security.Signature standard, avec le fournisseur de cryptographie de Sun et la désignation d'algorithme SHA1withDSA.M2Crypto: vérification des signatures DSA
Voici quelques sortie du shell:
>>> pk
<M2Crypto.DSA.DSA_pub instance at 0x20b6a28>
>>> sig = '302c02141c4bbb218215ebfec57288059ce814dc430d849502144dd0c581bf2213aff79d17eb37c939e120a97bd2'.decode('hex')
>>> data ='0501...9794'.decode('hex')
>>> pk.verify_asn1(sig, data)
------------------------------------------------------------
Traceback (most recent call last):
...
DSAError: wrong tag
La valeur de signature semble OK pour moi, il ressemble à une séquence codée ASN.1 appropriée de deux entiers (0x302c désigne une séquence de 44 octets, et 0x0214 désigne un Entier de 20 octets), qui est le codage standard des signatures DSA.
Puisque la méthode DSA_pub.verify_asn1 est même pas documenté, j'ai aussi essayé d'utiliser la méthode DSA_pub.verify documentée, mais toujours pas de cigare:
>>> r = sig[4:24]
>>> s = sig[26:]
>>> md = sha1(data).digest()
>>> pk.verify(md, r, s)
------------------------------------------------------------
Traceback (most recent call last):
...
DSAError: encoding error
L'état docs que tous les paramètres doivent être « octet chaînes ", mais la méthode de vérification parvient à générer une erreur de codage. J'ai également essayé d'inverser r et s, pour vérifier les problèmes potentiels d'endianness mais cela n'a pas aidé.
Qu'est-ce que je fais mal?