RegressionTests__CryptTests.st
author Claus Gittinger <cg@exept.de>
Tue, 09 Jul 2019 18:53:03 +0200
changeset 2327 bf482d49aeaf
parent 2179 9d14571951e7
child 2354 50df3fdd2723
permissions -rw-r--r--
#QUALITY by exept class: RegressionTests::StringTests added: #test82c_expanding

"{ Package: 'stx:goodies/regression' }"

"{ NameSpace: RegressionTests }"

TestCase subclass:#CryptTests
	instanceVariableNames:''
	classVariableNames:'LibCryptLoaded'
	poolDictionaries:''
	category:'tests-Regression-Files and Encodings'
!

!CryptTests class methodsFor:'documentation'!

documentation
"
    documentation to be added.

    [author:]
	exept

    [instance variables:]

    [class variables:]

    [see also:]

"
! !

!CryptTests class methodsFor:'initialization'!

initialize
    "Invoked at system start or when the class is dynamically loaded."

    LibCryptLoaded := false.

    "Modified: / 03-03-2014 / 12:05:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (comment): / 06-11-2018 / 10:33:59 / Claus Gittinger"
! !

!CryptTests class methodsFor:'utilities'!

loadLibcryptIfAvailable
    "raise an error: this method should be implemented (TODO)"

    LibCryptLoaded ifFalse:[
        (Smalltalk at: #'exept_libcrypt') isNil ifTrue:[
            [
                Smalltalk loadPackage: #'exept:libcrypt'.
            ] on: PackageLoadError do:[:ex |
                "/ Libcrypt not not available.
            ].
        ].
        LibCryptLoaded := (Smalltalk at: #'exept_libcrypt') notNil.
    ].

    "Created: / 03-03-2014 / 12:03:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 06-11-2018 / 10:33:48 / Claus Gittinger"
! !

!CryptTests methodsFor:'initialize / release'!

setUp
    "common setup - invoked before testing."

    self class loadLibcryptIfAvailable.

    "Modified: / 03-03-2014 / 12:03:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

tearDown
    "common cleanup - invoked after testing."

    super tearDown
! !

!CryptTests methodsFor:'tests'!

test01_crc32
    |h|

    h := CRC32Stream hashValueOf:''.
    self assert:(h = 0).

    h := CRC32Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
    self assert:(h = 16r414fa339).

    h := CRC32Stream hashValueOf:'resume'.
    self assert:(h = 16r60C1D0A0).

    h := (CRC32Stream new
		    nextPut:$r;
		    nextPut:$e;
		    nextPut:$s;
		    nextPut:$u;
		    nextPut:$m;
		    nextPut:$e;
		    hashValue).
    self assert:(h = 16r60C1D0A0).

    h := (CRC32Stream hashValueOf:#[1 2 3 4 5 6 7]).
    self assert:(h = 16r70E46888).

    h := (CRC32Stream hashValueOf:#[16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF
	     16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF
	     16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF
	     16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF]).
    self assert:(h = 16r8CD04C73).

    h := (CRC32Stream new
		    next:100000 putAll:'12345678901234567890123456789012345678901234567890';
		    hashValue).
    self assert:(h = 16r86D7D79A).

    "
     self run:#test01_crc32
     self new test01_crc32
    "
!

test02_md5
    |h s|

    h := MD5Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexString:'d41d8cd98f00b204e9800998ecf8427e')).

    h := MD5Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
    self assert:(h = (ByteArray fromHexString:'9e107d9d372bb6826bd81d3542a419d6')).

    h := MD5Stream hashValueOf:'abc'.
    self assert:(h = #[16r90 16r01 16r50 16r98 16r3C 16rD2 16r4F 16rB0
                       16rD6 16r96 16r3F 16r7D 16r28 16rE1 16r7F 16r72]).

    s := MD5Stream new.
    s nextPutByte:$a codePoint.
    s nextPutByte:$b codePoint.
    s nextPutByte:$c codePoint.
    self assert:(s hashValue = #[16r90 16r01 16r50 16r98 16r3C 16rD2 16r4F 16rB0
                       16rD6 16r96 16r3F 16r7D 16r28 16rE1 16r7F 16r72]).

    s := MD5Stream new.
    s nextPut:$a.
    s nextPut:$b.
    s nextPut:$c.
    self assert:(s hashValue = #[16r90 16r01 16r50 16r98 16r3C 16rD2 16r4F 16rB0
                       16rD6 16r96 16r3F 16r7D 16r28 16rE1 16r7F 16r72]).

    s := MD5Stream new.
    s nextPutAll:'abc'.
    self assert:(s hashValue = #[16r90 16r01 16r50 16r98 16r3C 16rD2 16r4F 16rB0
                       16rD6 16r96 16r3F 16r7D 16r28 16rE1 16r7F 16r72]).

    s := MD5Stream new.
    s nextPutAll:'abc' asByteArray.
    self assert:(s hashValue = #[16r90 16r01 16r50 16r98 16r3C 16rD2 16r4F 16rB0
                       16rD6 16r96 16r3F 16r7D 16r28 16rE1 16r7F 16r72]).

    h := MD5Stream hashValueOf:'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
    self assert:(h = #[16r82 16r15 16rEF 16r07 16r96 16rA2 16r0B 16rCA
                       16rAA 16rE1 16r16 16rD3 16r87 16r6C 16r66 16r4A]).

    h := (MD5Stream new
                next:1000000 put:$a;
                hashValue).
    self assert:(h = #[16r77 16r07 16rD6 16rAE 16r4E 16r02 16r7C 16r70
                       16rEE 16rA2 16rA9 16r35 16rC2 16r29 16r6F 16r21]).

    "
     self run:#test02_md5
     self new test02_md5
    "

    "Modified: / 23-03-2019 / 15:23:42 / Claus Gittinger"
!

