@ -78,7 +78,7 @@ void cl_cleanup_crypto(void)
unsigned char * cl_hash_data ( char * alg , const void * buf , size_t len , unsigned char * obuf , unsigned int * olen )
{
EVP_MD_CTX ctx ;
EVP_MD_CTX * ctx ;
unsigned char * ret ;
size_t mdsz ;
const EVP_MD * md ;
@ -95,43 +95,54 @@ unsigned char *cl_hash_data(char *alg, const void *buf, size_t len, unsigned cha
if ( ! ( ret ) )
return NULL ;
if ( ! EVP_DigestInit ( & ctx , md ) ) {
ctx = EVP_MD_CTX_create ( ) ;
if ( ! ( ctx ) ) {
if ( ! ( obuf ) )
free ( ret ) ;
return NULL ;
}
if ( ! EVP_DigestInit_ex ( ctx , md , NULL ) ) {
if ( ! ( obuf ) )
free ( ret ) ;
if ( ( olen ) )
* olen = 0 ;
EVP_MD_CTX_destroy ( ctx ) ;
return NULL ;
}
cur = 0 ;
while ( cur < len ) {
size_t todo = MIN ( EVP_MD_block_size ( md ) , len - cur ) ;
if ( ! EVP_DigestUpdate ( & ctx , ( void * ) ( ( ( unsigned char * ) buf ) + cur ) , todo ) ) {
if ( ! EVP_DigestUpdate ( ctx , ( void * ) ( ( ( unsigned char * ) buf ) + cur ) , todo ) ) {
if ( ! ( obuf ) )
free ( ret ) ;
if ( ( olen ) )
* olen = 0 ;
EVP_MD_CTX_destroy ( ctx ) ;
return NULL ;
}
cur + = todo ;
}
if ( ! EVP_DigestFinal ( & ctx , ret , & i ) ) {
if ( ! EVP_DigestFinal_ex ( ctx , ret , & i ) ) {
if ( ! ( obuf ) )
free ( ret ) ;
if ( ( olen ) )
* olen = 0 ;
EVP_MD_CTX_destroy ( ctx ) ;
return NULL ;
}
EVP_MD_CTX_cleanup ( & ctx ) ;
EVP_MD_CTX_destroy ( ctx ) ;
if ( ( olen ) )
* olen = i ;
@ -141,7 +152,7 @@ unsigned char *cl_hash_data(char *alg, const void *buf, size_t len, unsigned cha
unsigned char * cl_hash_file_fd ( int fd , char * alg , unsigned int * olen )
{
EVP_MD_CTX ctx ;
EVP_MD_CTX * ctx ;
const EVP_MD * md ;
unsigned char * res ;
@ -149,11 +160,17 @@ unsigned char *cl_hash_file_fd(int fd, char *alg, unsigned int *olen)
if ( ! ( md ) )
return NULL ;
if ( ! EVP_DigestInit ( & ctx , md ) ) {
ctx = EVP_MD_CTX_create ( ) ;
if ( ! ( ctx ) )
return NULL ;
if ( ! EVP_DigestInit_ex ( ctx , md , NULL ) ) {
EVP_MD_CTX_destroy ( ctx ) ;
return NULL ;
}
res = cl_hash_file_fd_ctx ( & ctx , fd , olen ) ;
res = cl_hash_file_fd_ctx ( ctx , fd , olen ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return res ;
}
@ -210,15 +227,13 @@ unsigned char *cl_hash_file_fd_ctx(EVP_MD_CTX *ctx, int fd, unsigned int *olen)
}
}
if ( ! EVP_DigestFinal ( ctx , hash , & hashlen ) ) {
if ( ! EVP_DigestFinal_ex ( ctx , hash , & hashlen ) ) {
free ( hash ) ;
free ( buf ) ;
return NULL ;
}
EVP_MD_CTX_cleanup ( ctx ) ;
if ( ( olen ) )
* olen = hashlen ;
@ -244,7 +259,7 @@ unsigned char *cl_sha1(const void *buf, size_t len, unsigned char *obuf, unsigne
int cl_verify_signature_hash ( EVP_PKEY * pkey , char * alg , unsigned char * sig , unsigned int siglen , unsigned char * digest )
{
EVP_MD_CTX ctx ;
EVP_MD_CTX * ctx ;
const EVP_MD * md ;
size_t mdsz ;
@ -252,26 +267,34 @@ int cl_verify_signature_hash(EVP_PKEY *pkey, char *alg, unsigned char *sig, unsi
if ( ! ( md ) )
return - 1 ;
ctx = EVP_MD_CTX_create ( ) ;
if ( ! ( ctx ) )
return - 1 ;
mdsz = EVP_MD_size ( md ) ;
if ( ! EVP_VerifyInit ( & ctx , md ) ) {
if ( ! EVP_VerifyInit_ex ( ctx , md , NULL ) ) {
EVP_MD_CTX_destroy ( ctx ) ;
return - 1 ;
}
if ( ! EVP_VerifyUpdate ( & ctx , digest , mdsz ) ) {
if ( ! EVP_VerifyUpdate ( ctx , digest , mdsz ) ) {
EVP_MD_CTX_destroy ( ctx ) ;
return - 1 ;
}
if ( EVP_VerifyFinal ( & ctx , sig , siglen , pkey ) ! = 0 ) {
if ( EVP_VerifyFinal ( ctx , sig , siglen , pkey ) ! = 0 ) {
EVP_MD_CTX_destroy ( ctx ) ;
return - 1 ;
}
EVP_MD_CTX_destroy ( ctx ) ;
return 0 ;
}
int cl_verify_signature_fd ( EVP_PKEY * pkey , char * alg , unsigned char * sig , unsigned int siglen , int fd )
{
EVP_MD_CTX ctx ;
EVP_MD_CTX * ctx ;
const EVP_MD * md ;
size_t mdsz ;
unsigned char * digest ;
@ -281,33 +304,45 @@ int cl_verify_signature_fd(EVP_PKEY *pkey, char *alg, unsigned char *sig, unsign
return - 1 ;
md = EVP_get_digestbyname ( alg ) ;
if ( ! ( md ) )
if ( ! ( md ) ) {
free ( digest ) ;
return - 1 ;
}
mdsz = EVP_MD_size ( md ) ;
if ( ! EVP_VerifyInit ( & ctx , md ) ) {
ctx = EVP_MD_CTX_create ( ) ;
if ( ! ( ctx ) ) {
free ( digest ) ;
return - 1 ;
}
if ( ! EVP_VerifyUpdate ( & ctx , digest , mdsz ) ) {
if ( ! EVP_VerifyInit_ex ( ctx , md , NULL ) ) {
free ( digest ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return - 1 ;
}
if ( EVP_VerifyFinal ( & ctx , sig , siglen , pkey ) ! = 0 ) {
if ( ! EVP_VerifyUpdate ( ctx , digest , mdsz ) ) {
free ( digest ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return - 1 ;
}
if ( EVP_VerifyFinal ( ctx , sig , siglen , pkey ) ! = 0 ) {
free ( digest ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return - 1 ;
}
free ( digest ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return 0 ;
}
int cl_verify_signature ( EVP_PKEY * pkey , char * alg , unsigned char * sig , unsigned int siglen , unsigned char * data , size_t datalen , int decode )
{
EVP_MD_CTX ctx ;
EVP_MD_CTX * ctx ;
const EVP_MD * md ;
size_t mdsz ;
unsigned char * digest ;
@ -343,27 +378,39 @@ int cl_verify_signature(EVP_PKEY *pkey, char *alg, unsigned char *sig, unsigned
mdsz = EVP_MD_size ( md ) ;
if ( ! EVP_VerifyInit ( & ctx , md ) ) {
ctx = EVP_MD_CTX_create ( ) ;
if ( ! ( ctx ) ) {
free ( digest ) ;
if ( decode )
free ( sig ) ;
return - 1 ;
}
if ( ! EVP_VerifyInit_ex ( ctx , md , NULL ) ) {
free ( digest ) ;
if ( decode )
free ( sig ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return - 1 ;
}
if ( ! EVP_VerifyUpdate ( & ctx , digest , mdsz ) ) {
if ( ! EVP_VerifyUpdate ( ctx , digest , mdsz ) ) {
free ( digest ) ;
if ( decode )
free ( sig ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return - 1 ;
}
if ( EVP_VerifyFinal ( & ctx , sig , siglen , pkey ) ! = 0 ) {
if ( EVP_VerifyFinal ( ctx , sig , siglen , pkey ) ! = 0 ) {
free ( digest ) ;
if ( decode )
free ( sig ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return - 1 ;
}
@ -371,6 +418,7 @@ int cl_verify_signature(EVP_PKEY *pkey, char *alg, unsigned char *sig, unsigned
free ( sig ) ;
free ( digest ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return 0 ;
}
@ -528,7 +576,7 @@ unsigned char *cl_sign_data_keyfile(char *keypath, char *alg, unsigned char *has
unsigned char * cl_sign_data ( EVP_PKEY * pkey , char * alg , unsigned char * hash , unsigned int * olen , int encode )
{
EVP_MD_CTX ctx ;
EVP_MD_CTX * ctx ;
const EVP_MD * md ;
unsigned int siglen ;
unsigned char * sig ;
@ -537,27 +585,35 @@ unsigned char *cl_sign_data(EVP_PKEY *pkey, char *alg, unsigned char *hash, unsi
if ( ! ( md ) )
return NULL ;
ctx = EVP_MD_CTX_create ( ) ;
if ( ! ( ctx ) )
return NULL ;
sig = ( unsigned char * ) calloc ( 1 , EVP_PKEY_size ( pkey ) ) ;
if ( ! ( sig ) ) {
free ( hash ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return NULL ;
}
if ( ! EVP_SignInit ( & ctx , md ) ) {
if ( ! EVP_SignInit_ex ( ctx , md , NULL ) ) {
free ( sig ) ;
free ( hash ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return NULL ;
}
if ( ! EVP_SignUpdate ( & ctx , hash , EVP_MD_size ( md ) ) ) {
if ( ! EVP_SignUpdate ( ctx , hash , EVP_MD_size ( md ) ) ) {
free ( sig ) ;
free ( hash ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return NULL ;
}
if ( ! EVP_SignFinal ( & ctx , sig , & siglen , pkey ) ) {
if ( ! EVP_SignFinal ( ctx , sig , & siglen , pkey ) ) {
free ( sig ) ;
free ( hash ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return NULL ;
}
@ -566,6 +622,7 @@ unsigned char *cl_sign_data(EVP_PKEY *pkey, char *alg, unsigned char *hash, unsi
if ( ! ( newsig ) ) {
free ( sig ) ;
free ( hash ) ;
EVP_MD_CTX_destroy ( ctx ) ;
return NULL ;
}
@ -577,6 +634,7 @@ unsigned char *cl_sign_data(EVP_PKEY *pkey, char *alg, unsigned char *hash, unsi
free ( hash ) ;
* olen = siglen ;
EVP_MD_CTX_destroy ( ctx ) ;
return sig ;
}