Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
4.1 KiB

  1. // panama.h - written and placed in the public domain by Wei Dai
  2. //! \file panama.h
  3. //! \brief Classes for Panama stream cipher
  4. #ifndef CRYPTOPP_PANAMA_H
  5. #define CRYPTOPP_PANAMA_H
  6. #include "strciphr.h"
  7. #include "iterhash.h"
  8. #include "secblock.h"
  9. #if CRYPTOPP_BOOL_X32
  10. # define CRYPTOPP_DISABLE_PANAMA_ASM
  11. #endif
  12. NAMESPACE_BEGIN(CryptoPP)
  13. /// base class, do not use directly
  14. template <class B>
  15. class CRYPTOPP_NO_VTABLE Panama
  16. {
  17. public:
  18. void Reset();
  19. void Iterate(size_t count, const word32 *p=NULL, byte *output=NULL, const byte *input=NULL, KeystreamOperation operation=WRITE_KEYSTREAM);
  20. protected:
  21. typedef word32 Stage[8];
  22. CRYPTOPP_CONSTANT(STAGES = 32)
  23. FixedSizeAlignedSecBlock<word32, 20 + 8*32> m_state;
  24. };
  25. namespace Weak {
  26. /// <a href="http://www.weidai.com/scan-mirror/md.html#Panama">Panama Hash</a>
  27. template <class B = LittleEndian>
  28. class PanamaHash : protected Panama<B>, public AlgorithmImpl<IteratedHash<word32, NativeByteOrder, 32>, PanamaHash<B> >
  29. {
  30. public:
  31. CRYPTOPP_CONSTANT(DIGESTSIZE = 32)
  32. PanamaHash() {Panama<B>::Reset();}
  33. unsigned int DigestSize() const {return DIGESTSIZE;}
  34. void TruncatedFinal(byte *hash, size_t size);
  35. static const char * StaticAlgorithmName() {return B::ToEnum() == BIG_ENDIAN_ORDER ? "Panama-BE" : "Panama-LE";}
  36. protected:
  37. void Init() {Panama<B>::Reset();}
  38. void HashEndianCorrectedBlock(const word32 *data) {this->Iterate(1, data);} // push
  39. size_t HashMultipleBlocks(const word32 *input, size_t length);
  40. word32* StateBuf() {return NULL;}
  41. };
  42. }
  43. //! MAC construction using a hermetic hash function
  44. template <class T_Hash, class T_Info = T_Hash>
  45. class HermeticHashFunctionMAC : public AlgorithmImpl<SimpleKeyingInterfaceImpl<TwoBases<MessageAuthenticationCode, VariableKeyLength<32, 0, INT_MAX> > >, T_Info>
  46. {
  47. public:
  48. void UncheckedSetKey(const byte *key, unsigned int length, const NameValuePairs &params)
  49. {
  50. CRYPTOPP_UNUSED(params);
  51. m_key.Assign(key, length);
  52. Restart();
  53. }
  54. void Restart()
  55. {
  56. m_hash.Restart();
  57. m_keyed = false;
  58. }
  59. void Update(const byte *input, size_t length)
  60. {
  61. if (!m_keyed)
  62. KeyHash();
  63. m_hash.Update(input, length);
  64. }
  65. void TruncatedFinal(byte *digest, size_t digestSize)
  66. {
  67. if (!m_keyed)
  68. KeyHash();
  69. m_hash.TruncatedFinal(digest, digestSize);
  70. m_keyed = false;
  71. }
  72. unsigned int DigestSize() const
  73. {return m_hash.DigestSize();}
  74. unsigned int BlockSize() const
  75. {return m_hash.BlockSize();}
  76. unsigned int OptimalBlockSize() const
  77. {return m_hash.OptimalBlockSize();}
  78. unsigned int OptimalDataAlignment() const
  79. {return m_hash.OptimalDataAlignment();}
  80. protected:
  81. void KeyHash()
  82. {
  83. m_hash.Update(m_key, m_key.size());
  84. m_keyed = true;
  85. }
  86. T_Hash m_hash;
  87. bool m_keyed;
  88. SecByteBlock m_key;
  89. };
  90. namespace Weak {
  91. /// Panama MAC
  92. template <class B = LittleEndian>
  93. class PanamaMAC : public HermeticHashFunctionMAC<PanamaHash<B> >
  94. {
  95. public:
  96. PanamaMAC() {}
  97. PanamaMAC(const byte *key, unsigned int length)
  98. {this->SetKey(key, length);}
  99. };
  100. }
  101. //! algorithm info
  102. template <class B>
  103. struct PanamaCipherInfo : public FixedKeyLength<32, SimpleKeyingInterface::UNIQUE_IV, 32>
  104. {
  105. static const char * StaticAlgorithmName() {return B::ToEnum() == BIG_ENDIAN_ORDER ? "Panama-BE" : "Panama-LE";}
  106. };
  107. //! _
  108. template <class B>
  109. class PanamaCipherPolicy : public AdditiveCipherConcretePolicy<word32, 8>,
  110. public PanamaCipherInfo<B>,
  111. protected Panama<B>
  112. {
  113. protected:
  114. void CipherSetKey(const NameValuePairs &params, const byte *key, size_t length);
  115. void OperateKeystream(KeystreamOperation operation, byte *output, const byte *input, size_t iterationCount);
  116. bool CipherIsRandomAccess() const {return false;}
  117. void CipherResynchronize(byte *keystreamBuffer, const byte *iv, size_t length);
  118. unsigned int GetAlignment() const;
  119. FixedSizeSecBlock<word32, 8> m_key;
  120. };
  121. //! <a href="http://www.cryptolounge.org/wiki/PANAMA">Panama Stream Cipher</a>
  122. template <class B = LittleEndian>
  123. struct PanamaCipher : public PanamaCipherInfo<B>, public SymmetricCipherDocumentation
  124. {
  125. typedef SymmetricCipherFinal<ConcretePolicyHolder<PanamaCipherPolicy<B>, AdditiveCipherTemplate<> >, PanamaCipherInfo<B> > Encryption;
  126. typedef Encryption Decryption;
  127. };
  128. NAMESPACE_END
  129. #endif