| Index: openssl/crypto/evp/evp_locl.h
|
| ===================================================================
|
| --- openssl/crypto/evp/evp_locl.h (revision 105093)
|
| +++ openssl/crypto/evp/evp_locl.h (working copy)
|
| @@ -61,38 +61,66 @@
|
| /* Wrapper functions for each cipher mode */
|
|
|
| #define BLOCK_CIPHER_ecb_loop() \
|
| - unsigned int i, bl; \
|
| + size_t i, bl; \
|
| bl = ctx->cipher->block_size;\
|
| if(inl < bl) return 1;\
|
| inl -= bl; \
|
| for(i=0; i <= inl; i+=bl)
|
|
|
| #define BLOCK_CIPHER_func_ecb(cname, cprefix, kstruct, ksched) \
|
| -static int cname##_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \
|
| +static int cname##_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \
|
| {\
|
| BLOCK_CIPHER_ecb_loop() \
|
| cprefix##_ecb_encrypt(in + i, out + i, &((kstruct *)ctx->cipher_data)->ksched, ctx->encrypt);\
|
| return 1;\
|
| }
|
|
|
| +#define EVP_MAXCHUNK ((size_t)1<<(sizeof(long)*8-2))
|
| +
|
| #define BLOCK_CIPHER_func_ofb(cname, cprefix, cbits, kstruct, ksched) \
|
| -static int cname##_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \
|
| +static int cname##_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \
|
| {\
|
| - cprefix##_ofb##cbits##_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num);\
|
| + while(inl>=EVP_MAXCHUNK)\
|
| + {\
|
| + cprefix##_ofb##cbits##_encrypt(in, out, (long)EVP_MAXCHUNK, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num);\
|
| + inl-=EVP_MAXCHUNK;\
|
| + in +=EVP_MAXCHUNK;\
|
| + out+=EVP_MAXCHUNK;\
|
| + }\
|
| + if (inl)\
|
| + cprefix##_ofb##cbits##_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num);\
|
| return 1;\
|
| }
|
|
|
| #define BLOCK_CIPHER_func_cbc(cname, cprefix, kstruct, ksched) \
|
| -static int cname##_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \
|
| +static int cname##_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \
|
| {\
|
| - cprefix##_cbc_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, ctx->encrypt);\
|
| + while(inl>=EVP_MAXCHUNK) \
|
| + {\
|
| + cprefix##_cbc_encrypt(in, out, (long)EVP_MAXCHUNK, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, ctx->encrypt);\
|
| + inl-=EVP_MAXCHUNK;\
|
| + in +=EVP_MAXCHUNK;\
|
| + out+=EVP_MAXCHUNK;\
|
| + }\
|
| + if (inl)\
|
| + cprefix##_cbc_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, ctx->encrypt);\
|
| return 1;\
|
| }
|
|
|
| #define BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \
|
| -static int cname##_cfb##cbits##_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \
|
| +static int cname##_cfb##cbits##_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \
|
| {\
|
| - cprefix##_cfb##cbits##_encrypt(in, out, (long)((cbits==1) && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) ?inl*8:inl), &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num, ctx->encrypt);\
|
| + size_t chunk=EVP_MAXCHUNK;\
|
| + if (cbits==1) chunk>>=3;\
|
| + if (inl<chunk) chunk=inl;\
|
| + while(inl && inl>=chunk)\
|
| + {\
|
| + cprefix##_cfb##cbits##_encrypt(in, out, (long)((cbits==1) && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) ?inl*8:inl), &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num, ctx->encrypt);\
|
| + inl-=chunk;\
|
| + in +=chunk;\
|
| + out+=chunk;\
|
| + if(inl<chunk) chunk=inl;\
|
| + }\
|
| return 1;\
|
| }
|
|
|
| @@ -226,27 +254,92 @@
|
|
|
| #define EVP_C_DATA(kstruct, ctx) ((kstruct *)(ctx)->cipher_data)
|
|
|
| -#define IMPLEMENT_CFBR(cipher,cprefix,kstruct,ksched,keysize,cbits,iv_len,fl) \
|
| +#define IMPLEMENT_CFBR(cipher,cprefix,kstruct,ksched,keysize,cbits,iv_len) \
|
| BLOCK_CIPHER_func_cfb(cipher##_##keysize,cprefix,cbits,kstruct,ksched) \
|
| BLOCK_CIPHER_def_cfb(cipher##_##keysize,kstruct, \
|
| NID_##cipher##_##keysize, keysize/8, iv_len, cbits, \
|
| - (fl)|EVP_CIPH_FLAG_DEFAULT_ASN1, \
|
| - cipher##_init_key, NULL, NULL, NULL, NULL)
|
| + 0, cipher##_init_key, NULL, \
|
| + EVP_CIPHER_set_asn1_iv, \
|
| + EVP_CIPHER_get_asn1_iv, \
|
| + NULL)
|
|
|
| -#ifdef OPENSSL_FIPS
|
| -#define RC2_set_key private_RC2_set_key
|
| -#define RC4_set_key private_RC4_set_key
|
| -#define CAST_set_key private_CAST_set_key
|
| -#define RC5_32_set_key private_RC5_32_set_key
|
| -#define BF_set_key private_BF_set_key
|
| -#define Camellia_set_key private_Camellia_set_key
|
| -#define idea_set_encrypt_key private_idea_set_encrypt_key
|
| +struct evp_pkey_ctx_st
|
| + {
|
| + /* Method associated with this operation */
|
| + const EVP_PKEY_METHOD *pmeth;
|
| + /* Engine that implements this method or NULL if builtin */
|
| + ENGINE *engine;
|
| + /* Key: may be NULL */
|
| + EVP_PKEY *pkey;
|
| + /* Peer key for key agreement, may be NULL */
|
| + EVP_PKEY *peerkey;
|
| + /* Actual operation */
|
| + int operation;
|
| + /* Algorithm specific data */
|
| + void *data;
|
| + /* Application specific data */
|
| + void *app_data;
|
| + /* Keygen callback */
|
| + EVP_PKEY_gen_cb *pkey_gencb;
|
| + /* implementation specific keygen data */
|
| + int *keygen_info;
|
| + int keygen_info_count;
|
| + } /* EVP_PKEY_CTX */;
|
|
|
| -#define MD5_Init private_MD5_Init
|
| -#define MD4_Init private_MD4_Init
|
| -#define MD2_Init private_MD2_Init
|
| -#define MDC2_Init private_MDC2_Init
|
| -#define SHA_Init private_SHA_Init
|
| +#define EVP_PKEY_FLAG_DYNAMIC 1
|
|
|
| -#endif
|
| +struct evp_pkey_method_st
|
| + {
|
| + int pkey_id;
|
| + int flags;
|
|
|
| + int (*init)(EVP_PKEY_CTX *ctx);
|
| + int (*copy)(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src);
|
| + void (*cleanup)(EVP_PKEY_CTX *ctx);
|
| +
|
| + int (*paramgen_init)(EVP_PKEY_CTX *ctx);
|
| + int (*paramgen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey);
|
| +
|
| + int (*keygen_init)(EVP_PKEY_CTX *ctx);
|
| + int (*keygen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey);
|
| +
|
| + int (*sign_init)(EVP_PKEY_CTX *ctx);
|
| + int (*sign)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
|
| + const unsigned char *tbs, size_t tbslen);
|
| +
|
| + int (*verify_init)(EVP_PKEY_CTX *ctx);
|
| + int (*verify)(EVP_PKEY_CTX *ctx,
|
| + const unsigned char *sig, size_t siglen,
|
| + const unsigned char *tbs, size_t tbslen);
|
| +
|
| + int (*verify_recover_init)(EVP_PKEY_CTX *ctx);
|
| + int (*verify_recover)(EVP_PKEY_CTX *ctx,
|
| + unsigned char *rout, size_t *routlen,
|
| + const unsigned char *sig, size_t siglen);
|
| +
|
| + int (*signctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx);
|
| + int (*signctx)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
|
| + EVP_MD_CTX *mctx);
|
| +
|
| + int (*verifyctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx);
|
| + int (*verifyctx)(EVP_PKEY_CTX *ctx, const unsigned char *sig,int siglen,
|
| + EVP_MD_CTX *mctx);
|
| +
|
| + int (*encrypt_init)(EVP_PKEY_CTX *ctx);
|
| + int (*encrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen,
|
| + const unsigned char *in, size_t inlen);
|
| +
|
| + int (*decrypt_init)(EVP_PKEY_CTX *ctx);
|
| + int (*decrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen,
|
| + const unsigned char *in, size_t inlen);
|
| +
|
| + int (*derive_init)(EVP_PKEY_CTX *ctx);
|
| + int (*derive)(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen);
|
| +
|
| + int (*ctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2);
|
| + int (*ctrl_str)(EVP_PKEY_CTX *ctx, const char *type, const char *value);
|
| +
|
| +
|
| + } /* EVP_PKEY_METHOD */;
|
| +
|
| +void evp_pkey_set_cb_translate(BN_GENCB *cb, EVP_PKEY_CTX *ctx);
|
|
|