2019-02-08 19:59:36 +01:00
|
|
|
/*
|
2019-08-03 19:43:48 +02:00
|
|
|
* This software is licensed under the terms of the MIT License.
|
2019-02-08 19:59:36 +01:00
|
|
|
* See COPYING for further information.
|
|
|
|
* ---
|
2024-05-16 23:30:41 +02:00
|
|
|
* Copyright (c) 2011-2024, Lukas Weber <laochailan@web.de>.
|
|
|
|
* Copyright (c) 2012-2024, Andrei Alexeyev <akari@taisei-project.org>.
|
2019-02-08 19:59:36 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "sha256.h"
|
2024-05-17 04:41:28 +02:00
|
|
|
#include "util/stringops.h"
|
2019-02-08 19:59:36 +01:00
|
|
|
|
2022-05-19 21:20:55 +02:00
|
|
|
#include <openssl/evp.h>
|
2019-02-08 19:59:36 +01:00
|
|
|
|
2020-08-15 13:51:12 +02:00
|
|
|
SHA256State *sha256_new(void) {
|
2022-05-19 21:20:55 +02:00
|
|
|
EVP_MD_CTX *ctx = EVP_MD_CTX_new();
|
|
|
|
EVP_DigestInit(ctx, EVP_sha256());
|
|
|
|
return (SHA256State*)ctx;
|
2019-02-08 19:59:36 +01:00
|
|
|
}
|
|
|
|
|
2022-05-19 21:20:55 +02:00
|
|
|
void sha256_free(SHA256State *st) {
|
|
|
|
EVP_MD_CTX_free((EVP_MD_CTX*)st);
|
2019-02-08 19:59:36 +01:00
|
|
|
}
|
|
|
|
|
2022-05-19 21:20:55 +02:00
|
|
|
void sha256_update(SHA256State *st, const uint8_t *data, size_t len) {
|
|
|
|
EVP_DigestUpdate((EVP_MD_CTX*)st, data, len);
|
2019-02-08 19:59:36 +01:00
|
|
|
}
|
|
|
|
|
2022-05-19 21:20:55 +02:00
|
|
|
void sha256_final(SHA256State *st, uint8_t hash[SHA256_BLOCK_SIZE], size_t hashlen) {
|
2019-02-08 19:59:36 +01:00
|
|
|
assert(hashlen >= SHA256_BLOCK_SIZE);
|
2022-05-25 03:48:44 +02:00
|
|
|
uint osize = 0;
|
|
|
|
EVP_DigestFinal_ex((EVP_MD_CTX*)st, hash, &osize);
|
|
|
|
assert(osize == SHA256_BLOCK_SIZE);
|
2019-02-08 19:59:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void sha256_digest(const uint8_t *data, size_t len, uint8_t hash[SHA256_BLOCK_SIZE], size_t hashlen) {
|
|
|
|
assert(hashlen >= SHA256_BLOCK_SIZE);
|
|
|
|
|
2022-05-19 21:20:55 +02:00
|
|
|
SHA256State *st = sha256_new();
|
|
|
|
sha256_update(st, data, len);
|
|
|
|
sha256_final(st, hash, hashlen);
|
|
|
|
sha256_free(st);
|
2019-02-08 19:59:36 +01:00
|
|
|
}
|
|
|
|
|
2020-08-15 13:51:12 +02:00
|
|
|
void sha256_hexdigest(const uint8_t *data, size_t len, char hash[SHA256_HEXDIGEST_SIZE], size_t hashlen) {
|
|
|
|
assert(hashlen >= SHA256_HEXDIGEST_SIZE);
|
2019-02-08 19:59:36 +01:00
|
|
|
|
|
|
|
uint8_t digest[SHA256_BLOCK_SIZE];
|
|
|
|
sha256_digest(data, len, digest, sizeof(digest));
|
|
|
|
hexdigest(digest, sizeof(digest), hash, hashlen);
|
|
|
|
}
|