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 {
static int update(EVP_MD_CTX *ctx,const void *data,size_t count) { return OpensslMD5_Update(ctx->md_data,data,count); }