From 53b51331a4e1d9664bc93a0f1597fc2e70506234 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Thu, 21 Apr 2016 12:05:25 -0400 Subject: [PATCH] Add ChaCha family of stream ciphers --- Filelist.txt | 3 +++ cryptest.vcproj | 7 ++++++- cryptlib.dsp | 8 ++++++++ cryptlib.h | 6 +++--- cryptlib.vcproj | 8 ++++++++ cryptlib_bds.bdsproj | 2 ++ regtest.cpp | 4 ++++ vs2010.zip | Bin 19965 -> 19999 bytes 8 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Filelist.txt b/Filelist.txt index 1443237d..98cf2462 100644 --- a/Filelist.txt +++ b/Filelist.txt @@ -40,6 +40,8 @@ cbcmac.cpp cbcmac.h ccm.cpp ccm.h +chacha.cpp +chacha.h channels.cpp channels.h cmac.cpp @@ -370,6 +372,7 @@ TestVectors/blake2b.txt TestVectors/blake2s.txt TestVectors/camellia.txt TestVectors/ccm.txt +TestVectors/chacha.txt TestVectors/cmac.txt TestVectors/dlies.txt TestVectors/dsa.txt diff --git a/cryptest.vcproj b/cryptest.vcproj index b7d09b5d..596cac62 100644 --- a/cryptest.vcproj +++ b/cryptest.vcproj @@ -579,7 +579,7 @@ + + @@ -1499,6 +1503,7 @@ Stream Ciphers
- \ref Panama "Panama-LE", \ref Panama "Panama-BE", Salsa20, \ref SEAL "SEAL-LE", \ref SEAL "SEAL-BE", WAKE, XSalsa20 + ChaCha8, ChaCha12, ChaCha20, \ref Panama "Panama-LE", \ref Panama "Panama-BE", Salsa20, \ref SEAL "SEAL-LE", \ref SEAL "SEAL-BE", WAKE, XSalsa20
Hash Functions
- SHA1, SHA224, SHA256, SHA384, SHA512, \ref SHA3 "SHA-3", Tiger, Whirlpool, RIPEMD160, RIPEMD320, RIPEMD128, RIPEMD256, Weak::MD2, Weak::MD4, Weak::MD5 + BLAKE2, SHA1, SHA224, SHA256, SHA384, SHA512, \ref SHA3 "SHA-3", Tiger, Whirlpool, RIPEMD160, RIPEMD320, RIPEMD128, RIPEMD256, Weak::MD2, Weak::MD4, Weak::MD5
Non-Cryptographic Checksums
CRC32, Adler32
Message Authentication Codes
- VMAC, HMAC, CBC_MAC, CMAC, DMAC, TTMAC, \ref GCM "GCM (GMAC)" + VMAC, HMAC, CBC_MAC, CMAC, DMAC, TTMAC, \ref GCM "GCM (GMAC)", BLAKE2
Random Number Generators
NullRNG(), LC_RNG, RandomPool, BlockingRng, NonblockingRng, AutoSeededRandomPool, AutoSeededX917RNG, \ref MersenneTwister "MersenneTwister (MT19937 and MT19937-AR)", RDRAND, RDSEED diff --git a/cryptlib.vcproj b/cryptlib.vcproj index bab64bca..8c2de5df 100644 --- a/cryptlib.vcproj +++ b/cryptlib.vcproj @@ -1830,6 +1830,10 @@ RelativePath="ccm.cpp" > + + @@ -9252,6 +9256,10 @@ RelativePath="ccm.h" > + + diff --git a/cryptlib_bds.bdsproj b/cryptlib_bds.bdsproj index f8bc9db0..fa145e68 100644 --- a/cryptlib_bds.bdsproj +++ b/cryptlib_bds.bdsproj @@ -207,6 +207,7 @@ + @@ -214,6 +215,7 @@ + diff --git a/regtest.cpp b/regtest.cpp index b2375ef9..20f154fc 100644 --- a/regtest.cpp +++ b/regtest.cpp @@ -23,6 +23,7 @@ #include "pssr.h" #include "aes.h" #include "salsa.h" +#include "chacha.h" #include "vmac.h" #include "tiger.h" #include "md5.h" @@ -130,6 +131,9 @@ void RegisterFactories() RegisterSymmetricCipherDefaultFactories >(); RegisterSymmetricCipherDefaultFactories(); RegisterSymmetricCipherDefaultFactories(); + RegisterSymmetricCipherDefaultFactories(); + RegisterSymmetricCipherDefaultFactories(); + RegisterSymmetricCipherDefaultFactories(); RegisterSymmetricCipherDefaultFactories(); RegisterSymmetricCipherDefaultFactories(); RegisterSymmetricCipherDefaultFactories >(); diff --git a/vs2010.zip b/vs2010.zip index df346a6b8b13019c6b030b1ebb1c80ea0b9437ec..b533ab114521e637b3cae8e4b42e5bf14e027b88 100644 GIT binary patch delta 10138 zcmZvi1zZ)+7w7>6ltv_^Md^}m5TqoexgaGV-Q6rHotI8gX$k2|Hwe;sX(TRr>8^+Q z^Z(xaobS$OX7{r*yJyavGk4FuN=3{}LoD6G!K~4Ymqz4O?KDC|KxhS@;gF&-!ihlK za3U}%uJWBAlRU5;?gZe=LurfD_<)60$2)d>2CIp(jc_zuT*)C4jKyf|wp{gipz{@L zsu_nns5}3D3~Pt($2jBZQz6R7%$q@SNY~4umas#Jhs=2X<|Y2;;m>E_^9QWYa7Xg^)=%m_ zz^+CbXSeQL;9MSFb;F~j4J;VyRCyHi?YEZvu?W8|E!{uvRjhev4A#Wc0XWOy(S9(q z?i>@;<=)aNYYslXYN@4%cYGpfF1q>L2jbLIN#^xU3>lq{#V6YXD@SNj!r#;9%0Asl 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 delta 10165 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 QH3d8+D~S0(>PLV655^Qb`~Uy|