test03_sha1
    |h s|

    "/ test vectors from https://www.di-mgt.com.au/sha_testvectors.html
    "/ and others
    
    h := SHA1Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexString:'da39a3ee5e6b4b0d3255bfef95601890afd80709')).

    h := SHA1Stream hashValueOf:'abc'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d')).

    s := SHA1Stream new.
    s nextPutByte:$a codePoint.
    s nextPutByte:$b codePoint.
    s nextPutByte:$c codePoint.
    self assert:(s hashValue = (ByteArray fromHexStringWithSeparators:'a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d')).
    
    s := SHA1Stream new.
    s nextPut:$a.
    s nextPut:$b.
    s nextPut:$c.
    self assert:(s hashValue = (ByteArray fromHexStringWithSeparators:'a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d')).

    s := SHA1Stream new.
    s nextPutAll:'abc'.
    self assert:(s hashValue = (ByteArray fromHexStringWithSeparators:'a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d')).

    s := SHA1Stream new.
    s nextPutAll:'abc' asByteArray.
    self assert:(s hashValue = (ByteArray fromHexStringWithSeparators:'a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d')).

    h := SHA1Stream hashValueOf:'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'84983e44 1c3bd26e baae4aa1 f95129e5 e54670f1')).

    h := SHA1Stream hashValueOf:'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'a49b2446 a02c645b f419f995 b6709125 3a04a259')).

    h := SHA1Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
    self assert:(h = (ByteArray fromHexString:'2fd4e1c67a2d28fced849ee1bb76e7391b93eb12')).

    h := SHA1Stream hashValueOf:#[16r00 16r01 16r02 16r40 16r08 16r10 16r20 16r40 16r80
                                  16rFF 16rFE 16rFC 16rF8 16rF0 16rE0 16rC0 16r80].
    self assert:(h = #[146 31 26 53 78 167 121 73 144 117 145 88 50 42 25 52 53 37 177 73]).

    h := SHA1Stream hashValueOf:(String new:1000000 withAll:$a).
    self assert:(h = (ByteArray fromHexStringWithSeparators:'34aa973c d4c4daa4 f61eeb2b dbad2731 6534016f')).

    h := SHA1Stream hashValueOf:#[48 130 2 149 160 3 2 1 2 2 1 6 48 13 6 9 42 134 72 134 247 13 1 1 5 5 0 48 111 49 25 48 23 6 3 85 4 3 19 16 69 120 101 112 116 32 76 101 118 101 108 32 50 32 67 65 49 11 48 9 6 3 85 4 6 19 2 68 69 49 26 48 24 6 3 85 4 10 19 17 69 120 101 112 116 32 83 111 102 116 119 97 114 101 32 65 71 49 11 48 9 6 3 85 4 11 19 2 67 65 49 28 48 26 6 9 42 134 72 134 247 13 1 9 1 22 13 99 101 114 116 64 101 120 101 112 116 46 100 101 48 30 23 13 48 56 48 52 50 50 50 48 48 48 48 48 90 23 13 49 54 48 54 48 49 49 57 53 57 53 57 90 48 72 49 11 48 9 6 3 85 4 6 19 2 68 69 49 26 48 24 6 3 85 4 10 19 17 69 120 101 112 116 32 83 111 102 116 119 97 114 101 32 65 71 49 29 48 27 6 3 85 4 3 19 20 101 120 112 101 99 99 111 32 99 111 100 101 32 115 105 103 110 105 110 103 48 129 159 48 13 6 9 42 134 72 134 247 13 1 1 1 5 0 3 129 141 0 48 129 137 2 129 129 0 199 150 115 153 147 36 175 136 129 9 92 77 196 254 201 72 55 141 131 27 57 64 226 5 191 35 239 72 236 142 151 98 19 209 37 164 153 24 185 170 82 62 223 250 229 224 59 238 40 73 29 84 83 109 2 188 117 254 37 86 32 136 145 32 255 118 90 26 62 76 137 45 196 88 220 234 231 81 63 165 29 158 212 132 117 227 250 68 249 54 42 54 69 145 185 217 234 66 192 205 240 247 173 215 243 64 30 52 116 19 113 47 189 90 216 64 241 30 193 187 185 219 5 35 231 222 30 183 2 3 1 0 1 163 129 254 48 129 251 48 9 6 3 85 29 19 4 2 48 0 48 29 6 3 85 29 14 4 22 4 20 142 53 132 147 2 27 121 108 9 10 151 194 20 232 134 227 84 160 251 55 48 129 153 6 3 85 29 35 4 129 145 48 129 142 128 20 36 157 29 207 97 136 114 233 22 165 218 37 28 117 161 157 224 230 74 178 161 115 164 113 48 111 49 25 48 23 6 3 85 4 3 19 16 69 120 101 112 116 32 76 101 118 101 108 32 49 32 67 65 49 11 48 9 6 3 85 4 6 19 2 68 69 49 26 48 24 6 3 85 4 10 19 17 69 120 101 112 116 32 83 111 102 116 119 97 114 101 32 65 71 49 11 48 9 6 3 85 4 11 19 2 67 65 49 28 48 26 6 9 42 134 72 134 247 13 1 9 1 22 13 99 101 114 116 64 101 120 101 112 116 46 100 101 130 1 2 48 11 6 3 85 29 15 4 4 3 2 7 128 48 19 6 3 85 29 37 4 12 48 10 6 8 43 6 1 5 5 7 3 3 48 17 6 9 96 134 72 1 134 248 66 1 1 4 4 3 2 4 16].
    self assert:(h = #[152 185 22 239 129 56 192 23 215 67 254 147 139 91 251 28 96 142 185 186]).

    "
     self run:#test03_sha1
     self new test03_sha1
    "

    "Modified: / 25-11-2013 / 11:42:46 / cg"
    "Modified: / 23-03-2019 / 15:22:29 / Claus Gittinger"
!

test04_md2
    |h|

    self
	skipIf:(MD2Stream isBehavior not or:[MD2Stream isLoaded not])
	description:'MD2Stream/libcrypt is not loaded'.

    h := MD2Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexString:'8350e5a3e24c153df2275c9f80692773')).

    h := MD2Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
    self assert:(h = (ByteArray fromHexString:'03d85a0d629d2c442e987525319fc471')).

    "
     self run:#test04_md2
     self new test04_md2
    "
!

