mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-06-20 03:44:15 +08:00
Update digest.c
This commit is contained in:
120
src/digest.c
120
src/digest.c
@@ -16,64 +16,102 @@
|
|||||||
#include <gmssl/error.h>
|
#include <gmssl/error.h>
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
const DIGEST *digest_from_name(const char *name)
|
||||||
int oid;
|
{
|
||||||
char *short_name;
|
if (!name) {
|
||||||
char *display_name;
|
error_print();
|
||||||
} DIGEST_TABLE;
|
return NULL;
|
||||||
|
}
|
||||||
DIGEST_TABLE digest_table[] = {
|
if (!strcmp(name, "sm3")) {
|
||||||
{ OID_sm3, "sm3", "SM3" },
|
return DIGEST_sm3();
|
||||||
#ifdef ENABLE_SHA1
|
#ifdef ENABLE_SHA1
|
||||||
{ OID_sha1, "sha1", "SHA-1" },
|
} else if (!strcmp(name, "sha1")) {
|
||||||
|
return DIGEST_sha1();
|
||||||
#endif
|
#endif
|
||||||
#ifdef ENABLE_SHA2
|
#ifdef ENABLE_SHA2
|
||||||
{ OID_sha224, "sha224", "SHA-224" },
|
} else if (!strcmp(name, "sha224")) {
|
||||||
{ OID_sha256, "sha256", "SHA-256" },
|
return DIGEST_sha224();
|
||||||
{ OID_sha384, "sha384", "SHA-384" },
|
} else if (!strcmp(name, "sha256")) {
|
||||||
{ OID_sha512, "sha512", "SHA-512" },
|
return DIGEST_sha256();
|
||||||
|
} else if (!strcmp(name, "sha384")) {
|
||||||
|
return DIGEST_sha384();
|
||||||
|
} else if (!strcmp(name, "sha512")) {
|
||||||
|
return DIGEST_sha512();
|
||||||
|
} else if (!strcmp(name, "sha512-224")) {
|
||||||
|
return DIGEST_sha512_224();
|
||||||
|
} else if (!strcmp(name, "sha512-256")) {
|
||||||
|
return DIGEST_sha512_256();
|
||||||
#endif
|
#endif
|
||||||
};
|
}
|
||||||
|
error_print();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
const char *digest_name(const DIGEST *digest)
|
const char *digest_name(const DIGEST *digest)
|
||||||
{
|
{
|
||||||
int i;
|
if (!digest) {
|
||||||
for (i = 0; i < sizeof(digest_table)/sizeof(digest_table[0]); i++) {
|
error_print();
|
||||||
if (digest->oid == digest_table[i].oid) {
|
return NULL;
|
||||||
return digest_table[i].short_name;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
switch (digest->oid) {
|
||||||
|
case OID_sm3: return "sm3";
|
||||||
|
case OID_sha1: return "sha1";
|
||||||
|
case OID_sha224: return "sha224";
|
||||||
|
case OID_sha256: return "sha256";
|
||||||
|
case OID_sha384: return "sha384";
|
||||||
|
case OID_sha512: return "sha512";
|
||||||
|
case OID_sha512_224: return "sha512-224";
|
||||||
|
case OID_sha512_256: return "sha512-256";
|
||||||
|
}
|
||||||
|
error_print();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int digest_init(DIGEST_CTX *ctx, const DIGEST *algor)
|
int digest_init(DIGEST_CTX *ctx, const DIGEST *algor)
|
||||||
{
|
{
|
||||||
memset(ctx, 0, sizeof(DIGEST_CTX));
|
if (!ctx || !algor || !algor->init) {
|
||||||
if (algor == NULL) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
memset(ctx, 0, sizeof(DIGEST_CTX));
|
||||||
ctx->digest = algor;
|
ctx->digest = algor;
|
||||||
ctx->digest->init(ctx);
|
if (ctx->digest->init(ctx) != 1) {
|
||||||
|
error_print();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int digest_update(DIGEST_CTX *ctx, const uint8_t *data, size_t datalen)
|
int digest_update(DIGEST_CTX *ctx, const uint8_t *data, size_t datalen)
|
||||||
{
|
{
|
||||||
if (data == NULL || datalen == 0) {
|
if (!ctx || !ctx->digest || !ctx->digest->update) {
|
||||||
return 0;
|
error_print();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!data && datalen) {
|
||||||
|
error_print();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!data || !datalen) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (ctx->digest->update(ctx, data, datalen) != 1) {
|
||||||
|
error_print();
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
ctx->digest->update(ctx, data, datalen);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int digest_finish(DIGEST_CTX *ctx, uint8_t *dgst, size_t *dgstlen)
|
int digest_finish(DIGEST_CTX *ctx, uint8_t *dgst, size_t *dgstlen)
|
||||||
{
|
{
|
||||||
if (dgst == NULL || dgstlen == NULL) {
|
if (!ctx || !ctx->digest || !ctx->digest->finish || !dgst || !dgstlen) {
|
||||||
|
error_print();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (ctx->digest->finish(ctx, dgst) != 1) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ctx->digest->finish(ctx, dgst);
|
|
||||||
*dgstlen = ctx->digest->digest_size;
|
*dgstlen = ctx->digest->digest_size;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -83,40 +121,14 @@ int digest(const DIGEST *digest, const uint8_t *data, size_t datalen,
|
|||||||
{
|
{
|
||||||
DIGEST_CTX ctx;
|
DIGEST_CTX ctx;
|
||||||
if (digest_init(&ctx, digest) != 1
|
if (digest_init(&ctx, digest) != 1
|
||||||
|| digest_update(&ctx, data, datalen) < 0
|
|| digest_update(&ctx, data, datalen) != 1
|
||||||
|| digest_finish(&ctx, dgst, dgstlen) != 1) {
|
|| digest_finish(&ctx, dgst, dgstlen) != 1) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memset(&ctx, 0, sizeof(DIGEST_CTX));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const DIGEST *digest_from_name(const char *name)
|
|
||||||
{
|
|
||||||
if (!strcmp(name, "sm3") || !strcmp(name, "SM3")) {
|
|
||||||
return DIGEST_sm3();
|
|
||||||
#ifdef ENABLE_SHA1
|
|
||||||
} else if (!strcmp(name, "sha1") || !strcmp(name, "SHA1")) {
|
|
||||||
return DIGEST_sha1();
|
|
||||||
#endif
|
|
||||||
#ifdef ENABLE_SHA2
|
|
||||||
} else if (!strcmp(name, "sha224") || !strcmp(name, "SHA224")) {
|
|
||||||
return DIGEST_sha224();
|
|
||||||
} else if (!strcmp(name, "sha256") || !strcmp(name, "SHA256")) {
|
|
||||||
return DIGEST_sha256();
|
|
||||||
} else if (!strcmp(name, "sha384") || !strcmp(name, "SHA384")) {
|
|
||||||
return DIGEST_sha384();
|
|
||||||
} else if (!strcmp(name, "sha512") || !strcmp(name, "SHA512")) {
|
|
||||||
return DIGEST_sha512();
|
|
||||||
} else if (!strcmp(name, "sha512-224") || !strcmp(name, "SHA512-224")) {
|
|
||||||
return DIGEST_sha512_224();
|
|
||||||
} else if (!strcmp(name, "sha512-256") || !strcmp(name, "SHA512-256")) {
|
|
||||||
return DIGEST_sha512_256();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _sm3_digest_init(DIGEST_CTX *ctx)
|
static int _sm3_digest_init(DIGEST_CTX *ctx)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user