summaryrefslogtreecommitdiff
path: root/oaep.cpp
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2015-11-05 01:59:46 -0500
committerJeffrey Walton <noloader@gmail.com>2015-11-05 01:59:46 -0500
commit48809d4e85c125814425c621d8d0d89f95405924 (patch)
tree1010fd16c4b1199f3d27dd726dda241a2bd29f83 /oaep.cpp
parent025337a94aceb75d188149db70c2094673772816 (diff)
downloadcryptopp-git-48809d4e85c125814425c621d8d0d89f95405924.tar.gz
CRYPTOPP 5.6.3 RC6 checkin
Diffstat (limited to 'oaep.cpp')
-rw-r--r--oaep.cpp202
1 files changed, 98 insertions, 104 deletions
diff --git a/oaep.cpp b/oaep.cpp
index ad383788..64984f87 100644
--- a/oaep.cpp
+++ b/oaep.cpp
@@ -1,104 +1,98 @@
-// oaep.cpp - written and placed in the public domain by Wei Dai
-
-#include "pch.h"
-
-#ifndef CRYPTOPP_IMPORTS
-
-#include "cryptlib.h"
-#include "stdcpp.h"
-#include "smartptr.h"
-#include "oaep.h"
-
-NAMESPACE_BEGIN(CryptoPP)
-
-// ********************************************************
-
-size_t OAEP_Base::MaxUnpaddedLength(size_t paddedLength) const
-{
- return SaturatingSubtract(paddedLength/8, 1+2*DigestSize());
-}
-
-void OAEP_Base::Pad(RandomNumberGenerator &rng, const byte *input, size_t inputLength, byte *oaepBlock, size_t oaepBlockLen, const NameValuePairs &parameters) const
-{
- CRYPTOPP_ASSERT (inputLength <= MaxUnpaddedLength(oaepBlockLen));
-
- using CryptoPP::auto_ptr;
- auto_ptr<HashTransformation> pHash(NewHash());
-
- // convert from bit length to byte length
- if (oaepBlockLen % 8 != 0)
- {
- oaepBlock[0] = 0;
- oaepBlock++;
- }
- oaepBlockLen /= 8;
-
- const size_t hLen = pHash->DigestSize();
- const size_t seedLen = hLen, dbLen = oaepBlockLen-seedLen;
- byte *const maskedSeed = oaepBlock;
- byte *const maskedDB = oaepBlock+seedLen;
-
- ConstByteArrayParameter encodingParameters;
- parameters.GetValue(Name::EncodingParameters(), encodingParameters);
-
- // DB = pHash || 00 ... || 01 || M
- pHash->CalculateDigest(maskedDB, encodingParameters.begin(), encodingParameters.size());
- memset(maskedDB+hLen, 0, dbLen-hLen-inputLength-1);
- maskedDB[dbLen-inputLength-1] = 0x01;
- memcpy(maskedDB+dbLen-inputLength, input, inputLength);
-
- auto_ptr<MaskGeneratingFunction> pMGF(NewMGF());
- rng.GenerateBlock(maskedSeed, seedLen);
- pMGF->GenerateAndMask(*pHash, maskedDB, dbLen, maskedSeed, seedLen);
- pMGF->GenerateAndMask(*pHash, maskedSeed, seedLen, maskedDB, dbLen);
-}
-
-DecodingResult OAEP_Base::Unpad(const byte *oaepBlock, size_t oaepBlockLen, byte *output, const NameValuePairs &parameters) const
-{
- bool invalid = false;
-
- using CryptoPP::auto_ptr;
- auto_ptr<HashTransformation> pHash(NewHash());
-
- // convert from bit length to byte length
- if (oaepBlockLen % 8 != 0)
- {
- invalid = (oaepBlock[0] != 0) || invalid;
- oaepBlock++;
- }
- oaepBlockLen /= 8;
-
- const size_t hLen = pHash->DigestSize();
- const size_t seedLen = hLen, dbLen = oaepBlockLen-seedLen;
-
- invalid = (oaepBlockLen < 2*hLen+1) || invalid;
-
- SecByteBlock t(oaepBlock, oaepBlockLen);
- byte *const maskedSeed = t;
- byte *const maskedDB = t+seedLen;
-
-
- auto_ptr<MaskGeneratingFunction> pMGF(NewMGF());
- pMGF->GenerateAndMask(*pHash, maskedSeed, seedLen, maskedDB, dbLen);
- pMGF->GenerateAndMask(*pHash, maskedDB, dbLen, maskedSeed, seedLen);
-
- ConstByteArrayParameter encodingParameters;
- parameters.GetValue(Name::EncodingParameters(), encodingParameters);
-
- // DB = pHash' || 00 ... || 01 || M
- byte *M = std::find(maskedDB+hLen, maskedDB+dbLen, 0x01);
- invalid = (M == maskedDB+dbLen) || invalid;
- invalid = (std::find_if (maskedDB+hLen, M, std::bind2nd(std::not_equal_to<byte>(), byte(0))) != M) || invalid;
- invalid = !pHash->VerifyDigest(maskedDB, encodingParameters.begin(), encodingParameters.size()) || invalid;
-
- if (invalid)
- return DecodingResult();
-
- M++;
- memcpy(output, M, maskedDB+dbLen-M);
- return DecodingResult(maskedDB+dbLen-M);
-}
-
-NAMESPACE_END
-
-#endif
+// oaep.cpp - written and placed in the public domain by Wei Dai
+
+#include "pch.h"
+
+#ifndef CRYPTOPP_IMPORTS
+
+#include "oaep.h"
+#include "stdcpp.h"
+#include "smartptr.h"
+
+NAMESPACE_BEGIN(CryptoPP)
+
+// ********************************************************
+
+size_t OAEP_Base::MaxUnpaddedLength(size_t paddedLength) const
+{
+ return SaturatingSubtract(paddedLength/8, 1+2*DigestSize());
+}
+
+void OAEP_Base::Pad(RandomNumberGenerator &rng, const byte *input, size_t inputLength, byte *oaepBlock, size_t oaepBlockLen, const NameValuePairs &parameters) const
+{
+ assert (inputLength <= MaxUnpaddedLength(oaepBlockLen));
+
+ // convert from bit length to byte length
+ if (oaepBlockLen % 8 != 0)
+ {
+ oaepBlock[0] = 0;
+ oaepBlock++;
+ }
+ oaepBlockLen /= 8;
+
+ member_ptr<HashTransformation> pHash(NewHash());
+ const size_t hLen = pHash->DigestSize();
+ const size_t seedLen = hLen, dbLen = oaepBlockLen-seedLen;
+ byte *const maskedSeed = oaepBlock;
+ byte *const maskedDB = oaepBlock+seedLen;
+
+ ConstByteArrayParameter encodingParameters;
+ parameters.GetValue(Name::EncodingParameters(), encodingParameters);
+
+ // DB = pHash || 00 ... || 01 || M
+ pHash->CalculateDigest(maskedDB, encodingParameters.begin(), encodingParameters.size());
+ memset(maskedDB+hLen, 0, dbLen-hLen-inputLength-1);
+ maskedDB[dbLen-inputLength-1] = 0x01;
+ memcpy(maskedDB+dbLen-inputLength, input, inputLength);
+
+ rng.GenerateBlock(maskedSeed, seedLen);
+ member_ptr<MaskGeneratingFunction> pMGF(NewMGF());
+ pMGF->GenerateAndMask(*pHash, maskedDB, dbLen, maskedSeed, seedLen);
+ pMGF->GenerateAndMask(*pHash, maskedSeed, seedLen, maskedDB, dbLen);
+}
+
+DecodingResult OAEP_Base::Unpad(const byte *oaepBlock, size_t oaepBlockLen, byte *output, const NameValuePairs &parameters) const
+{
+ bool invalid = false;
+
+ // convert from bit length to byte length
+ if (oaepBlockLen % 8 != 0)
+ {
+ invalid = (oaepBlock[0] != 0) || invalid;
+ oaepBlock++;
+ }
+ oaepBlockLen /= 8;
+
+ member_ptr<HashTransformation> pHash(NewHash());
+ const size_t hLen = pHash->DigestSize();
+ const size_t seedLen = hLen, dbLen = oaepBlockLen-seedLen;
+
+ invalid = (oaepBlockLen < 2*hLen+1) || invalid;
+
+ SecByteBlock t(oaepBlock, oaepBlockLen);
+ byte *const maskedSeed = t;
+ byte *const maskedDB = t+seedLen;
+
+ member_ptr<MaskGeneratingFunction> pMGF(NewMGF());
+ pMGF->GenerateAndMask(*pHash, maskedSeed, seedLen, maskedDB, dbLen);
+ pMGF->GenerateAndMask(*pHash, maskedDB, dbLen, maskedSeed, seedLen);
+
+ ConstByteArrayParameter encodingParameters;
+ parameters.GetValue(Name::EncodingParameters(), encodingParameters);
+
+ // DB = pHash' || 00 ... || 01 || M
+ byte *M = std::find(maskedDB+hLen, maskedDB+dbLen, 0x01);
+ invalid = (M == maskedDB+dbLen) || invalid;
+ invalid = (std::find_if(maskedDB+hLen, M, std::bind2nd(std::not_equal_to<byte>(), byte(0))) != M) || invalid;
+ invalid = !pHash->VerifyDigest(maskedDB, encodingParameters.begin(), encodingParameters.size()) || invalid;
+
+ if (invalid)
+ return DecodingResult();
+
+ M++;
+ memcpy(output, M, maskedDB+dbLen-M);
+ return DecodingResult(maskedDB+dbLen-M);
+}
+
+NAMESPACE_END
+
+#endif