📄 gfpcrypt.h
字号:
BERSequenceDecoder seq(bt); Integer v1(seq); Integer v2(seq); Integer v3(seq); if (seq.EndReached()) { this->AccessGroupParameters().Initialize(v1, v1/2, v2); this->SetPublicElement(v3); } else { Integer v4(seq); this->AccessGroupParameters().Initialize(v1, v2, v3); this->SetPublicElement(v4); } seq.MessageEnd(); } void DEREncode(BufferedTransformation &bt) const { DERSequenceEncoder seq(bt); this->GetGroupParameters().GetModulus().DEREncode(seq); if (this->GetGroupParameters().GetCofactor() != 2) this->GetGroupParameters().GetSubgroupOrder().DEREncode(seq); this->GetGroupParameters().GetGenerator().DEREncode(seq); this->GetPublicElement().DEREncode(seq); seq.MessageEnd(); }};//! provided for backwards compatibility, this class uses the old non-standard Crypto++ key formattemplate <class BASE>class DL_PrivateKey_GFP_OldFormat : public BASE{public: void BERDecode(BufferedTransformation &bt) { BERSequenceDecoder seq(bt); Integer v1(seq); Integer v2(seq); Integer v3(seq); Integer v4(seq); if (seq.EndReached()) { this->AccessGroupParameters().Initialize(v1, v1/2, v2); this->SetPrivateExponent(v4 % (v1/2)); // some old keys may have x >= q } else { Integer v5(seq); this->AccessGroupParameters().Initialize(v1, v2, v3); this->SetPrivateExponent(v5); } seq.MessageEnd(); } void DEREncode(BufferedTransformation &bt) const { DERSequenceEncoder seq(bt); this->GetGroupParameters().GetModulus().DEREncode(seq); if (this->GetGroupParameters().GetCofactor() != 2) this->GetGroupParameters().GetSubgroupOrder().DEREncode(seq); this->GetGroupParameters().GetGenerator().DEREncode(seq); this->GetGroupParameters().ExponentiateBase(this->GetPrivateExponent()).DEREncode(seq); this->GetPrivateExponent().DEREncode(seq); seq.MessageEnd(); }};//! <a href="http://www.weidai.com/scan-mirror/sig.html#DSA-1363">DSA-1363</a>template <class H>struct GDSA : public DL_SS< DL_SignatureKeys_GFP, DL_Algorithm_GDSA<Integer>, DL_SignatureMessageEncodingMethod_DSA, H>{};//! <a href="http://www.weidai.com/scan-mirror/sig.html#NR">NR</a>template <class H>struct NR : public DL_SS< DL_SignatureKeys_GFP, DL_Algorithm_NR<Integer>, DL_SignatureMessageEncodingMethod_NR, H>{};//! DSA group parameters, these are GF(p) group parameters that are allowed by the DSA standardclass CRYPTOPP_DLL DL_GroupParameters_DSA : public DL_GroupParameters_GFP{public: /*! also checks that the lengths of p and q are allowed by the DSA standard */ bool ValidateGroup(RandomNumberGenerator &rng, unsigned int level) const; /*! parameters: (ModulusSize), or (Modulus, SubgroupOrder, SubgroupGenerator) */ /*! ModulusSize must be between DSA::MIN_PRIME_LENGTH and DSA::MAX_PRIME_LENGTH, and divisible by DSA::PRIME_LENGTH_MULTIPLE */ void GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg);};struct DSA;//! DSA keysstruct DL_Keys_DSA{ typedef DL_PublicKey_GFP<DL_GroupParameters_DSA> PublicKey; typedef DL_PrivateKey_WithSignaturePairwiseConsistencyTest<DL_PrivateKey_GFP<DL_GroupParameters_DSA>, DSA> PrivateKey;};//! <a href="http://www.weidai.com/scan-mirror/sig.html#DSA">DSA</a>struct CRYPTOPP_DLL DSA : public DL_SS< DL_Keys_DSA, DL_Algorithm_GDSA<Integer>, DL_SignatureMessageEncodingMethod_DSA, SHA, DSA>{ static const char * CRYPTOPP_API StaticAlgorithmName() {return "DSA";} //! Generate DSA primes according to NIST standard /*! Both seedLength and primeLength are in bits, but seedLength should be a multiple of 8. If useInputCounterValue == true, the counter parameter is taken as input, otherwise it's used for output */ static bool CRYPTOPP_API GeneratePrimes(const byte *seed, unsigned int seedLength, int &counter, Integer &p, unsigned int primeLength, Integer &q, bool useInputCounterValue = false); static bool CRYPTOPP_API IsValidPrimeLength(unsigned int pbits) {return pbits >= MIN_PRIME_LENGTH && pbits <= MAX_PRIME_LENGTH && pbits % PRIME_LENGTH_MULTIPLE == 0;} //! FIPS 186-2 Change Notice 1 changed the minimum modulus length to 1024 enum {#if (DSA_1024_BIT_MODULUS_ONLY) MIN_PRIME_LENGTH = 1024,#else MIN_PRIME_LENGTH = 512,#endif MAX_PRIME_LENGTH = 1024, PRIME_LENGTH_MULTIPLE = 64};};CRYPTOPP_DLL_TEMPLATE_CLASS DL_PublicKey_GFP<DL_GroupParameters_DSA>;CRYPTOPP_DLL_TEMPLATE_CLASS DL_PrivateKey_GFP<DL_GroupParameters_DSA>;CRYPTOPP_DLL_TEMPLATE_CLASS DL_PrivateKey_WithSignaturePairwiseConsistencyTest<DL_PrivateKey_GFP<DL_GroupParameters_DSA>, DSA>;//! the XOR encryption method, for use with DL-based cryptosystemstemplate <class MAC, bool DHAES_MODE>class DL_EncryptionAlgorithm_Xor : public DL_SymmetricEncryptionAlgorithm{public: bool ParameterSupported(const char *name) const {return strcmp(name, Name::EncodingParameters()) == 0;} size_t GetSymmetricKeyLength(size_t plaintextLength) const {return plaintextLength + MAC::DEFAULT_KEYLENGTH;} size_t GetSymmetricCiphertextLength(size_t plaintextLength) const {return plaintextLength + MAC::DIGESTSIZE;} size_t GetMaxSymmetricPlaintextLength(size_t ciphertextLength) const {return (unsigned int)SaturatingSubtract(ciphertextLength, (unsigned int)MAC::DIGESTSIZE);} void SymmetricEncrypt(RandomNumberGenerator &rng, const byte *key, const byte *plaintext, size_t plaintextLength, byte *ciphertext, const NameValuePairs ¶meters) const { const byte *cipherKey, *macKey; if (DHAES_MODE) { macKey = key; cipherKey = key + MAC::DEFAULT_KEYLENGTH; } else { cipherKey = key; macKey = key + plaintextLength; } ConstByteArrayParameter encodingParameters; parameters.GetValue(Name::EncodingParameters(), encodingParameters); xorbuf(ciphertext, plaintext, cipherKey, plaintextLength); MAC mac(macKey); mac.Update(ciphertext, plaintextLength); mac.Update(encodingParameters.begin(), encodingParameters.size()); if (DHAES_MODE) { byte L[8] = {0,0,0,0}; PutWord(false, BIG_ENDIAN_ORDER, L+4, word32(encodingParameters.size())); mac.Update(L, 8); } mac.Final(ciphertext + plaintextLength); } DecodingResult SymmetricDecrypt(const byte *key, const byte *ciphertext, size_t ciphertextLength, byte *plaintext, const NameValuePairs ¶meters) const { size_t plaintextLength = GetMaxSymmetricPlaintextLength(ciphertextLength); const byte *cipherKey, *macKey; if (DHAES_MODE) { macKey = key; cipherKey = key + MAC::DEFAULT_KEYLENGTH; } else { cipherKey = key; macKey = key + plaintextLength; } ConstByteArrayParameter encodingParameters; parameters.GetValue(Name::EncodingParameters(), encodingParameters); MAC mac(macKey); mac.Update(ciphertext, plaintextLength); mac.Update(encodingParameters.begin(), encodingParameters.size()); if (DHAES_MODE) { byte L[8] = {0,0,0,0}; PutWord(false, BIG_ENDIAN_ORDER, L+4, word32(encodingParameters.size())); mac.Update(L, 8); } if (!mac.Verify(ciphertext + plaintextLength)) return DecodingResult(); xorbuf(plaintext, ciphertext, cipherKey, plaintextLength); return DecodingResult(plaintextLength); }};//! _template <class T, bool DHAES_MODE, class KDF>class DL_KeyDerivationAlgorithm_P1363 : public DL_KeyDerivationAlgorithm<T>{public: bool ParameterSupported(const char *name) const {return strcmp(name, Name::KeyDerivationParameters()) == 0;} void Derive(const DL_GroupParameters<T> ¶ms, byte *derivedKey, size_t derivedLength, const T &agreedElement, const T &ephemeralPublicKey, const NameValuePairs ¶meters) const { SecByteBlock agreedSecret; if (DHAES_MODE) { agreedSecret.New(params.GetEncodedElementSize(true) + params.GetEncodedElementSize(false)); params.EncodeElement(true, ephemeralPublicKey, agreedSecret); params.EncodeElement(false, agreedElement, agreedSecret + params.GetEncodedElementSize(true)); } else { agreedSecret.New(params.GetEncodedElementSize(false)); params.EncodeElement(false, agreedElement, agreedSecret); } ConstByteArrayParameter derivationParameters; parameters.GetValue(Name::KeyDerivationParameters(), derivationParameters); KDF::DeriveKey(derivedKey, derivedLength, agreedSecret, agreedSecret.size(), derivationParameters.begin(), derivationParameters.size()); }};//! Discrete Log Integrated Encryption Scheme, AKA <a href="http://www.weidai.com/scan-mirror/ca.html#DLIES">DLIES</a>template <class COFACTOR_OPTION = NoCofactorMultiplication, bool DHAES_MODE = true>struct DLIES : public DL_ES< DL_CryptoKeys_GFP, DL_KeyAgreementAlgorithm_DH<Integer, COFACTOR_OPTION>, DL_KeyDerivationAlgorithm_P1363<Integer, DHAES_MODE, P1363_KDF2<SHA1> >, DL_EncryptionAlgorithm_Xor<HMAC<SHA1>, DHAES_MODE>, DLIES<> >{ static std::string CRYPTOPP_API StaticAlgorithmName() {return "DLIES";} // TODO: fix this after name is standardized};NAMESPACE_END#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -