I have developed an openssl engine which replaces the AES implementation.
Currently, I am trying to replace the HMAC-SHA1 implementation. I would like
some advice whether my implementation is correct. Below is my sample code:
///////////////////////////////////////////////////////////
static int engine_digest_nids [] = { NID_sha1 };
static int engine_digest_nids_num = 1;
#define MYENGINE_ID "myengine"
#define MYENGINE_NAME "my custom engine"
const EVP_MD myengine_sha1 =
{
NID_sha1,
NID_undef,
SHA_DIGEST_LENGTH,
0,
myengine_digest_init,
myengine_digest_update,
myengine_digest_final,
NULL,
myengine_digest_cleanup,
EVP_PKEY_NULL_method,
SHA_CBLOCK,
sizeof(EVP_MD *) + sizeof(SHA_CTX),
}
void ENGINE_load_myengine(void)
{
ENGINE *eng = ENGINE_myengine();
if(!eng) return;
ENGINE_add(eng);
ENGINE_free(eng);
ERR_clear_error();
}
static int myengine_finish(ENGINE *e)
{
return 1;
}
static int myengine_init(ENGINE *e)
{
return 1;
}
static int myengine_bind_helper(ENGINE *e)
{
if(!ENGINE_set_id(e, MYENGINE_ID) ||
!ENGINE_set_name(e, MYENGINE_NAME) ||
!ENGINE_set_init_function(e, myengine_init) ||
!ENGINE_set_finish(e, myengine_finish) ||
!ENGINE_set_ciphers(e, myengine_ciphers) ||
!ENGINE_set_digests(e, myengine_engine_digests))
{
return 0;
}
return 1;
}
static ENGINE *ENGINE_myengine(void)
{
ENGINE *eng = ENGINE_new();
if(!eng)
{
return NULL;
}
if(!myengine_bind_helper(eng))
{
ENGINE_free(eng);
return NULL;
}
return eng;
}
static int myengine_digest_init(EVP_MD_CTX *ctx)
{
memset(ctx->md_data, 0, ctx->digest->md_size);
return 1;
}
static int myengine_digest_update(EVP_MD_CTX *ctx, const void *data, size_t
count)
{
ctx->md_data = OPENSSL_malloc(ctx->digest->md_size);
myengine_hmac_sha1(data, count, ctx->md_data);
return 1;
}
static int myengine_digest_final(EVP_MD_CTX *ctx, unsigned char *md)
{
memcpy(md, ctx->md_data, ctx->digest->md_size);
return 1;
}
static int myengine_digest_cleanup(EVP_MD_CTX *ctx)
{
OPENSSL_free(ctx->md_data);
ctx->md_data = NULL;
return 1;
}
static int myengine_engine_digests(ENGINE *e, const EVP_MD **digest, const
int **nids, int nid)
{
if(!digest)
{
*nids = engine_digest_nids;
return engine_digest_nids_num;
}
switch(nid)
{
case NID_sha1:
*digest = &myengine_sha1;
break;
default:
*digest = NULL;
break;
}
return (*digest != NULL);
}
--
View this message in context:
http://openssl.6102.n7.nabble.com/Need-guidance-to-replace-HMAC-SHA1-implementation-via-engine-tp46365.html
Sent from the OpenSSL - Dev mailing list archive at Nabble.com.
______________________________________________________________________
OpenSSL Project http://www.openssl.org
Development Mailing List [email protected]
Automated List Manager [email protected]