Skip to content

Commit

Permalink
gost_md: Rework digest registration, add GostR3411_94_digest
Browse files Browse the repository at this point in the history
Introduce `GOST_digest' to hold digest registration data, and
`GOST_init_digest'/`GOST_deinit_digest` helpers to handle it.

It's single-level templatized.
  • Loading branch information
vt-alt authored and beldmit committed May 13, 2020
1 parent c6b44c8 commit 2893b97
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 22 deletions.
22 changes: 22 additions & 0 deletions gost_lcl.h
Original file line number Diff line number Diff line change
Expand Up @@ -360,5 +360,27 @@ extern GOST_cipher grasshopper_ctr_acpkm_omac_cipher;
extern GOST_cipher magma_kexp15_cipher;
extern GOST_cipher kuznyechik_kexp15_cipher;

struct gost_digest_st {
struct gost_digest_st *template;
int nid;
EVP_MD *digest;
int result_size;
int input_blocksize;
int app_datasize;
int flags;
int (*init)(EVP_MD_CTX *ctx);
int (*update)(EVP_MD_CTX *ctx, const void *data, size_t count);
int (*final)(EVP_MD_CTX *ctx, unsigned char *md);
int (*copy)(EVP_MD_CTX *to, const EVP_MD_CTX *from);
int (*cleanup)(EVP_MD_CTX *ctx);
int (*ctrl)(EVP_MD_CTX *ctx, int cmd, int p1, void *p2);
};
typedef struct gost_digest_st GOST_digest;

EVP_MD *GOST_init_digest(GOST_digest *d);
void GOST_deinit_digest(GOST_digest *d);

extern GOST_digest GostR3411_94_digest;

#endif
/* vim: set expandtab cinoptions=\:0,l1,t0,g0,(0 sw=4 : */
77 changes: 55 additions & 22 deletions gost_md.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,36 +19,68 @@ static int gost_digest_final(EVP_MD_CTX *ctx, unsigned char *md);
static int gost_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from);
static int gost_digest_cleanup(EVP_MD_CTX *ctx);

static EVP_MD *_hidden_GostR3411_94_md = NULL;
GOST_digest GostR3411_94_digest = {
.nid = NID_id_GostR3411_94,
.result_size = 32,
.input_blocksize = 32,
.app_datasize = sizeof(struct ossl_gost_digest_ctx),
.init = gost_digest_init,
.update = gost_digest_update,
.final = gost_digest_final,
.copy = gost_digest_copy,
.cleanup = gost_digest_cleanup,
};

EVP_MD *digest_gost(void)
/*
* Single level template accessor.
* Note: that you cannot template 0 value.
*/
#define TPL(st,field) ( \
((st)->field) ?: TPL_VAL(st,field) \
)

#define TPL_VAL(st,field) ( \
((st)->template ? (st)->template->field : 0) \
)

EVP_MD *GOST_init_digest(GOST_digest *d)
{
if (_hidden_GostR3411_94_md == NULL) {
EVP_MD *md;
if (d->digest)
return d->digest;

if ((md = EVP_MD_meth_new(NID_id_GostR3411_94, NID_undef)) == NULL
|| !EVP_MD_meth_set_result_size(md, 32)
|| !EVP_MD_meth_set_input_blocksize(md, 32)
|| !EVP_MD_meth_set_app_datasize(md,
sizeof(struct
ossl_gost_digest_ctx))
|| !EVP_MD_meth_set_init(md, gost_digest_init)
|| !EVP_MD_meth_set_update(md, gost_digest_update)
|| !EVP_MD_meth_set_final(md, gost_digest_final)
|| !EVP_MD_meth_set_copy(md, gost_digest_copy)
|| !EVP_MD_meth_set_cleanup(md, gost_digest_cleanup)) {
EVP_MD_meth_free(md);
md = NULL;
}
_hidden_GostR3411_94_md = md;
EVP_MD *md;
if (!(md = EVP_MD_meth_new(d->nid, NID_undef))
|| !EVP_MD_meth_set_result_size(md, TPL(d, result_size))
|| !EVP_MD_meth_set_input_blocksize(md, TPL(d, input_blocksize))
|| !EVP_MD_meth_set_app_datasize(md, TPL(d, app_datasize))
|| !EVP_MD_meth_set_flags(md, d->flags | TPL_VAL(d, flags))
|| !EVP_MD_meth_set_init(md, TPL(d, init))
|| !EVP_MD_meth_set_update(md, TPL(d, update))
|| !EVP_MD_meth_set_final(md, TPL(d, final))
|| !EVP_MD_meth_set_copy(md, TPL(d, copy))
|| !EVP_MD_meth_set_cleanup(md, TPL(d, cleanup))
|| !EVP_MD_meth_set_ctrl(md, TPL(d, ctrl))) {
EVP_MD_meth_free(md);
md = NULL;
}
return _hidden_GostR3411_94_md;
d->digest = md;
return md;
}

void GOST_deinit_digest(GOST_digest *d)
{
EVP_MD_meth_free(d->digest);
d->digest = NULL;
}

EVP_MD *digest_gost(void)
{
return GOST_init_digest(&GostR3411_94_digest);
}

void digest_gost_destroy(void)
{
EVP_MD_meth_free(_hidden_GostR3411_94_md);
_hidden_GostR3411_94_md = NULL;
GOST_deinit_digest(&GostR3411_94_digest);
}

int gost_digest_init(EVP_MD_CTX *ctx)
Expand Down Expand Up @@ -89,3 +121,4 @@ int gost_digest_cleanup(EVP_MD_CTX *ctx)
sizeof(struct ossl_gost_digest_ctx));
return 1;
}
/* vim: set expandtab cinoptions=\:0,l1,t0,g0,(0 sw=4 : */

0 comments on commit 2893b97

Please sign in to comment.