X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=demos%2Fengines%2Frsaref%2Frsaref.c;h=f97974fc497939f3734679abf72d9d320d01f705;hp=f013d59e1bacd4f1e463b30de57302db213a4071;hb=b94f886b22db1da9154bbe236957379fc783c176;hpb=c85a15785475695a98b45de731e5398d46191c40 diff --git a/demos/engines/rsaref/rsaref.c b/demos/engines/rsaref/rsaref.c index f013d59e1b..f97974fc49 100644 --- a/demos/engines/rsaref/rsaref.c +++ b/demos/engines/rsaref/rsaref.c @@ -3,20 +3,34 @@ be found a little here and there. */ #include +#include #include "./source/global.h" #include "./source/rsaref.h" #include "./source/rsa.h" +#include "./source/des.h" #include +#define OPENSSL_NO_MD2 +#define OPENSSL_NO_MD5 +#include #include #include #define RSAREF_LIB_NAME "rsaref engine" #include "rsaref_err.c" -/* Constants used when creating the ENGINE */ +/***************************************************************************** + *** Function declarations and global variable definitions *** + *****************************************************************************/ + +/***************************************************************************** + * Constants used when creating the ENGINE + **/ static const char *engine_rsaref_id = "rsaref"; static const char *engine_rsaref_name = "RSAref engine support"; +/***************************************************************************** + * Functions to handle the engine + **/ static int rsaref_destroy(ENGINE *e); static int rsaref_init(ENGINE *e); static int rsaref_finish(ENGINE *e); @@ -24,6 +38,16 @@ static int rsaref_finish(ENGINE *e); static int rsaref_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)()); #endif +/***************************************************************************** + * Engine commands + **/ +static const ENGINE_CMD_DEFN rsaref_cmd_defns[] = { + {0, NULL, NULL, 0} + }; + +/***************************************************************************** + * RSA functions + **/ static int rsaref_private_decrypt(int len, const unsigned char *from, unsigned char *to, RSA *rsa, int padding); static int rsaref_private_encrypt(int len, const unsigned char *from, @@ -36,10 +60,9 @@ static int bnref_mod_exp(BIGNUM *r,const BIGNUM *a,const BIGNUM *p,const BIGNUM BN_CTX *ctx, BN_MONT_CTX *m_ctx); static int rsaref_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa); -static const ENGINE_CMD_DEFN rsaref_cmd_defns[] = { - {0, NULL, NULL, 0} - }; - +/***************************************************************************** + * Our RSA method + **/ static RSA_METHOD rsaref_rsa = { "RSAref PKCS#1 RSA", @@ -57,7 +80,140 @@ static RSA_METHOD rsaref_rsa = NULL }; -/* Now, to our own code */ +/***************************************************************************** + * Symetric cipher and digest function registrars + **/ +static int rsaref_ciphers(ENGINE *e, const EVP_CIPHER **cipher, + const int **nids, int nid); +static int rsaref_digests(ENGINE *e, const EVP_MD **digest, + const int **nids, int nid); + +static int rsaref_cipher_nids[] = + { NID_des_cbc, NID_des_ede3_cbc, NID_desx_cbc, 0 }; +static int rsaref_digest_nids[] = + { NID_md2, NID_md5, 0 }; + +/***************************************************************************** + * DES functions + **/ +static int cipher_des_cbc_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc); +static int cipher_des_cbc_code(EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, unsigned int inl); +static int cipher_des_cbc_clean(EVP_CIPHER_CTX *); +static int cipher_des_ede3_cbc_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc); +static int cipher_des_ede3_cbc_code(EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, unsigned int inl); +static int cipher_des_ede3_cbc_clean(EVP_CIPHER_CTX *); +static int cipher_desx_cbc_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc); +static int cipher_desx_cbc_code(EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, unsigned int inl); +static int cipher_desx_cbc_clean(EVP_CIPHER_CTX *); + +/***************************************************************************** + * Our DES ciphers + **/ +static const EVP_CIPHER cipher_des_cbc = + { + NID_des_cbc, + 8, 8, 8, + 0 | EVP_CIPH_CBC_MODE, + cipher_des_cbc_init, + cipher_des_cbc_code, + cipher_des_cbc_clean, + sizeof(DES_CBC_CTX), + NULL, + NULL, + NULL, + NULL + }; + +static const EVP_CIPHER cipher_des_ede3_cbc = + { + NID_des_ede3_cbc, + 8, 24, 8, + 0 | EVP_CIPH_CBC_MODE, + cipher_des_ede3_cbc_init, + cipher_des_ede3_cbc_code, + cipher_des_ede3_cbc_clean, + sizeof(DES3_CBC_CTX), + NULL, + NULL, + NULL, + NULL + }; + +static const EVP_CIPHER cipher_desx_cbc = + { + NID_desx_cbc, + 8, 24, 8, + 0 | EVP_CIPH_CBC_MODE, + cipher_desx_cbc_init, + cipher_desx_cbc_code, + cipher_desx_cbc_clean, + sizeof(DESX_CBC_CTX), + NULL, + NULL, + NULL, + NULL + }; + +/***************************************************************************** + * MD functions + **/ +static int digest_md2_init(EVP_MD_CTX *ctx); +static int digest_md2_update(EVP_MD_CTX *ctx,const void *data, + unsigned long count); +static int digest_md2_final(EVP_MD_CTX *ctx,unsigned char *md); +static int digest_md5_init(EVP_MD_CTX *ctx); +static int digest_md5_update(EVP_MD_CTX *ctx,const void *data, + unsigned long count); +static int digest_md5_final(EVP_MD_CTX *ctx,unsigned char *md); + +/***************************************************************************** + * Our MD digests + **/ +static const EVP_MD digest_md2 = + { + NID_md2, + NID_md2WithRSAEncryption, + 16, + 0, + digest_md2_init, + digest_md2_update, + digest_md2_final, + NULL, + NULL, + EVP_PKEY_RSA_method, + 16, + sizeof(MD2_CTX) + }; + +static const EVP_MD digest_md5 = + { + NID_md5, + NID_md5WithRSAEncryption, + 16, + 0, + digest_md5_init, + digest_md5_update, + digest_md5_final, + NULL, + NULL, + EVP_PKEY_RSA_method, + 64, + sizeof(MD5_CTX) + }; + +/***************************************************************************** + *** Function definitions *** + *****************************************************************************/ + +/***************************************************************************** + * Functions to handle the engine + **/ static int bind_rsaref(ENGINE *e) { @@ -65,6 +221,8 @@ static int bind_rsaref(ENGINE *e) if(!ENGINE_set_id(e, engine_rsaref_id) || !ENGINE_set_name(e, engine_rsaref_name) || !ENGINE_set_RSA(e, &rsaref_rsa) + || !ENGINE_set_ciphers(e, rsaref_ciphers) + || !ENGINE_set_digests(e, rsaref_digests) || !ENGINE_set_destroy_function(e, rsaref_destroy) || !ENGINE_set_init_function(e, rsaref_init) || !ENGINE_set_finish_function(e, rsaref_finish) @@ -132,6 +290,10 @@ static int rsaref_destroy(ENGINE *e) return 1; } +/***************************************************************************** + * RSA functions + **/ + static int rsaref_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa) { RSAREFerr(RSAREF_F_RSAREF_MOD_EXP,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); @@ -241,7 +403,7 @@ static int rsaref_private_decrypt(int len, const unsigned char *from, unsigned c if (!RSAref_Private_eay2ref(rsa,&RSAkey)) goto err; - if ((i=RSAPrivateDecrypt(to,&outlen,(unsigned char *)from,len,&RSAkey)) != 0) + if ((i=RSAPrivateDecrypt(to,(unsigned int *)&outlen,(unsigned char *)from,len,&RSAkey)) != 0) { RSAREFerr(RSAREF_F_RSAREF_PRIVATE_DECRYPT,i); outlen= -1; @@ -264,7 +426,7 @@ static int rsaref_private_encrypt(int len, const unsigned char *from, unsigned c } if (!RSAref_Private_eay2ref(rsa,&RSAkey)) goto err; - if ((i=RSAPrivateEncrypt(to,&outlen,(unsigned char *)from,len,&RSAkey)) != 0) + if ((i=RSAPrivateEncrypt(to,(unsigned int *)&outlen,(unsigned char *)from,len,&RSAkey)) != 0) { RSAREFerr(RSAREF_F_RSAREF_PRIVATE_ENCRYPT,i); outlen= -1; @@ -282,7 +444,7 @@ static int rsaref_public_decrypt(int len, const unsigned char *from, unsigned ch if (!RSAref_Public_eay2ref(rsa,&RSAkey)) goto err; - if ((i=RSAPublicDecrypt(to,&outlen,(unsigned char *)from,len,&RSAkey)) != 0) + if ((i=RSAPublicDecrypt(to,(unsigned int *)&outlen,(unsigned char *)from,len,&RSAkey)) != 0) { RSAREFerr(RSAREF_F_RSAREF_PUBLIC_DECRYPT,i); outlen= -1; @@ -319,7 +481,7 @@ static int rsaref_public_encrypt(int len, const unsigned char *from, unsigned ch if (!RSAref_Public_eay2ref(rsa,&RSAkey)) goto err; - if ((i=RSAPublicEncrypt(to,&outlen,(unsigned char *)from,len,&RSAkey,&rnd)) != 0) + if ((i=RSAPublicEncrypt(to,(unsigned int *)&outlen,(unsigned char *)from,len,&RSAkey,&rnd)) != 0) { RSAREFerr(RSAREF_F_RSAREF_PUBLIC_ENCRYPT,i); outlen= -1; @@ -331,3 +493,193 @@ err: memset(&rnd,0,sizeof(rnd)); return(outlen); } + +/***************************************************************************** + * Symetric cipher and digest function registrars + **/ +static int rsaref_ciphers(ENGINE *e, const EVP_CIPHER **cipher, + const int **nids, int nid) + { + int ok = 1; + if(!cipher) + { + /* We are returning a list of supported nids */ + *nids = rsaref_cipher_nids; + return (sizeof(rsaref_cipher_nids)-1)/sizeof(rsaref_cipher_nids[0]); + } + /* We are being asked for a specific cipher */ + switch (nid) + { + case NID_des_cbc: + *cipher = &cipher_des_cbc; break; + case NID_des_ede3_cbc: + *cipher = &cipher_des_ede3_cbc; break; + case NID_desx_cbc: + *cipher = &cipher_desx_cbc; break; + default: + ok = 0; + *cipher = NULL; + break; + } + return ok; + } +static int rsaref_digests(ENGINE *e, const EVP_MD **digest, + const int **nids, int nid) + { + int ok = 1; + if(!digest) + { + /* We are returning a list of supported nids */ + *nids = rsaref_digest_nids; + return (sizeof(rsaref_digest_nids)-1)/sizeof(rsaref_digest_nids[0]); + } + /* We are being asked for a specific digest */ + switch (nid) + { + case NID_md2: + *digest = &digest_md2; break; + case NID_md5: + *digest = &digest_md5; break; + default: + ok = 0; + *digest = NULL; + break; + } + return ok; + } + +/***************************************************************************** + * DES functions + **/ +#undef data +#define data(ctx) ((DES_CBC_CTX *)(ctx)->cipher_data) +static int cipher_des_cbc_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc) + { + DES_CBCInit(data(ctx), (unsigned char *)key, (unsigned char *)iv, enc); + return 1; + } +static int cipher_des_cbc_code(EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, unsigned int inl) + { + int ret = DES_CBCUpdate(data(ctx), out, (unsigned char *)in, inl); + switch (ret) + { + case RE_LEN: + RSAREFerr(RSAREF_F_CIPHER_DES_CBC_CODE,RSAREF_R_LENGTH_NOT_BLOCK_ALIGNED); + break; + case 0: + break; + default: + RSAREFerr(RSAREF_F_CIPHER_DES_CBC_CODE,RSAREF_R_UNKNOWN_FAULT); + } + return !ret; + } +static int cipher_des_cbc_clean(EVP_CIPHER_CTX *ctx) + { + memset(data(ctx), 0, ctx->cipher->ctx_size); + return 1; + } + +#undef data +#define data(ctx) ((DES3_CBC_CTX *)(ctx)->cipher_data) +static int cipher_des_ede3_cbc_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc) + { + DES3_CBCInit(data(ctx), (unsigned char *)key, (unsigned char *)iv, + enc); + return 1; + } +static int cipher_des_ede3_cbc_code(EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, unsigned int inl) + { + int ret = DES3_CBCUpdate(data(ctx), out, (unsigned char *)in, inl); + switch (ret) + { + case RE_LEN: + RSAREFerr(RSAREF_F_CIPHER_DES_CBC_CODE,RSAREF_R_LENGTH_NOT_BLOCK_ALIGNED); + break; + case 0: + break; + default: + RSAREFerr(RSAREF_F_CIPHER_DES_CBC_CODE,RSAREF_R_UNKNOWN_FAULT); + } + return !ret; + } +static int cipher_des_ede3_cbc_clean(EVP_CIPHER_CTX *ctx) + { + memset(data(ctx), 0, ctx->cipher->ctx_size); + return 1; + } + +#undef data +#define data(ctx) ((DESX_CBC_CTX *)(ctx)->cipher_data) +static int cipher_desx_cbc_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc) + { + DESX_CBCInit(data(ctx), (unsigned char *)key, (unsigned char *)iv, + enc); + return 1; + } +static int cipher_desx_cbc_code(EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, unsigned int inl) + { + int ret = DESX_CBCUpdate(data(ctx), out, (unsigned char *)in, inl); + switch (ret) + { + case RE_LEN: + RSAREFerr(RSAREF_F_CIPHER_DES_CBC_CODE,RSAREF_R_LENGTH_NOT_BLOCK_ALIGNED); + break; + case 0: + break; + default: + RSAREFerr(RSAREF_F_CIPHER_DES_CBC_CODE,RSAREF_R_UNKNOWN_FAULT); + } + return !ret; + } +static int cipher_desx_cbc_clean(EVP_CIPHER_CTX *ctx) + { + memset(data(ctx), 0, ctx->cipher->ctx_size); + return 1; + } + +/***************************************************************************** + * MD functions + **/ +#undef data +#define data(ctx) ((MD2_CTX *)(ctx)->md_data) +static int digest_md2_init(EVP_MD_CTX *ctx) + { + MD2Init(data(ctx)); + return 1; + } +static int digest_md2_update(EVP_MD_CTX *ctx,const void *data, + unsigned long count) + { + MD2Update(data(ctx), (unsigned char *)data, (unsigned int)count); + return 1; + } +static int digest_md2_final(EVP_MD_CTX *ctx,unsigned char *md) + { + MD2Final(md, data(ctx)); + return 1; + } + +#undef data +#define data(ctx) ((MD5_CTX *)(ctx)->md_data) +static int digest_md5_init(EVP_MD_CTX *ctx) + { + MD5Init(data(ctx)); + return 1; + } +static int digest_md5_update(EVP_MD_CTX *ctx,const void *data, + unsigned long count) + { + MD5Update(data(ctx), (unsigned char *)data, (unsigned int)count); + return 1; + } +static int digest_md5_final(EVP_MD_CTX *ctx,unsigned char *md) + { + MD5Final(md, data(ctx)); + return 1; + }