5#ifndef CRYPTOPP_IMPORTS
25 if (oaepBlockLen % 8 != 0)
32 member_ptr<HashTransformation> pHash(NewHash());
33 const size_t hLen = pHash->DigestSize();
34 const size_t seedLen = hLen, dbLen = oaepBlockLen-seedLen;
35 byte *
const maskedSeed = oaepBlock;
36 byte *
const maskedDB = oaepBlock+seedLen;
38 ConstByteArrayParameter encodingParameters;
42 pHash->CalculateDigest(maskedDB, encodingParameters.
begin(), encodingParameters.
size());
43 std::memset(maskedDB+hLen, 0, dbLen-hLen-inputLength-1);
44 maskedDB[dbLen-inputLength-1] = 0x01;
45 std::memcpy(maskedDB+dbLen-inputLength, input, inputLength);
48 member_ptr<MaskGeneratingFunction> pMGF(NewMGF());
49 pMGF->GenerateAndMask(*pHash, maskedDB, dbLen, maskedSeed, seedLen);
50 pMGF->GenerateAndMask(*pHash, maskedSeed, seedLen, maskedDB, dbLen);
58 if (oaepBlockLen % 8 != 0)
60 invalid = (oaepBlock[0] != 0) || invalid;
65 member_ptr<HashTransformation> pHash(NewHash());
66 const size_t hLen = pHash->DigestSize();
67 const size_t seedLen = hLen, dbLen = oaepBlockLen-seedLen;
69 invalid = (oaepBlockLen < 2*hLen+1) || invalid;
71 SecByteBlock t(oaepBlock, oaepBlockLen);
72 byte *
const maskedSeed = t;
73 byte *
const maskedDB = t+seedLen;
75 member_ptr<MaskGeneratingFunction> pMGF(NewMGF());
76 pMGF->GenerateAndMask(*pHash, maskedSeed, seedLen, maskedDB, dbLen);
77 pMGF->GenerateAndMask(*pHash, maskedDB, dbLen, maskedSeed, seedLen);
79 ConstByteArrayParameter encodingParameters;
83 byte *M = std::find(maskedDB+hLen, maskedDB+dbLen, 0x01);
84 invalid = (M == maskedDB+dbLen) || invalid;
85 invalid = (
FindIfNot(maskedDB+hLen, M,
byte(0)) != M) || invalid;
86 invalid = !pHash->VerifyDigest(maskedDB, encodingParameters.
begin(), encodingParameters.
size()) || invalid;
89 return DecodingResult();
92 std::memcpy(output, M, maskedDB+dbLen-M);
93 return DecodingResult(maskedDB+dbLen-M);
const byte * begin() const
Pointer to the first byte in the memory block.
size_t size() const
Length of the memory block.
Interface for retrieving values given their names.
bool GetValue(const char *name, T &value) const
Get a named value.
size_t MaxUnpaddedLength(size_t paddedLength) const
max size of unpadded message in bytes, given max size of padded message in bits (1 less than size of ...
Interface for random number generators.
virtual void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
T1 SaturatingSubtract(const T1 &a, const T2 &b)
Performs a saturating subtract clamped at 0.
InputIt FindIfNot(InputIt first, InputIt last, const T &value)
Finds first element not in a range.
Crypto++ library namespace.
const char * EncodingParameters()
ConstByteArrayParameter.
Classes for optimal asymmetric encryption padding.
Classes for automatic resource management.
Returns a decoding results.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.