test05_md4
    |h|

    self
	skipIf:(MD4Stream isBehavior not or:[MD4Stream isLoaded not])
	description:'MD4Stream/libcrypt is not loaded'.

    h := MD4Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexString:'31d6cfe0d16ae931b73c59d7e0c089c0')).

    h := MD4Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
    self assert:(h = (ByteArray fromHexString:'1bee69a46ba811185c194762abaeae90')).

    "
     self run:#test05_md4
     self new test05_md4
    "
!

test06_sha256
    |h|

    "/ test vectors from https://www.di-mgt.com.au/sha_testvectors.html
    "/ and others

    self
        skipIf:(SHA256Stream isBehavior not or:[SHA256Stream isLoaded not])
        description:'SHA256Stream/libcrypt is not loaded'.

    h := SHA256Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexString:'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855')).

    h := SHA256Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
    self assert:(h = (ByteArray fromHexString:'d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592')).

    h := SHA256Stream hashValueOf:'abc'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad')).

    h := SHA256Stream hashValueOf:'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1')).

    h := SHA256Stream hashValueOf:'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'cf5b16a7 78af8380 036ce59e 7b049237 0b249b11 e8f07a51 afac4503 7afee9d1')).

    h := SHA256Stream hashValueOf:(String new:1000000 withAll:$a).
    self assert:(h = (ByteArray fromHexStringWithSeparators:'cdc76e5c 9914fb92 81a1c7e2 84d73e67 f1809a48 a497200e 046d39cc c7112cd0')).
    "
     self run:#test06_sha256
     self new test06_sha256
    "

    "Modified: / 22-03-2019 / 12:35:28 / Claus Gittinger"
!

test07_sha224
    |h|

    "/ test vectors from 
    "/     https://www.di-mgt.com.au/sha_testvectors.html
    "/     ftp://ftp.rfc-editor.org/in-notes/rfc3874.txt 
    "/ and others

    self
        skipIf:(SHA224Stream isBehavior not or:[SHA224Stream isLoaded not])
        description:'SHA224Stream/libcrypt is not loaded'.

    h := SHA224Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexString:'d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f')).

    h := SHA224Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
    self assert:(h = (ByteArray fromHexString:'730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525')).

    h := SHA224Stream hashValueOf:'abc'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'23097d22 3405d822 8642a477 bda255b3 2aadbce4 bda0b3f7 e36c9da7')).

    h := SHA224Stream hashValueOf:'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'75388b16 512776cc 5dba5da1 fd890150 b0c6455c b4f58b19 52522525')).

    h := SHA224Stream hashValueOf:'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'c97ca9a5 59850ce9 7a04a96d ef6d99a9 e0e0e2ab 14e6b8df 265fc0b3')).

    h := SHA224Stream hashValueOf:(String new:1000000 withAll:$a).
    self assert:(h = (ByteArray fromHexStringWithSeparators:'20794655 980c91d8 bbb4c1ea 97618a4b f03f4258 1948b2ee 4ee7ad67')).

    "
     self run:#test07_sha224
     self new test07_sha224
    "

    "Modified (format): / 24-03-2019 / 10:10:39 / Claus Gittinger"
!

test08_sha384
    |h|

    "/ test vectors from https://www.di-mgt.com.au/sha_testvectors.html
    "/ and others

    self
        skipIf:(SHA384Stream isBehavior not or:[SHA384Stream isLoaded not])
        description:'SHA384Stream/libcrypt is not loaded'.

    h := SHA384Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexString:'38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b')).

    h := SHA384Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
    self assert:(h = (ByteArray fromHexString:'ca737f1014a48f4c0b6dd43cb177b0afd9e5169367544c494011e3317dbf9a509cb1e5dc1e85a941bbee3d7f2afbc9b1')).

    h := SHA384Stream hashValueOf:'abc'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'cb00753f45a35e8b b5a03d699ac65007 272c32ab0eded163 1a8b605a43ff5bed 8086072ba1e7cc23 58baeca134c825a7')).

    h := SHA384Stream hashValueOf:'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'3391fdddfc8dc739 3707a65b1b470939 7cf8b1d162af05ab fe8f450de5f36bc6 b0455a8520bc4e6f 5fe95b1fe3c8452b')).

    h := SHA384Stream hashValueOf:'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'09330c33f71147e8 3d192fc782cd1b47 53111b173b3b05d2 2fa08086e3b0f712 fcc7c71a557e2db9 66c3e9fa91746039')).

    h := SHA384Stream hashValueOf:(String new:1000000 withAll:$a).
    self assert:(h = (ByteArray fromHexStringWithSeparators:'9d0e1809716474cb 086e834e310a4a1c ed149e9c00f24852 7972cec5704c2a5b 07b8b3dc38ecc4eb ae97ddd87f3d8985')).

    "
     self run:#test08_sha384
     self new test08_sha384
    "

    "Modified (format): / 22-03-2019 / 12:33:59 / Claus Gittinger"
!

test09_sha512
    |h|

    "/ test vectors from https://www.di-mgt.com.au/sha_testvectors.html
    "/ and others

    self
        skipIf:(SHA512Stream isBehavior not or:[SHA512Stream isLoaded not])
        description:'SHA512Stream/libcrypt is not loaded'.

    h := SHA512Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexString:'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e')).

    h := SHA512Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
    self assert:(h = (ByteArray fromHexString:'07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6')).

    h := SHA512Stream hashValueOf:'abc'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'ddaf35a193617aba cc417349ae204131 12e6fa4e89a97ea2 0a9eeee64b55d39a 2192992a274fc1a8 36ba3c23a3feebbd 454d4423643ce80e 2a9ac94fa54ca49f')).

    h := SHA512Stream hashValueOf:'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'204a8fc6dda82f0a 0ced7beb8e08a416 57c16ef468b228a8 279be331a703c335 96fd15c13b1b07f9 aa1d3bea57789ca0 31ad85c7a71dd703 54ec631238ca3445')).

    h := SHA512Stream hashValueOf:'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'8e959b75dae313da 8cf4f72814fc143f 8f7779c6eb9f7fa1 7299aeadb6889018 501d289e4900f7e4 331b99dec4b5433a c7d329eeb6dd2654 5e96e55b874be909')).

    h := SHA512Stream hashValueOf:(String new:1000000 withAll:$a).
    self assert:(h = (ByteArray fromHexStringWithSeparators:'e718483d0ce76964 4e2e42c7bc15b463 8e1f98b13b204428 5632a803afa973eb de0ff244877ea60a 4cb0432ce577c31b eb009c5c2c49aa2e 4eadb217ad8cc09b')).

    "
     self run:#test09_sha512
     self new test09_sha512
    "

    "Modified: / 22-03-2019 / 12:36:56 / Claus Gittinger"
