From a3b6ece7ab341b5b14135baeccea7d5e4c086771 Mon Sep 17 00:00:00 2001 From: weidai Date: Fri, 4 Oct 2002 17:31:41 +0000 Subject: Initial revision --- pkcspad.h | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 pkcspad.h (limited to 'pkcspad.h') diff --git a/pkcspad.h b/pkcspad.h new file mode 100644 index 00000000..347bd956 --- /dev/null +++ b/pkcspad.h @@ -0,0 +1,92 @@ +#ifndef CRYPTOPP_PKCSPAD_H +#define CRYPTOPP_PKCSPAD_H + +#include "cryptlib.h" +#include "pubkey.h" + +NAMESPACE_BEGIN(CryptoPP) + +/// EME-PKCS1-v1_5 +class PKCS_EncryptionPaddingScheme : public PK_PaddingAlgorithm +{ +public: + static const char * StaticAlgorithmName() {return "EME-PKCS1-v1_5";} + + unsigned int MaxUnpaddedLength(unsigned int paddedLength) const; + void Pad(RandomNumberGenerator &rng, const byte *raw, unsigned int inputLength, byte *padded, unsigned int paddedLength) const; + DecodingResult Unpad(const byte *padded, unsigned int paddedLength, byte *raw) const; +}; + +/// EMSA-PKCS1-v1_5 +class PKCS_SignaturePaddingScheme : public PK_PaddingAlgorithm +{ +public: + static const char * StaticAlgorithmName() {return "EMSA-PKCS1-v1_5";} + + unsigned int MaxUnpaddedLength(unsigned int paddedLength) const; + void Pad(RandomNumberGenerator &rng, const byte *raw, unsigned int inputLength, byte *padded, unsigned int paddedLength) const; + DecodingResult Unpad(const byte *padded, unsigned int paddedLength, byte *raw) const; +}; + +/// EMSA-PKCS1-v1_5 +template +class PKCS_DecoratedHashModule : public HashTransformationWithDefaultTruncation +{ +public: + static std::string StaticAlgorithmName() {return std::string("EMSA-PKCS1-v1_5(") + H::StaticAlgorithmName() + ")";} + + void Update(const byte *input, unsigned int length) + {h.Update(input, length);} + unsigned int DigestSize() const; + void Final(byte *digest); + void Restart() {h.Restart();} + +private: + H h; +}; + +//! PKCS #1 version 1.5, for use with RSAES and RSASSA +/*! The following hash functions are supported for signature: SHA, MD2, MD5, RIPEMD160, SHA256, SHA384, SHA512. */ +struct PKCS1v15 : public SignatureStandard, public EncryptionStandard +{ + typedef PKCS_EncryptionPaddingScheme EncryptionPaddingAlgorithm; + + template struct SignaturePaddingAlgorithm {typedef PKCS_SignaturePaddingScheme type;}; + template struct DecoratedHashingAlgorithm {typedef PKCS_DecoratedHashModule type;}; +}; + +template<> struct CryptoStandardTraits : public PKCS1v15 {}; + +template struct PKCS_DigestDecoration +{ + static const byte decoration[]; + static const unsigned int length; +}; + +// PKCS_DecoratedHashModule can be instantiated with the following +// classes as specified in PKCS#1 v2.0 and P1363a +class SHA; +class MD2; +class MD5; +class RIPEMD160; +class SHA256; +class SHA384; +class SHA512; + +template +void PKCS_DecoratedHashModule::Final(byte *digest) +{ + const unsigned int decorationLen = PKCS_DigestDecoration::length; + memcpy(digest, PKCS_DigestDecoration::decoration, decorationLen); + h.Final(digest+decorationLen); +} + +template +unsigned int PKCS_DecoratedHashModule::DigestSize() const +{ + return h.DigestSize() + PKCS_DigestDecoration::length; // PKCS_DigestDecoration::length; +} + +NAMESPACE_END + +#endif -- cgit v1.2.1