diff options
author | Steve Holme <steve_holme@hotmail.com> | 2020-02-20 01:49:31 +0000 |
---|---|---|
committer | Steve Holme <steve_holme@hotmail.com> | 2020-03-03 00:37:23 +0000 |
commit | f22a5c35e0ce0891bcfc3078d800df3db7b8ec24 (patch) | |
tree | a8c3913b12d603827cc142ba0a865a78c79ef89d /lib/sha256.c | |
parent | 4feb38deed33fed14ff7c370a6a9153c661dbb9c (diff) | |
download | curl-f22a5c35e0ce0891bcfc3078d800df3db7b8ec24.tar.gz |
sha256: Added WinCrypt implementation
Diffstat (limited to 'lib/sha256.c')
-rw-r--r-- | lib/sha256.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/sha256.c b/lib/sha256.c index 10ad44b49..6fd283c77 100644 --- a/lib/sha256.c +++ b/lib/sha256.c @@ -179,6 +179,45 @@ static void SHA256_Final(unsigned char *digest, SHA256_CTX *ctx) (void) CC_SHA256_Final(digest, ctx); } +#elif defined(USE_WIN32_CRYPTO) + +#include <wincrypt.h> + +typedef struct { + HCRYPTPROV hCryptProv; + HCRYPTHASH hHash; +} SHA256_CTX; + +static void SHA256_Init(SHA256_CTX *ctx) +{ + if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, + PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) { + CryptCreateHash(ctx->hCryptProv, CALG_SHA_256, 0, 0, &ctx->hHash); + } +} + +static void SHA256_Update(SHA256_CTX *ctx, + const unsigned char *data, + unsigned int length) +{ + CryptHashData(ctx->hHash, (unsigned char *) data, length, 0); +} + +static void SHA256_Final(unsigned char *digest, SHA256_CTX *ctx) +{ + unsigned long length; + + CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0); + if(length == SHA256_DIGEST_LENGTH) + CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0); + + if(ctx->hHash) + CryptDestroyHash(ctx->hHash); + + if(ctx->hCryptProv) + CryptReleaseContext(ctx->hCryptProv, 0); +} + #else /* When no other crypto library is available we use this code segment */ |