!

test10_des
    |des crypt s s2|

    des := DesCipher new key:#[12 34 56 78 90 12 34 56].
    crypt := des encrypt:'12345678'.
    self assert:(crypt = #[85 205 168 117 136 155 222 239]).

    "/ ------------------------------------------------

    des := DesCipher new key:#[12 34 56 78 90 12 34 56].
    s := '12345678'.
    10 timesRepeat:[
	s2 := ByteArray new:s size.
	des cryptBlock:s from:1 "to:nil" into:s2 startingAt:1 encrypt:true.
	s := s2.
    ].
    self assert:(s = #[212 114 83 160 109 1 37 83]).

    "/ ------------------------------------------------

    des := DesCipher new key:#[16rFF 16r80 56 78 90 12 34 56].
    crypt := des encrypt:'12345678'.
    self assert:(crypt = #[54 60 159 218 32 8 70 60]).


    "
     self run:#test10_des
     self new test10_des
    "

    "Modified: / 25-11-2013 / 11:45:34 / cg"
!

test11_rsaKey
    |dir fn key ks plain cipher|

    dir := Smalltalk packageDirectoryForPackageId:'exept:expecco'.
    self skipIf:dir isNil description:'directory with test key is not present'.
    fn := dir asFilename construct:'license/expeccoKey.pem'.
    self skipIf:fn exists not description:'test key is not present'.

    key := RSASecretCryptKey fromPemStream:fn readStream.

    ks := RSACryptStream new.
    ks encryptWithSecretKey:true.
    ks key:key.
    ks stream:#[] writeStream.

    plain := '12345678901234567890'.
    ks encrypt:plain.
    cipher := ks stream contents.

    ks := RSACryptStream new.
    ks encryptWithSecretKey:true.
    ks key:key.
    ks stream:#[] writeStream.

    ks decrypt:cipher.

    self assert:(ks stream contents asString = plain).

    "/ -------------------------------------------

    ks := RSACryptStream new.
    ks encryptWithSecretKey:true.
    ks key:key.
    ks stream:#[] writeStream.

    plain := #[16rFF 16r80 16r00].
    ks encrypt:plain.
    cipher := ks stream contents.

    ks := RSACryptStream new.
    ks encryptWithSecretKey:true.
    ks key:key.
    ks stream:#[] writeStream.

    ks decrypt:cipher.

    self assert:(ks stream contents = plain).

    "
     self run:#test11_rsaKey
     self new test11_rsaKey
    "

    "Created: / 02-12-2013 / 12:58:19 / cg"
!

test12_whirlpool
    |h|

    self
        skipIf:(WhirlpoolStream isBehavior not or:[WhirlpoolStream isLoaded not])
        description:'WhirlpoolStream/libcrypt is not loaded'.

    "/ hashes taken from wikipedia-page on whirlpool
    
    h := WhirlpoolStream hashValueOf:''.
    self assert:(h = (ByteArray fromHexString:'19FA61D75522A4669B44E39C1D2E1726C530232130D407F89AFEE0964997F7A73E83BE698B288FEBCF88E3E03C4F0757EA8964E59B63D93708B138CC42A66EB3')).

    h := WhirlpoolStream hashValueOf:'The quick brown fox jumps over the lazy dog'.
    self assert:(h = (ByteArray fromHexString:'B97DE512E91E3828B40D2B0FDCE9CEB3C4A71F9BEA8D88E75C4FA854DF36725FD2B52EB6544EDCACD6F8BEDDFEA403CB55AE31F03AD62A5EF54E42EE82C3FB35')).

    h := WhirlpoolStream hashValueOf:'The quick brown fox jumps over the lazy eog'.
    self assert:(h = (ByteArray fromHexString:'C27BA124205F72E6847F3E19834F925CC666D0974167AF915BB462420ED40CC50900D85A1F923219D832357750492D5C143011A76988344C2635E69D06F2D38C')).

    "
     self run:#test12_whirlpool
     self new test12_whirlpool
    "
!

test13_sha3
    |h|

    self
        skipIf:(SHA3_256Stream isBehavior not or:[SHA3_256Stream isLoaded not])
        description:'SHA3Stream/libcrypt is not loaded'.

    "/ hashes taken from wikipedia-page on SHA3
    false ifTrue:[
        h := SHA3_224Stream hashValueOf:''.
        self assert:(h = (ByteArray fromHexString:'6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7')).
    ].

    h := SHA3_256Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexString:'a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a')).

    h := SHA3_384Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexString:'0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004')).

    h := SHA3_512Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexString:'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26')).


    false ifTrue:[
        h := SHA3_Shake128_256Stream hashValueOf:''.
        self assert:(h = (ByteArray fromHexString:'7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26')).

        h := SHA3_Shake256_512Stream hashValueOf:''.
        self assert:(h = (ByteArray fromHexString:'46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be')).

        h := SHA3_Shake128_256Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
        self assert:(h = (ByteArray fromHexString:'f4202e3c5852f9182a0430fd8144f0a74b95e7417ecae17db0f8cfeed0e3e66e')).

        h := SHA3_Shake128_256Stream hashValueOf:'The quick brown fox jumps over the lazy dof'.
        self assert:(h = (ByteArray fromHexString:'853f4538be0db9621a6cea659a06c1107b1f83f02b13d18297bd39d7411cf10c')).
    ].
    
    "
     self run:#test13_sha3
     self new test13_sha3
    "

    "Created: / 27-07-2017 / 13:40:51 / cg"
    "Modified: / 23-03-2019 / 22:41:19 / Claus Gittinger"
!

