]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
archive_digest: Use correct providers with Windows Crypto 1724/head
authorDavid Macek <david.macek.0@gmail.com>
Sun, 17 Apr 2022 17:52:25 +0000 (19:52 +0200)
committerDavid Macek <david.macek.0@gmail.com>
Sun, 17 Apr 2022 17:52:25 +0000 (19:52 +0200)
Trying to use SHA256, SHA384 or SHA512 with mtree when linked against
Windows Crypto would result in silent failure.  The call to
`CryptCreateHash` would fail with 0x80090008.  The docs[1] say that
these algorithms require a different crypto provider, so let's make
that a parameter for `win_crypto_init` and choose at the call site along
with the algorithm.

[1] https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

Signed-off-by: David Macek <david.macek.0@gmail.com>
libarchive/archive_digest.c

index a7bd5f0286a486d8d82666b78e80fdd378f67a9d..3361b19ada82b4c39b049a112c90b011fda1681f 100644 (file)
  * Initialize a Message digest.
  */
 static int
-win_crypto_init(Digest_CTX *ctx, ALG_ID algId)
+win_crypto_init(Digest_CTX *ctx, DWORD prov, ALG_ID algId)
 {
 
        ctx->valid = 0;
        if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL,
-           PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
+           prov, CRYPT_VERIFYCONTEXT)) {
                if (GetLastError() != (DWORD)NTE_BAD_KEYSET)
                        return (ARCHIVE_FAILED);
                if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL,
-                   PROV_RSA_FULL, CRYPT_NEWKEYSET))
+                   prov, CRYPT_NEWKEYSET))
                        return (ARCHIVE_FAILED);
        }
 
@@ -276,7 +276,7 @@ __archive_md5final(archive_md5_ctx *ctx, void *md)
 static int
 __archive_md5init(archive_md5_ctx *ctx)
 {
-  return (win_crypto_init(ctx, CALG_MD5));
+  return (win_crypto_init(ctx, PROV_RSA_FULL, CALG_MD5));
 }
 
 static int
@@ -659,7 +659,7 @@ __archive_sha1final(archive_sha1_ctx *ctx, void *md)
 static int
 __archive_sha1init(archive_sha1_ctx *ctx)
 {
-  return (win_crypto_init(ctx, CALG_SHA1));
+  return (win_crypto_init(ctx, PROV_RSA_FULL, CALG_SHA1));
 }
 
 static int
@@ -919,7 +919,7 @@ __archive_sha256final(archive_sha256_ctx *ctx, void *md)
 static int
 __archive_sha256init(archive_sha256_ctx *ctx)
 {
-  return (win_crypto_init(ctx, CALG_SHA_256));
+  return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_256));
 }
 
 static int
@@ -1155,7 +1155,7 @@ __archive_sha384final(archive_sha384_ctx *ctx, void *md)
 static int
 __archive_sha384init(archive_sha384_ctx *ctx)
 {
-  return (win_crypto_init(ctx, CALG_SHA_384));
+  return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_384));
 }
 
 static int
@@ -1415,7 +1415,7 @@ __archive_sha512final(archive_sha512_ctx *ctx, void *md)
 static int
 __archive_sha512init(archive_sha512_ctx *ctx)
 {
-  return (win_crypto_init(ctx, CALG_SHA_512));
+  return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_512));
 }
 
 static int