Mac用のAquaticPrimeフレームワークをWindowsに移植しようとしています。
Macでは、opensllライブラリを使用しており、これをWindowsに移植する方法を理解しようとしています。Windowsでは、CryptoAPIを使用する必要があると思います。
主に、特定の公開鍵を使用して生成された署名を検証するためのコードが必要です。
opensslを使用して検証を行う方法は次のとおりです。
- 入力:ライセンスデータ、公開鍵、署名、どちらも128バイト長。
- SHA1ダイジェストは、ライセンスデータから計算されます。
- RSAコンテキストは公開鍵データで設定されます
- RSAキーと署名が与えられるとRSA_public_decrypt()が呼び出され、20バイト長のSHA1ダイジェストが返されます。このダイジェストはステップ2のダイジェストと同じであり、署名は有効です。
では、CryptoAPIでこれを行うにはどうすればよいですか?私はこれまでに得ました:
- CryptAcquireContext(ctx、0、0、PROV_RSA_FULL、CRYPT_VERIFYCONTEXT)で開始します
- この投稿を利用して、pubexp=3およびbitlen=1024でCryptImportKeyを使用します。それはすべて機能します。つまり、エラーは発生しません。バイナリデータを調べて、MSDNの記事に示されているものと一致することを確認しました。
- ライセンスデータからSHA1ダイジェストを作成します。結果の20バイトのハッシュ値を取得し、Macのopensslで取得したものと一致することを確認しました。
この時点で、私は次のように呼びます。
CryptVerifySignature (hashHdl, sig, sigLen, keyHdl, 0, 0)
これはエラーコードERROR_INVALID_PARAMETERで失敗します。
奇妙なことに、最初に誤って2倍の大きさの公開鍵をPUBLICKEYBLOB構造に格納したときに、代わりにNTE_BAD_SIGNATUREエラーが発生しました。これは、私が渡した公開鍵が正しいことを示唆している可能性があります。
では、なぜ今ERROR_INVALID_PARAMETERエラーが発生するのでしょうか。ハッシュ値が正しいことを確認しましたが、キーも受け入れられているようです。また、「sig」パラメータは署名の128バイトへの単なるポインタであり、sigLenは128です。
だから、私はここで何が欠けていますか?