test14_aesRijndael
    |plaintext key crypted hx ecb cbc ofb ctr iv|

    "/ ECB-AES-256

    plaintext := #[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
                    16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ].
    key := #[ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ].
    ecb := RijndaelCipher new key:key mode:#ECB.
    crypted := ecb encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx = 'f2258e225d794572393a6484cfced7cf925d1aa18366bcd93c33d104294c8a6f').

    ecb := RijndaelCipher new key:key mode:#ECB.
    self assert:(ecb decrypt:crypted) = plaintext.
    plaintext := #[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
                    16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ].
    key := #[ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ].
    cbc := RijndaelCipher new key:key mode:#CBC.
    crypted := cbc encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx = 'f2258e225d794572393a6484cfced7cfb487a41f6b6286c00c9c8d80cb3ee9f8').
    cbc := RijndaelCipher new key:key mode:#CBC.
    self assert:(cbc decrypt:crypted) = plaintext.
     
    "/ ECB-AES-256
    
    plaintext := #[ 0 17 34 51 68 85 102 119
                    136 153 170 187 204 221 238 255 ] asString.
    key := #[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
              16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ] asString.
    ecb := RijndaelCipher new key:key mode:#ECB.
    crypted := ecb encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx = '8ea2b7ca516745bfeafc49904b496089').
    ecb := RijndaelCipher new key:key mode:#ECB.
    self assert:(ecb decrypt:crypted) asString = plaintext.
     
    "/ ECB-AES-192
    
    plaintext := #[ 0 17 34 51 68 85 102 119
                    136 153 170 187 204 221 238 255 ] asString.
    key := #[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
              16 17 18 19 20 21 22 23 ] asString.
    ecb := RijndaelCipher new key:key mode:#ECB.
    crypted := ecb encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx = 'dda97ca4864cdfe06eaf70a0ec0d7191').
    ecb := RijndaelCipher new key:key mode:#ECB.
    self assert:(ecb decrypt:crypted) asString = plaintext.
     
    "/ ECB-AES-128
    
    plaintext := #[ 0 17 34 51 68 85 102 119
                    136 153 170 187 204 221 238 255 ] asString.
    key := #[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] asString.
    ecb := RijndaelCipher new key:key mode:#ECB.
    crypted := ecb encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx = '69c4e0d86a7b0430d8cdb78070b4c55a').
    ecb := RijndaelCipher new key:key mode:#ECB.
    self assert:(ecb decrypt:crypted) asString = plaintext.
     
    "/ Modes of operation -- NIST paper tests
    "/ ECB-AES-128
    
    key := #[ 43 126 21 22 40 174 210 166 171 247 21 136 9 207 79 60 ].
    plaintext := #[ 107 193 190 226 46 64 159 150 233 61 126 17 115 147 23 42 174 45 138 87 30 3 172 156 158 183 111 172 69 175 142 81 48 200 28 70 163 92 228 17 229 251 193 25 26 10 82 239 246 159 36 69 223 79 155 23 173 43 65 123 230 108 55 16 ].
    ecb := RijndaelCipher new key:key mode:#ECB.
    crypted := ecb encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = '3ad77bb40d7a3660a89ecaf32466ef97f5d3d58503b9699de785895a96fdbaaf43b1cd7f598ece23881b00e3ed0306887b0c785e27e8ad3f8223207104725dd4').
    ecb := RijndaelCipher new key:key mode:#ECB.
    self assert:(ecb decrypt:crypted) = plaintext.
     
    "/ ECB-AES-192
    
    key := #[ 142 115 176 247 218 14 100 82 200 16 243 43 128 144 121 229 98 248 234 210 82 44 107 123 ].
    plaintext := #[ 107 193 190 226 46 64 159 150 233 61 126 17 115 147 23 42 174 45 138 87 30 3 172 156 158 183 111 172 69 175 142 81 48 200 28 70 163 92 228 17 229 251 193 25 26 10 82 239 246 159 36 69 223 79 155 23 173 43 65 123 230 108 55 16 ].
    ecb := RijndaelCipher new key:key mode:#ECB.
    crypted := ecb encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = 'bd334f1d6e45f25ff712a214571fa5cc974104846d0ad3ad7734ecb3ecee4eefef7afd2270e2e60adce0ba2face6444e9a4b41ba738d6c72fb16691603c18e0e').
    ecb := RijndaelCipher new key:key mode:#ECB.
    self assert:(ecb decrypt:crypted) = plaintext.
     
    "/ ECB-AES-256
    
    key := ('603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    plaintext := ('6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    ecb := RijndaelCipher new key:key mode:#ECB.
    crypted := ecb encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = 'f3eed1bdb5d2a03c064b5a7e3db181f8591ccb10d410ed26dc5ba74a31362870b6ed21b99ca6f4f9f153e7b1beafed1d23304b7a39f9f3ff067d8d8f9e24ecc7').
    ecb := RijndaelCipher new key:key mode:#ECB.
    self assert:(ecb decrypt:crypted) = plaintext.
     
    "/ CBC-AES-128
    
    key := ('2b7e151628aed2a6abf7158809cf4f3c' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    plaintext := ('6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    iv := ('000102030405060708090a0b0c0d0e0f' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    cbc := RijndaelCipher new key:key mode:#CBC.
    cbc initializationVector:iv.
    crypted := cbc encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = '7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e222295163ff1caa1681fac09120eca307586e1a7').
    cbc initializationVector:iv.
    self assert:(cbc decrypt:crypted) = plaintext.
     
    "/ CBC-AES-192
    
    key := ('8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    plaintext := ('6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    iv := ('000102030405060708090a0b0c0d0e0f' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    cbc := RijndaelCipher new key:key mode:#CBC.
    cbc initializationVector:iv.
    crypted := cbc encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = '4f021db243bc633d7178183a9fa071e8b4d9ada9ad7dedf4e5e738763f69145a571b242012fb7ae07fa9baac3df102e008b0e27988598881d920a9e64f5615cd').
    cbc initializationVector:iv.
    self assert:(cbc decrypt:crypted) = plaintext.
     
    "/ CBC-AES-256
    
    key := ('603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    plaintext := ('6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    iv := ('000102030405060708090a0b0c0d0e0f' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    cbc := RijndaelCipher new key:key mode:#CBC.
    cbc initializationVector:iv.
    crypted := cbc encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = 'f58c4c04d6e5f1ba779eabfb5f7bfbd69cfc4e967edb808d679f777bc6702c7d39f23369a9d9bacfa530e26304231461b2eb05e2c39be9fcda6c19078c6a9d1b').
    cbc initializationVector:iv.
    self assert:(cbc decrypt:crypted) = plaintext.
     
    "/ CFB128-AES-128
    
    key := ('2b7e151628aed2a6abf7158809cf4f3c' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    plaintext := ('6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    iv := ('000102030405060708090a0b0c0d0e0f' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    cbc := RijndaelCipher new key:key mode:#CFB.
    cbc initializationVector:iv.
    crypted := cbc encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = '3b3fd92eb72dad20333449f8e83cfb4ac8a64537a0b3a93fcde3cdad9f1ce58b26751f67a3cbb140b1808cf187a4f4dfc04b05357c5d1c0eeac4c66f9ff7f2e6').
    cbc initializationVector:iv.
    self assert:(cbc decrypt:crypted) = plaintext.
     
    "/ CFB128-AES-192
    
    key := ('8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    plaintext := ('6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    iv := ('000102030405060708090a0b0c0d0e0f' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    cbc := RijndaelCipher new key:key mode:#CFB.
    cbc initializationVector:iv.
    crypted := cbc encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = 'cdc80d6fddf18cab34c25909c99a417467ce7f7f81173621961a2b70171d3d7a2e1e8a1dd59b88b1c8e60fed1efac4c9c05f9f9ca9834fa042ae8fba584b09ff').
    cbc initializationVector:iv.
    self assert:(cbc decrypt:crypted) = plaintext.
     
    "/ CFB128-AES-256
    
    key := ('603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    plaintext := ('6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    iv := ('000102030405060708090a0b0c0d0e0f' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    cbc := RijndaelCipher new key:key mode:#CFB.
    cbc initializationVector:iv.
    crypted := cbc encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = 'dc7e84bfda79164b7ecd8486985d386039ffed143b28b1c832113c6331e5407bdf10132415e54b92a13ed0a8267ae2f975a385741ab9cef82031623d55b1e471').
    cbc initializationVector:iv.
    self assert:(cbc decrypt:crypted) = plaintext.
     
    "/ OFB-AES-128
    
    key := ('2b7e151628aed2a6abf7158809cf4f3c' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    plaintext := ('6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    iv := ('000102030405060708090a0b0c0d0e0f' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    ofb := RijndaelCipher new key:key mode:#OFB.
    ofb initializationVector:iv.
    crypted := ofb encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = '3b3fd92eb72dad20333449f8e83cfb4a7789508d16918f03f53c52dac54ed8259740051e9c5fecf64344f7a82260edcc304c6528f659c77866a510d9c1d6ae5e').
    ofb initializationVector:iv.
    self assert:(ofb decrypt:crypted) = plaintext.
     
    "/ OFB-AES-192
    
    key := ('8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    plaintext := ('6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    iv := ('000102030405060708090a0b0c0d0e0f' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    ofb := RijndaelCipher new key:key mode:#OFB.
    ofb initializationVector:iv.
    crypted := ofb encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = 'cdc80d6fddf18cab34c25909c99a4174fcc28b8d4c63837c09e81700c11004018d9a9aeac0f6596f559c6d4daf59a5f26d9f200857ca6c3e9cac524bd9acc92a').
    ofb initializationVector:iv.
    self assert:(ofb decrypt:crypted) = plaintext.
     
    "/ OFB-AES-256
    
    key := ('603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    plaintext := ('6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    iv := ('000102030405060708090a0b0c0d0e0f' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    ofb := RijndaelCipher new key:key mode:#OFB.
    ofb initializationVector:iv.
    crypted := ofb encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = 'dc7e84bfda79164b7ecd8486985d38604febdc6740d20b3ac88f6ad82a4fb08d71ab47a086e86eedf39d1c5bba97c4080126141d67f37be8538f5a8be740e484').
    ofb initializationVector:iv.
    self assert:(ofb decrypt:crypted) = plaintext.
     
    "/ CTR-AES-128
    
    key := ByteArray fromHexString:'2b7e151628aed2a6abf7158809cf4f3c'.
    plaintext := ByteArray 
            fromHexString:'6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710'.
    iv := ByteArray fromHexString:'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'.
    ctr := RijndaelCipher new key:key mode:#CTR.
    ctr initializationVector:iv.
    crypted := ctr encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = '874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee').
    ctr initializationVector:iv.
    self assert:(ctr decrypt:crypted) = plaintext.
     
    "/ CTR-AES-192
    
    key := ('8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    plaintext := ('6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    iv := ('f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff' 
            pairWiseCollect:[:b1 :b2 | 
                Character value:(Integer readFrom:(b1 asString , b2) radix:16).
            ]) 
                asByteArray.
    ctr := RijndaelCipher new key:key mode:#CTR.
    ctr initializationVector:iv.
    crypted := ctr encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = '1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e941e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050').
    ctr initializationVector:iv.
    self assert:(ctr decrypt:crypted) = plaintext.
     
    "/ CTR-AES-256
    
    key := ByteArray 
            fromHexString:'603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4'.
    plaintext := ByteArray 
            fromHexString:'6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710'.
    iv := ByteArray fromHexString:'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'.
    ctr := RijndaelCipher new key:key mode:#CTR.
    ctr initializationVector:iv.
    crypted := ctr encrypt:plaintext.
    hx := crypted hexPrintString asLowercase.
    self assert:(hx 
                = '601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c52b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6').
    ctr initializationVector:iv.
    self assert:(ctr decrypt:crypted) = plaintext.

    "
     self run:#test12_aesRijndael
     self new test12_aesRijndael"

    "Created: / 26-07-2017 / 09:09:22 / cg"
    "Modified (format): / 23-08-2017 / 15:51:45 / cg"
!

test16_sha3_256
    |h|

    "/ test vectors from https://www.di-mgt.com.au/sha_testvectors.html
    "/ and others

    self
        skipIf:(SHA3_256Stream isBehavior not or:[SHA3_256Stream isLoaded not])
        description:'SHA3_256Stream/libcrypt is not loaded'.

    h := SHA3_256Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'a7ffc6f8bf1ed766 51c14756a061d662 f580ff4de43b49fa 82d80a4b80f8434a')).

"/    h := SHA3_256Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
"/    self assert:(h = (ByteArray fromHexStringWithSeparators:'d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592')).

    h := SHA3_256Stream hashValueOf:'abc'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'3a985da74fe225b2 045c172d6bd390bd 855f086e3e9d525b 46bfe24511431532')).

    h := SHA3_256Stream hashValueOf:'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'41c0dba2a9d62408 49100376a8235e2c 82e1b9998a999e21 db32dd97496d3376')).

    h := SHA3_256Stream hashValueOf:'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'916f6061fe879741 ca6469b43971dfdb 28b1a32dc36cb325 4e812be27aad1d18')).

    h := SHA3_256Stream hashValueOf:(String new:1000000 withAll:$a).
    self assert:(h = (ByteArray fromHexStringWithSeparators:'5c8875ae474a3634 ba4fd55ec85bffd6 61f32aca75c6d699 d0cdcb6c115891c1')).

    "
     self run:#test16_sha3_256
     self new test16_sha3_256
    "

    "Created: / 22-03-2019 / 12:41:10 / Claus Gittinger"
!

test17_sha3_224
    |h|

    "/ test vectors from https://www.di-mgt.com.au/sha_testvectors.html
    "/ and others

    self
        skipIf:(SHA3_224Stream isBehavior not or:[SHA3_224Stream isLoaded not])
        description:'SHA3_224Stream/libcrypt is not loaded'.

    h := SHA3_224Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'6b4e03423667dbb7 3b6e15454f0eb1ab d4597f9a1b078e3f 5b5a6bc7')).

"/    h := SHA3_224Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
"/    self assert:(h = (ByteArray fromHexStringWithSeparators:'d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592')).

    h := SHA3_224Stream hashValueOf:'abc'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'e642824c3f8cf24a d09234ee7d3c766f c9a3a5168d0c94ad 73b46fdf')).

    h := SHA3_224Stream hashValueOf:'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'8a24108b154ada21 c9fd5574494479ba 5c7e7ab76ef264ea d0fcce33')).

    h := SHA3_224Stream hashValueOf:'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'543e6868e1666c1a 643630df77367ae5 a62a85070a51c14c bf665cbc')).

    h := SHA3_224Stream hashValueOf:(String new:1000000 withAll:$a).
    self assert:(h = (ByteArray fromHexStringWithSeparators:'d69335b93325192e 516a912e6d19a15c b51c6ed5c15243e7 a7fd653c')).

    "
     self run:#test17_sha3_224
     self new test17_sha3_224
    "

    "Created: / 22-03-2019 / 12:42:49 / Claus Gittinger"
