Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

# pkcspad.h

    00001 #ifndef CRYPTOPP_PKCSPAD_H
    00002 #define CRYPTOPP_PKCSPAD_H
    00003
    00004 #include "cryptlib.h"
    00005 #include "pubkey.h"
    00006
    00007 #ifdef CRYPTOPP_IS_DLL
    00008 #include "sha.h"
    00009 #endif
    00010
    00011 NAMESPACE_BEGIN(CryptoPP)
    00012
    00013 /// <a href="http://www.weidai.com/scan-mirror/ca.html#cem_PKCS1-1.5">EME-PKCS1-v1_5</a>
    00014 class PKCS_EncryptionPaddingScheme : public PK_PaddingAlgorithm
    00015 {
    00016 public:
    00017         static const char * StaticAlgorithmName() {return "EME-PKCS1-v1_5";}
    00018
    00019         unsigned int MaxUnpaddedLength(unsigned int paddedLength) const;
    00020         void Pad(RandomNumberGenerator &rng, const byte *raw, unsigned int inputLength, byte *padded, unsigned int paddedLength) const;
    00021         DecodingResult Unpad(const byte *padded, unsigned int paddedLength, byte *raw) const;
    00022 };
    00023
    00024 /// <a href="http://www.weidai.com/scan-mirror/sig.html#sem_PKCS1-1.5">EMSA-PKCS1-v1_5</a>
    00025 class CRYPTOPP_DLL PKCS_SignaturePaddingScheme : public PK_PaddingAlgorithm
    00026 {
    00027 public:
    00028         static const char * StaticAlgorithmName() {return "EMSA-PKCS1-v1_5";}
    00029
    00030         unsigned int MaxUnpaddedLength(unsigned int paddedLength) const;
    00031         void Pad(RandomNumberGenerator &rng, const byte *raw, unsigned int inputLength, byte *padded, unsigned int paddedLength) const;
    00032         DecodingResult Unpad(const byte *padded, unsigned int paddedLength, byte *raw) const;
    00033 };
    00034
    00035 /// <a href="http://www.weidai.com/scan-mirror/sig.html#sem_PKCS1-1.5">EMSA-PKCS1-v1_5</a>
    00036 template <class H>
    00037 class PKCS_DecoratedHashModule : public HashTransformationWithDefaultTruncation
    00038 {
    00039 public:
    00040         static std::string StaticAlgorithmName() {return std::string("EMSA-PKCS1-v1_5(") + H::StaticAlgorithmName() + ")";}
    00041
    00042         void Update(const byte *input, unsigned int length)
    00043                 {h.Update(input, length);}
    00044         unsigned int DigestSize() const;
    00045         void Final(byte *digest);
    00046         void Restart() {h.Restart();}
    00047
    00048 private:
    00049         H h;
    00050 };
    00051
    00052 #ifdef CRYPTOPP_IS_DLL
    00053 CRYPTOPP_DLL_TEMPLATE_CLASS PKCS_DecoratedHashModule<SHA>;
    00054 #endif
    00055
    00056 //! PKCS #1 version 1.5, for use with RSAES and RSASSA
    00057 /*! The following hash functions are supported for signature: SHA, MD2, MD5, RIPEMD160, SHA256, SHA384, SHA512. */
    00058 struct PKCS1v15 : public SignatureStandard, public EncryptionStandard
    00059 {
    00060         typedef PKCS_EncryptionPaddingScheme EncryptionPaddingAlgorithm;
    00061
    00062         template <class H> struct SignaturePaddingAlgorithm {typedef PKCS_SignaturePaddingScheme type;};
    00063         template <class H> struct DecoratedHashingAlgorithm {typedef PKCS_DecoratedHashModule<H> type;};
    00064 };
    00065
    00066 template<> struct CryptoStandardTraits<PKCS1v15> : public PKCS1v15 {};
    00067
    00068 template <class H> class PKCS_DigestDecoration
    00069 {
    00070 public:
    00071         static const byte decoration[];
    00072         static const unsigned int length;
    00073 };
    00074
    00075 #ifdef CRYPTOPP_IS_DLL
    00076 CRYPTOPP_DLL_TEMPLATE_CLASS PKCS_DigestDecoration<SHA>;
    00077 #endif
    00078
    00079 // PKCS_DecoratedHashModule can be instantiated with the following
    00080 // classes as specified in PKCS#1 v2.0 and P1363a
    00081 class SHA;
    00082 class MD2;
    00083 class MD5;
    00084 class RIPEMD160;
    00085 class SHA256;
    00086 class SHA384;
    00087 class SHA512;
    00088
    00089 template <class H>
    00090 void PKCS_DecoratedHashModule<H>::Final(byte *digest)
    00091 {
    00092         const unsigned int decorationLen = PKCS_DigestDecoration<H>::length;
    00093         memcpy(digest, PKCS_DigestDecoration<H>::decoration, decorationLen);
    00094         h.Final(digest+decorationLen);
    00095 }
    00096
    00097 template <class H>
    00098 unsigned int PKCS_DecoratedHashModule<H>::DigestSize() const
    00099 {
    00100         return h.DigestSize() + PKCS_DigestDecoration<H>::length; // PKCS_DigestDecoration<H>::length;
    00101 }
    00102
    00103 NAMESPACE_END
    00104
    00105 #endif