Exemplo n.º 1
0
static int rc4_hmac_md5_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
		      const unsigned char *in, size_t len)
	{
	EVP_RC4_HMAC_MD5 *key = data(ctx);
#if defined(STITCHED_CALL)
	size_t	rc4_off = 32-1-(key->ks.x&(32-1)),	/* 32 is $MOD from rc4_md5-x86_64.pl */
		md5_off = MD5_CBLOCK-key->md.num,
		blocks;
	unsigned int l;
	extern unsigned int OPENSSL_ia32cap_P[];
#endif
	size_t	plen = key->payload_length;

	if (plen!=NO_PAYLOAD_LENGTH && len!=(plen+MD5_DIGEST_LENGTH)) return 0;

	if (ctx->encrypt) {
		if (plen==NO_PAYLOAD_LENGTH) plen = len;
#if defined(STITCHED_CALL)
		/* cipher has to "fall behind" */
		if (rc4_off>md5_off) md5_off+=MD5_CBLOCK;

		if (plen>md5_off && (blocks=(plen-md5_off)/MD5_CBLOCK) &&
		    (OPENSSL_ia32cap_P[0]&(1<<20))==0) {
			OpensslMD5_Update(&key->md,in,md5_off);
			RC4(&key->ks,rc4_off,in,out);

			rc4_md5_enc(&key->ks,in+rc4_off,out+rc4_off,
				&key->md,in+md5_off,blocks);
			blocks *= MD5_CBLOCK;
			rc4_off += blocks;
			md5_off += blocks;
			key->md.Nh += blocks>>29;
			key->md.Nl += blocks<<=3;
			if (key->md.Nl<(unsigned int)blocks) key->md.Nh++;
		} else {
Exemplo n.º 2
0
static int update(EVP_MD_CTX *ctx,const void *data,size_t count)
	{ return OpensslMD5_Update(ctx->md_data,data,count); }