!

test18_sha3_384
    |h|

    "/ test vectors from https://www.di-mgt.com.au/sha_testvectors.html
    "/ and others

    self
        skipIf:(SHA3_384Stream isBehavior not or:[SHA3_384Stream isLoaded not])
        description:'SHA3_384Stream/libcrypt is not loaded'.

    h := SHA3_384Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'0c63a75b845e4f7d 01107d852e4c2485 c51a50aaaa94fc61 995e71bbee983a2a c3713831264adb47 fb6bd1e058d5f004')).

"/    h := SHA3_384Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
"/    self assert:(h = (ByteArray fromHexStringWithSeparators:'d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592')).

    h := SHA3_384Stream hashValueOf:'abc'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'ec01498288516fc9 26459f58e2c6ad8d f9b473cb0fc08c25 96da7cf0e49be4b2 98d88cea927ac7f5 39f1edf228376d25')).

    h := SHA3_384Stream hashValueOf:'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'991c665755eb3a4b 6bbdfb75c78a492e 8c56a22c5c4d7e42 9bfdbc32b9d4ad5a a04a1f076e62fea1 9eef51acd0657c22')).

    h := SHA3_384Stream hashValueOf:'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'79407d3b5916b59c 3e30b09822974791 c313fb9ecc849e40 6f23592d04f625dc 8c709b98b43b3852 b337216179aa7fc7')).

    h := SHA3_384Stream hashValueOf:(String new:1000000 withAll:$a).
    self assert:(h = (ByteArray fromHexStringWithSeparators:'eee9e24d78c18553 37983451df97c8ad 9eedf256c6334f8e 948d252d5e0e7684 7aa0774ddb90a842 190d2c558b4b8340')).

    "
     self run:#test18_sha3_384
     self new test18_sha3_384
    "

    "Created: / 22-03-2019 / 12:44:17 / Claus Gittinger"
