From b21162cf8e06f40baa1f58be6a8c17435cebc34d Mon Sep 17 00:00:00 2001 From: weidai Date: Fri, 4 Oct 2002 17:31:41 +0000 Subject: Initial revision git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@2 57ff6487-cd31-0410-9ec3-f628ee90f5f0 --- rw.h | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 rw.h (limited to 'rw.h') diff --git a/rw.h b/rw.h new file mode 100644 index 0000000..2dbfce5 --- /dev/null +++ b/rw.h @@ -0,0 +1,162 @@ +#ifndef CRYPTOPP_RW_H +#define CRYPTOPP_RW_H + +/** \file + This file contains classes that implement the + Rabin-Williams signature schemes as defined in IEEE P1363. +*/ + +#include "pubkey.h" +#include "integer.h" + +NAMESPACE_BEGIN(CryptoPP) + +const word IFSSR_R = 6; +const word IFSSA_R = 12; + +//! . +template +class RWFunction : virtual public TrapdoorFunction, public PublicKey +{ + typedef RWFunction ThisClass; + +public: + void Initialize(const Integer &n) + {m_n = n;} + + void BERDecode(BufferedTransformation &bt); + void DEREncode(BufferedTransformation &bt) const; + + Integer ApplyFunction(const Integer &x) const; + Integer PreimageBound() const {return m_n;} + Integer ImageBound() const {return ++(m_n>>1);} + + bool Validate(RandomNumberGenerator &rng, unsigned int level) const; + bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const; + void AssignFrom(const NameValuePairs &source); + + const Integer& GetModulus() const {return m_n;} + void SetModulus(const Integer &n) {m_n = n;} + +protected: + Integer m_n; +}; + +//! . +template +class InvertibleRWFunction : public RWFunction, public TrapdoorFunctionInverse, public PrivateKey +{ + typedef InvertibleRWFunction ThisClass; + +public: + void Initialize(const Integer &n, const Integer &p, const Integer &q, const Integer &u) + {m_n = n; m_p = p; m_q = q; m_u = u;} + // generate a random private key + void Initialize(RandomNumberGenerator &rng, unsigned int modulusBits) + {GenerateRandomWithKeySize(rng, modulusBits);} + + void BERDecode(BufferedTransformation &bt); + void DEREncode(BufferedTransformation &bt) const; + + Integer CalculateInverse(const Integer &x) const; + + // GeneratibleCryptoMaterial + bool Validate(RandomNumberGenerator &rng, unsigned int level) const; + bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const; + void AssignFrom(const NameValuePairs &source); + /*! parameters: (ModulusSize) */ + void GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg); + + const Integer& GetPrime1() const {return m_p;} + const Integer& GetPrime2() const {return m_q;} + const Integer& GetMultiplicativeInverseOfPrime2ModPrime1() const {return m_u;} + + void SetPrime1(const Integer &p) {m_p = p;} + void SetPrime2(const Integer &q) {m_q = q;} + void SetMultiplicativeInverseOfPrime2ModPrime1(const Integer &u) {m_u = u;} + +protected: + Integer m_p, m_q, m_u; +}; + +//! . +class EMSA2Pad : public PK_PaddingAlgorithm +{ +public: + static const char *StaticAlgorithmName() {return "EMSA2";} + + unsigned int MaxUnpaddedLength(unsigned int paddedLength) const {return (paddedLength+1)/8-2;} + + 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; +}; + +//! . +template +class EMSA2DecoratedHashModule : public HashTransformationWithDefaultTruncation +{ +public: + EMSA2DecoratedHashModule() : empty(true) {} + void Update(const byte *input, unsigned int length) + {h.Update(input, length); empty = empty && length==0;} + unsigned int DigestSize() const; + void Final(byte *digest); + void Restart() {h.Restart(); empty=true;} + +private: + H h; + bool empty; +}; + +template struct EMSA2DigestDecoration +{ + static const byte decoration; +}; + +//! EMSA2, for use with RW +/*! The following hash functions are supported: SHA, RIPEMD160. */ +struct P1363_EMSA2 : public SignatureStandard +{ + template struct SignaturePaddingAlgorithm {typedef EMSA2Pad type;}; + template struct DecoratedHashingAlgorithm {typedef EMSA2DecoratedHashModule type;}; +}; + +template<> struct CryptoStandardTraits : public P1363_EMSA2 {}; + +// EMSA2DecoratedHashModule can be instantiated with the following two classes. +class SHA; +class RIPEMD160; + +template +void EMSA2DecoratedHashModule::Final(byte *digest) +{ + digest[0] = empty ? 0x4b : 0x6b; + h.Final(digest+1); + digest[DigestSize()-1] = EMSA2DigestDecoration::decoration; + empty=true; +} + +template +unsigned int EMSA2DecoratedHashModule::DigestSize() const +{ + return h.DigestSize() + 2; +} + +//! . +template +struct RW +{ + static std::string StaticAlgorithmName() {return "RW";} + typedef RWFunction PublicKey; + typedef InvertibleRWFunction PrivateKey; +}; + +//! RW +template +struct RWSSA : public TF_SSA > +{ +}; + +NAMESPACE_END + +#endif -- cgit v1.2.1