MGF1(dbmask, emlen - SHA_DIGEST_LENGTH, seed, SHA_DIGEST_LENGTH); for (i = 0; i < emlen - SHA_DIGEST_LENGTH; i++) db[i] ^= dbmask[i];
MGF1(dbmask, emlen - SHA_DIGEST_LENGTH, seed, SHA_DIGEST_LENGTH); for (i = 0; i < emlen - SHA_DIGEST_LENGTH; i++) db[i] ^= dbmask[i];  MGF1(seedmask, SHA_DIGEST_LENGTH, db, emlen - SHA_DIGEST_LENGTH); for (i = 0; i < SHA_DIGEST_LENGTH; i++) seed[i] ^= seedmask[i];
int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen,	const unsigned char *from, int flen,	const unsigned char *param, int plen)    {    int i, emlen = tlen - 1;    unsigned char *db, *seed;    unsigned char *dbmask, seedmask[SHA_DIGEST_LENGTH];    if (flen > emlen - 2 * SHA_DIGEST_LENGTH - 1)	{	RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_OAEP,	       RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE);	return (0);	}    if (emlen < 2 * SHA_DIGEST_LENGTH + 1)	{	RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_OAEP, RSA_R_KEY_SIZE_TOO_SMALL);	return (0);	}        dbmask = OPENSSL_malloc(emlen - SHA_DIGEST_LENGTH);    if (dbmask == NULL)	{	RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_OAEP, ERR_R_MALLOC_FAILURE);	return (0);	}    to[0] = 0;    seed = to + 1;    db = to + SHA_DIGEST_LENGTH + 1;    EVP_Digest((void *)param, plen, db, NULL, EVP_sha1());    memset(db + SHA_DIGEST_LENGTH, 0,	   emlen - flen - 2 * SHA_DIGEST_LENGTH - 1);    db[emlen - flen - SHA_DIGEST_LENGTH - 1] = 0x01;    memcpy(db + emlen - flen - SHA_DIGEST_LENGTH, from, (unsigned int) flen);    if (RAND_bytes(seed, SHA_DIGEST_LENGTH) <= 0)    	return (0);#ifdef PKCS_TESTVECT    memcpy(seed,	   "\xaa\xfd\x12\xf6\x59\xca\xe6\x34\x89\xb4\x79\xe5\x07\x6d\xde\xc2\xf0\x6c\xb5\x8f",	   20);#endif    MGF1(dbmask, emlen - SHA_DIGEST_LENGTH, seed, SHA_DIGEST_LENGTH);    for (i = 0; i < emlen - SHA_DIGEST_LENGTH; i++)	db[i] ^= dbmask[i];    MGF1(seedmask, SHA_DIGEST_LENGTH, db, emlen - SHA_DIGEST_LENGTH);    for (i = 0; i < SHA_DIGEST_LENGTH; i++)	seed[i] ^= seedmask[i];    OPENSSL_free(dbmask);    return (1);    }