!

test19_sha3_512
    |h|

    "/ test vectors from https://www.di-mgt.com.au/sha_testvectors.html,
    "/ https://github.com/XKCP/XKCP/blob/master/tests/TestVectors/ShortMsgKAT_SHA3-512.txt
    "/ and others

    self
        skipIf:(SHA3_512Stream isBehavior not or:[SHA3_512Stream isLoaded not])
        description:'SHA3_512Stream/libcrypt is not loaded'.

    h := SHA3_512Stream hashValueOf:''.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'a69f73cca23a9ac5 c8b567dc185a756e 97c982164fe25859 e0d1dcc1475c80a6 15b2123af1f5f94c 11e3e9402c3ac558 f500199d95b6d3e3 01758586281dcd26')).

    h := SHA3_512Stream hashValueOf:#[16rcc].
    self assert:(h = (ByteArray fromHexStringWithSeparators:'3939FCC8B57B63612542DA31A834E5DCC36E2EE0F652AC72E02624FA2E5ADEECC7DD6BB3580224B4D6138706FC6E80597B528051230B00621CC2B22999EAA205')).

    h := SHA3_512Stream hashValueOf:#[16r41 16rFB].
    self assert:(h = (ByteArray fromHexStringWithSeparators:'AA092865A40694D91754DBC767B5202C546E226877147A95CB8B4C8F8709FE8CD6905256B089DA37896EA5CA19D2CD9AB94C7192FC39F7CD4D598975A3013C69')).

    h := SHA3_512Stream hashValueOf:#[16r1F 16r87 16r7C].
    self assert:(h = (ByteArray fromHexStringWithSeparators:'CB20DCF54955F8091111688BECCEF48C1A2F0D0608C3A575163751F002DB30F40F2F671834B22D208591CFAF1F5ECFE43C49863A53B3225BDFD7C6591BA7658B')).

    h := SHA3_512Stream hashValueOf:#[16r21 16rF1 16r34 16rAC 16r57].
    self assert:(h = (ByteArray fromHexStringWithSeparators:'584219A84E8796076BF1178B14B9D1E2F96A4B4EF11F10CC516FBE1A29639D6BA74FB92815F9E3C5192ED4DCA20AEA5B109D52237C9956401FD44B221F82AB37')).

