| 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);
 | 
| 
 |