CryptoAPI: Verwenden von CryptVerifySignature, um eine Signatur von openssl mit einem öffentlichen Schlüssel zu verifizieren

8

Ich versuche das AquaticPrime Framework für Mac nach Windows zu portieren.

Auf dem Mac wird die opsll-Bibliothek verwendet, und ich versuche zu verstehen, wie ich dies auf Windows portieren kann, wo ich die CryptoAPI verwenden muss, nehme ich an.

Ich brauche hauptsächlich den Code für die Validierung der generierten Signatur mit einem bestimmten öffentlichen Schlüssel.

So wird die Überprüfung mit openssl durchgeführt:

  1. Eingaben: Lizenzdaten, öffentlicher Schlüssel und Signatur, beide 128 Byte lang.
  2. Ein SHA1-Digest wird aus den Lizenzdaten berechnet.
  3. Ein RSA-Kontext wird mit den Daten des öffentlichen Schlüssels
  4. eingerichtet
  5. RSA_public_decrypt () wird aufgerufen, da der RSA-Schlüssel und die Signatur einen 20 Byte langen SHA1-Digest zurückgeben - ist dieser Digest gleich dem aus Schritt 2, ist die Signatur gültig.

Also, wie mache ich das mit CryptoAPI? Ich bin soweit gekommen:

  1. Beginnen Sie mit CryptAcquireContext (ctx, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)
  2. Verwenden Sie CryptImportKey mit Hilfe von dies , mit pubexp = 3 und bitlen = 1024. Das funktioniert alles, d. H. Ich erhalte keine Fehler, und ich schaute auf die binären Daten, um zu überprüfen, ob sie dem entspricht, was der MSDN-Artikel zeigt.
  3. Erstellen Sie einen SHA1-Digest aus den Lizenzdaten. Ich habe den resultierenden 20-Byte-Hash-Wert abgerufen und festgestellt, dass er dem entspricht, was ich mit openssl auf dem Mac bekomme.

An dieser Stelle rufe ich an:

%Vor%

Dies schlägt mit dem Fehlercode ERROR_INVALID_PARAMETER fehl.

Das Seltsame ist, dass ich, als ich versehentlich einen doppelt so großen öffentlichen Schlüssel in der PUBLICKEYBLOB-Struktur gespeichert habe, stattdessen einen NTE_BAD_SIGNATURE-Fehler erhalten habe. Dies könnte darauf hindeuten, dass jetzt der öffentliche Schlüssel, den ich übergebe, korrekt ist.

Warum der Fehler ERROR_INVALID_PARAMETER jetzt? Ich habe überprüft, dass der Hash-Wert korrekt ist, und der Schlüssel scheint auch akzeptiert zu werden. Und der Parameter "sig" ist nur ein Zeiger auf die 128 Bytes der Signatur und sigLen ist 128.

Also, was fehlt mir hier?

    
Thomas Tempelmann 07.02.2011, 20:38
quelle

2 Antworten

9

OK, ich habe das Problem nach vielen Versuchen gelöst.

Sowohl die Signatur- als auch die öffentlichen Schlüsseldaten, wenn sie in ihrer reinen Bytekettenform vorliegen, müssen umgekehrt werden, d. h. das erste Byte zur letzten Position und so weiter. Dann funktioniert das obige.

    
Thomas Tempelmann 08.02.2011, 16:56
quelle
-3

Kompilieren und verknüpfen Sie OpenSSL libCrypto statisch. Es kann gemacht werden, ich habe das bei einem früheren Arbeitgeber gesehen.

    
Roddi 08.02.2011 11:04
quelle