"/    h := SHA3_512Stream hashValueOf:'The quick brown fox jumps over the lazy dog'.
"/    self assert:(h = (ByteArray fromHexStringWithSeparators:'d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592')).

    h := SHA3_512Stream hashValueOf:'abc'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'b751850b1a57168a 5693cd924b6b096e 08f621827444f70d 884f5d0240d2712e 10e116e9192af3c9 1a7ec57647e39340 57340b4cf408d5a5 6592f8274eec53f0')).

    h := SHA3_512Stream hashValueOf:'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'04a371e84ecfb5b8 b77cb48610fca818 2dd457ce6f326a0f d3d7ec2f1e91636d ee691fbe0c985302 ba1b0d8dc78c0863 46b533b49c030d99 a27daf1139d6e75e')).

    h := SHA3_512Stream hashValueOf:'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'.
    self assert:(h = (ByteArray fromHexStringWithSeparators:'afebb2ef542e6579 c50cad06d2e578f9 f8dd6881d7dc824d 26360feebf18a4fa 73e3261122948efc fd492e74e82e2189 ed0fb440d187f382 270cb455f21dd185')).

    h := SHA3_512Stream hashValueOf:(String new:1000000 withAll:$a).
    self assert:(h = (ByteArray fromHexStringWithSeparators:'3c3a876da14034ab 60627c077bb98f7e 120a2a5370212dff b3385a18d4f38859 ed311d0a9d5141ce 9cc5c66ee689b266 a8aa18ace8282a0e 0db596c90b0a7b87')).

    "
     self run:#test19_sha3_512
     self new test19_sha3_512
    "

    "Created: / 22-03-2019 / 12:45:45 / Claus Gittinger"
    "Modified: / 23-03-2019 / 23:25:53 / Claus Gittinger"
!

test99_speed
    |oneTest speedTest|

    self skipIf:true description:'speedtest; not part of automated test suite'.

    oneTest := [:name :hashStream :n :s |
        |l t nMb|

        l := s size.
        t := Time millisecondsToRun:[
                n timesRepeat:[
                        hashStream nextPutAll:s
                ].
             ].
        t := (t / 1000) asFloat.
        nMb := n*l/1024/1024.
        Transcript showCR:'%1: %2 (chunk size %3)' with:name with:(hashStream hashValue hexPrintString) with:l.
        Transcript showCR:'  %1 seconds for %2 Mb' with:t with:(nMb asFixedPoint:2).
        Transcript showCR:'  %1 Mb/s' with:((nMb / t) asFixedPoint:2).
    ].

    speedTest := [:name :hashStreamMaker |
        Transcript showCR:'-----------------------'.
        oneTest 
            value:name value:(hashStreamMaker value) value:2000000
            value:'1234567890'.
        oneTest
            value:name value:(hashStreamMaker value) value:2000000
            value:'12345678901234567890123456789012345678901234567890'.
        oneTest
            value:name value:(hashStreamMaker value) value:200000
            value:('12345678901234567890123456789012345678901234567890' ,* 20).
        oneTest
            value:name value:(hashStreamMaker value) value:20000
            value:('12345678901234567890123456789012345678901234567890' ,* 1000).
    ].

    speedTest 
        value:'md5' value:[MD5Stream new].
    speedTest 
        value:'sha1' value:[SHA1Stream new].
    speedTest 
        value:'sha2-256' value:[SHA256Stream new].
    speedTest 
        value:'sha2-512' value:[SHA512Stream new].
    speedTest 
        value:'sha3-256' value:[SHA3_256Stream new].
    speedTest 
        value:'sha3-512' value:[SHA3_512Stream new].

    "current values (2012 MacBook; 2.6Ghz CoreI7):
md5: (chunk size 10)          61.53 Mb/s
md5: (chunk size 50)         156.34 Mb/s
md5: (chunk size 1000)       257.75 Mb/s
md5: (chunk size 50000)      277.23 Mb/s
-----------------------
sha1: (chunk size 10)         76.29 Mb/s
sha1: (chunk size 50)        211.93 Mb/s
sha1: (chunk size 1000)      433.49 Mb/s
sha1: (chunk size 50000)     449.85 Mb/s
-----------------------
sha2-256: (chunk size 10)     59.60 Mb/s
sha2-256: (chunk size 50)    125.48 Mb/s
sha2-256: (chunk size 1000)  185.18 Mb/s
sha2-256: (chunk size 50000) 188.10 Mb/s
-----------------------
sha2-512: (chunk size 10)     65.77 Mb/s
sha2-512: (chunk size 50)    140.25 Mb/s
sha2-512: (chunk size 1000)  207.32 Mb/s
sha2-512: (chunk size 50000) 222.82 Mb/s
-----------------------
sha3-256: (chunk size 10)     42.39 Mb/s
sha3-256: (chunk size 50)     69.61 Mb/s
sha3-256: (chunk size 1000)   78.17 Mb/s
sha3-256: (chunk size 50000)  83.29 Mb/s
-----------------------
sha3-512: (chunk size 10)     28.47 Mb/s
sha3-512: (chunk size 50)     39.74 Mb/s
sha3-512: (chunk size 1000)   44.88 Mb/s
sha3-512: (chunk size 50000)  45.31 Mb/s
    
    "

    "Created: / 23-03-2019 / 14:47:01 / Claus Gittinger"
    "Modified (comment): / 23-03-2019 / 23:05:24 / Claus Gittinger"
! !

!CryptTests class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
! !


CryptTests initialize!