Initial project import

This commit is contained in:
Agila Forge Importer committed 2026-07-13 15:20:32 +00:00
commit 23f2d29e32
11957 files changed
+1754577

No files matched your search

@@ -0,0 +1,551 @@
// These tests are derived from the Secure Hash Algorithm Validation System
// test vectors contained in:
// https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/shs/shabytetestvectors.zip
//
// For SHA224, the test vectors come from:
// SHA224Monte.rsp
import crypto.sha256
import encoding.hex
const seed = 'ed2b70d575d9d0b4196ae84a03eed940057ea89cdd729b95b7d4e6a5'
struct MonteTestCase {
name string
count int
digest string
}
const monte_cases = [
MonteTestCase{
name: 'checkpoint 0'
count: 0
digest: 'cd94d7da13c030208b2d0d78fcfe9ea22fa8906df66aa9a1f42afa70'
},
MonteTestCase{
name: 'checkpoint 1'
count: 1
digest: '555846e884633639565d5e0c01dd93ba58edb01ee18e68ccca28f7b8'
},
MonteTestCase{
name: 'checkpoint 2'
count: 2
digest: '44d5f4a179b33231f24cc209ed2542ddb931391f2a2d604f80ed460b'
},
MonteTestCase{
name: 'checkpoint 3'
count: 3
digest: '18678e3c151f05f92a89fc5b2ec56bfc6fafa66d73ffc1937fcab4d0'
},
MonteTestCase{
name: 'checkpoint 4'
count: 4
digest: 'b285f829b0499ff45f8454eda2d4e0997b3f438c2728f1a25cfbb05a'
},
MonteTestCase{
name: 'checkpoint 5'
count: 5
digest: '206d442c6605be0e675b0efc76243c2f18f2260a93375fb36e469631'
},
MonteTestCase{
name: 'checkpoint 6'
count: 6
digest: '1cd8ea34d8483b6a513c52a74e416bac2f322bbaeee02c6b0b05a781'
},
MonteTestCase{
name: 'checkpoint 7'
count: 7
digest: '00cee48001fe8442ef39c3433ed05473179f34205d337940d4bfd3cd'
},
MonteTestCase{
name: 'checkpoint 8'
count: 8
digest: 'ead3ad27819401912bc9abfdb50037672a3aed0e94fbaa1cc0560621'
},
MonteTestCase{
name: 'checkpoint 9'
count: 9
digest: '8f4dd5aef9cea829d8802ffcced2e8ed6b48ac23bbfbb0fae2fad0fd'
},
MonteTestCase{
name: 'checkpoint 10'
count: 10
digest: '03aeb918feab459e39af29ff3aaf406088bf06d793338bbd563641a2'
},
MonteTestCase{
name: 'checkpoint 11'
count: 11
digest: 'de80c312b153fbd7241c8bc432d1ed253d26dcc6f458b953ac2d9259'
},
MonteTestCase{
name: 'checkpoint 12'
count: 12
digest: '3eb8d347cc2565ddd71f7fc21cff7eb3a2cf8e85c5e1d4c751f69f26'
},
MonteTestCase{
name: 'checkpoint 13'
count: 13
digest: 'dbfd7033a4f884ecf7053f07b4c51f3efb1c09084cc7bbe667196a3e'
},
MonteTestCase{
name: 'checkpoint 14'
count: 14
digest: '5323fc60310fe29900eb7a500f29897001c37945c5f8849674725553'
},
MonteTestCase{
name: 'checkpoint 15'
count: 15
digest: 'c3d9416549bebebf679c0122a9c5bb86c0b514c6a4e9eda1e9782040'
},
MonteTestCase{
name: 'checkpoint 16'
count: 16
digest: '749fc9c8c21957ddcaf5eff69c297284d722c79be1fc6c910495a586'
},
MonteTestCase{
name: 'checkpoint 17'
count: 17
digest: 'aa307d91c4037372ff0ca60eb17ec8f1faba862601b95754783ea808'
},
MonteTestCase{
name: 'checkpoint 18'
count: 18
digest: '071e361909c38791e941d995b0b25a3294bdf39456cc012806ada3c5'
},
MonteTestCase{
name: 'checkpoint 19'
count: 19
digest: '18751a765f3b06fc2c9a1888d4bb78b2d2226799a54dba72b5429f25'
},
MonteTestCase{
name: 'checkpoint 20'
count: 20
digest: '54b39c96f6377e3fc2ae0ba4ec89049a6c04808da3fa0415c9053ce4'
},
MonteTestCase{
name: 'checkpoint 21'
count: 21
digest: '58c1eda7eab2fc4046ae153ee95de5df036dbba25b9bb5c5428ea882'
},
MonteTestCase{
name: 'checkpoint 22'
count: 22
digest: '3a02eaf55d04b6052b7d79b96d1e316f90f5dbbb3217dbfaea55faef'
},
MonteTestCase{
name: 'checkpoint 23'
count: 23
digest: 'c8b5eac17f450458c60c075a8f75a24a1dbc58247fcd0ccfaf03e446'
},
MonteTestCase{
name: 'checkpoint 24'
count: 24
digest: '53084cacfebbc4d1ff2db614b42714c18ddde36c6b7c2fbc3b1a8706'
},
MonteTestCase{
name: 'checkpoint 25'
count: 25
digest: '528b867aa481d42fc4931a47d24c3c905aaafa8f6dd5820c67d3579c'
},
MonteTestCase{
name: 'checkpoint 26'
count: 26
digest: 'f0a3cd3f53eb72df80ab67d264a973b6bb2f58bde8f636d9100e8864'
},
MonteTestCase{
name: 'checkpoint 27'
count: 27
digest: '7912f20299d803ba917f408a5a59822d147bcd1008ad5c7b678e2390'
},
MonteTestCase{
name: 'checkpoint 28'
count: 28
digest: '6f0e49505c15669302133d66e45d192e0c6ad02fc5b9aa128aa5517a'
},
MonteTestCase{
name: 'checkpoint 29'
count: 29
digest: 'd06aed0f18e6c377174fd00cc74a92020b3df218c376eac0501a094a'
},
MonteTestCase{
name: 'checkpoint 30'
count: 30
digest: 'cb1bbf7cc5dad591d32534c570e5bca93b8952832779dd6e0ccdc91c'
},
MonteTestCase{
name: 'checkpoint 31'
count: 31
digest: '4775bc11834930118654a3e66e5b7f51871d6f5068f4305dc2845574'
},
MonteTestCase{
name: 'checkpoint 32'
count: 32
digest: 'ce3b5703ed9f946ec4af62fade6e69c2751474ab8da570064ecd2ef6'
},
MonteTestCase{
name: 'checkpoint 33'
count: 33
digest: '49a9e1aa84700874ac27eee43f193df69ed6718b131c4854f729a32e'
},
MonteTestCase{
name: 'checkpoint 34'
count: 34
digest: 'd2c6592251a27cae7d819ac7b476c8a2ff608e57b018f79e0cf19b87'
},
MonteTestCase{
name: 'checkpoint 35'
count: 35
digest: 'a861be4fe188858b913aad179ba575cec91bed54c1ca27608daa27dc'
},
MonteTestCase{
name: 'checkpoint 36'
count: 36
digest: 'bf7975e63aa7f1bef84e7446f1c4a00a75c13285fd7c4a7a8318b1cf'
},
MonteTestCase{
name: 'checkpoint 37'
count: 37
digest: '5d125b14e966c9e431bdc5592d3e6305fae678dc5d6dd064fa1345f9'
},
MonteTestCase{
name: 'checkpoint 38'
count: 38
digest: '8c0fbb471404371145dbb66e8b1c6fc428e6dcfa263e3f5ddb47b30d'
},
MonteTestCase{
name: 'checkpoint 39'
count: 39
digest: '7148b69b04457296fca18e6f7b7f2145d9af9e6bc8f48b8571af0e53'
},
MonteTestCase{
name: 'checkpoint 40'
count: 40
digest: '0bd47a04fc42fb3d9643496e5b0719c22262f741e862adfcef91d61c'
},
MonteTestCase{
name: 'checkpoint 41'
count: 41
digest: '3dbb14133351e5d4bc885d9594c07f7f0f99d4a7c745eff3e7aadc2c'
},
MonteTestCase{
name: 'checkpoint 42'
count: 42
digest: '94f6ba7f94ba9903f7e9bde9b131353fce560c7de7159458f1a39cfa'
},
MonteTestCase{
name: 'checkpoint 43'
count: 43
digest: '65fc03fabbf57904f572358c20f004aa16e0b5ae6530fa961ea10b9d'
},
MonteTestCase{
name: 'checkpoint 44'
count: 44
digest: 'e46532e3e4bd0a0cb389abfba5d679e916a7c193324f1bac498ee1ee'
},
MonteTestCase{
name: 'checkpoint 45'
count: 45
digest: '131d096c684345311cff958706eded139676a74d97a1beb861998485'
},
MonteTestCase{
name: 'checkpoint 46'
count: 46
digest: 'fe3e03637088ac8ee2e035bfc1e7f4e944304663c832c26089e85f9f'
},
MonteTestCase{
name: 'checkpoint 47'
count: 47
digest: 'd570c2b7040fc721b41f2d213f6ee87ac1e37f2b86526cf46c699aa7'
},
MonteTestCase{
name: 'checkpoint 48'
count: 48
digest: '82ede72ad163b914be7c22c085cd99438b6d5557ddd3b752f0a9fb7b'
},
MonteTestCase{
name: 'checkpoint 49'
count: 49
digest: '343c21a0cbde3cccdbbd66eee32c50f5a54b0ac267ec3f41ec07a67f'
},
MonteTestCase{
name: 'checkpoint 50'
count: 50
digest: '94ad254f3b4a76f6140d0dd3775bd75eb3c081085fcb76c91b4cca92'
},
MonteTestCase{
name: 'checkpoint 51'
count: 51
digest: '65fa84f358bc32caaff799129bc2cad883636826415703a2dd1a3cbe'
},
MonteTestCase{
name: 'checkpoint 52'
count: 52
digest: '1c2f47c532856198d03dd85275357dce085c8f6c5a871aac4ff4ea28'
},
MonteTestCase{
name: 'checkpoint 53'
count: 53
digest: '1d51c1019131b41a076cc603f4a8e56b2f4ee70dba326af30d926827'
},
MonteTestCase{
name: 'checkpoint 54'
count: 54
digest: '9789daba3a8e9702d2d0b319878f88b08ebc5876dd5dff6414bf1922'
},
MonteTestCase{
name: 'checkpoint 55'
count: 55
digest: '1968789785f1ef61f849bcb29fbc1491c006021f729718e72f29b80d'
},
MonteTestCase{
name: 'checkpoint 56'
count: 56
digest: '62dca9550461f8a85e1abca4192a8a55a6e6663ebcda9ba6fb95f10c'
},
MonteTestCase{
name: 'checkpoint 57'
count: 57
digest: 'ee190aa251c1a2ae0a376b4c6b6ab3bb09f743fa01eafaab68d170e3'
},
MonteTestCase{
name: 'checkpoint 58'
count: 58
digest: '02273be94aaaf4a1d22496821e8abda8c418d3a4c278947c27d6c912'
},
MonteTestCase{
name: 'checkpoint 59'
count: 59
digest: '3998a213e392978a38016545a59bd435180da66d2b3da373088f406a'
},
MonteTestCase{
name: 'checkpoint 60'
count: 60
digest: '7308f2145d345bdb01c38a9993a0ec81ed5164ed0c6caabfa3b23fea'
},
MonteTestCase{
name: 'checkpoint 61'
count: 61
digest: '3ccde61f4734978995b7489bad8c1e6bafe03f7c3886e9b4ef0f1aa0'
},
MonteTestCase{
name: 'checkpoint 62'
count: 62
digest: 'cca9745f59f3ae2bbb8d65d31c171aa33960c8c6fa4689bb7e6d2152'
},
MonteTestCase{
name: 'checkpoint 63'
count: 63
digest: 'c976de72db46c1a254293af6093c563ce43232077c249584c016ff6f'
},
MonteTestCase{
name: 'checkpoint 64'
count: 64
digest: 'f1448af3cfe317aff1470f0a3de7bf533d77dc7f55e8dd790fd57727'
},
MonteTestCase{
name: 'checkpoint 65'
count: 65
digest: 'd4be0ccfe4913851c9636ed036c625524e72891c5c0627aae50288ce'
},
MonteTestCase{
name: 'checkpoint 66'
count: 66
digest: '6bd99c53693d4e2467ba6094710a6d2f48cc2ae907c4ae28604586a1'
},
MonteTestCase{
name: 'checkpoint 67'
count: 67
digest: '2eb4fa0872ede2a378386e40002cb00b4d1c2fca3413b944ed210915'
},
MonteTestCase{
name: 'checkpoint 68'
count: 68
digest: '48b624151c9d3a1cc8e9d6665d42d4e640ac91abcd3556a31ff0250c'
},
MonteTestCase{
name: 'checkpoint 69'
count: 69
digest: '31159840b7cb040d819ebee1ed0e52d09f5805be523cccc22eeacba9'
},
MonteTestCase{
name: 'checkpoint 70'
count: 70
digest: 'f9a67791dcae0aea00f77f8536ddba439e9fcf7e5b1ed827f83818a8'
},
MonteTestCase{
name: 'checkpoint 71'
count: 71
digest: 'a5913105fba645ba0df942da96d271a1d5efb923a4f61eb463450ea9'
},
MonteTestCase{
name: 'checkpoint 72'
count: 72
digest: '6ece291f81eceaa9eb5a5e228c9924f165b8b10e2cf0e143dd5fe601'
},
MonteTestCase{
name: 'checkpoint 73'
count: 73
digest: 'e07ab143f09eb8ad0d381b888adb22229c2e2a8b067e0fd012ef67a7'
},
MonteTestCase{
name: 'checkpoint 74'
count: 74
digest: '88a33980be5bc911c1713d5c2bd2e5ecca7fc87879501aefa9722c89'
},
MonteTestCase{
name: 'checkpoint 75'
count: 75
digest: 'a709d188da8ee187d91bd17069f785ebb379df013d78844a45b2bfe5'
},
MonteTestCase{
name: 'checkpoint 76'
count: 76
digest: '306fa7bd696b3e9841f84d1c861712acba0febddd7a952499b96579e'
},
MonteTestCase{
name: 'checkpoint 77'
count: 77
digest: '61341dee2e2869112bba2e1077fb409375f755dcafc1457bf49e0e8e'
},
MonteTestCase{
name: 'checkpoint 78'
count: 78
digest: '0959a6e3b727c6213119b9e8411132b5819eb848bec6ebda0b75578a'
},
MonteTestCase{
name: 'checkpoint 79'
count: 79
digest: '11cef0312aaedb9d0b26de64656406c8f4c358e6d3db459d364481de'
},
MonteTestCase{
name: 'checkpoint 80'
count: 80
digest: '5de71b191eec70e591c22ebe3a5d2973aa3172f1c272e926cc0d4873'
},
MonteTestCase{
name: 'checkpoint 81'
count: 81
digest: 'ab218bf4268aec9b41dd2db80622e4c0319cc0de12a60e06d80414ea'
},
MonteTestCase{
name: 'checkpoint 82'
count: 82
digest: '5c83874afe6da0443abfbbbf8ceef38f9400b63593ee7a29d467b4f5'
},
MonteTestCase{
name: 'checkpoint 83'
count: 83
digest: 'ba0fd01f699a0d00a0dff4c63f6ad19e9530a7ad11fec504e6481816'
},
MonteTestCase{
name: 'checkpoint 84'
count: 84
digest: '835ec2c57424baaeed09a7c0c0b6e8bf9d1cec83de4c719846c990fb'
},
MonteTestCase{
name: 'checkpoint 85'
count: 85
digest: '64d95f2c92343d8fca6f6914fba8814478850b5d4c2eb227f4ae6fa1'
},
MonteTestCase{
name: 'checkpoint 86'
count: 86
digest: 'f8dd5355827ac4bd040fc05ed6cb2914d013f126487a6d5f2c22f767'
},
MonteTestCase{
name: 'checkpoint 87'
count: 87
digest: 'be5bbf68d6b99749edefa6b113638ca5cf5fddfd8fcd4d719aeb54b5'
},
MonteTestCase{
name: 'checkpoint 88'
count: 88
digest: '3434d03e98d0af69281e7a7ff8301369c5bc6166cd29b83397ad3fd7'
},
MonteTestCase{
name: 'checkpoint 89'
count: 89
digest: '747b2a7cfb8c4fef7de0a08499f8b19f37e9161b855a84bd50ef84c5'
},
MonteTestCase{
name: 'checkpoint 90'
count: 90
digest: 'c1c1fa2bbb10c5672b040ed0c33d4d93e0fd210d1373fc7fd2312c0c'
},
MonteTestCase{
name: 'checkpoint 91'
count: 91
digest: '671f67380b7676ee7c9fbfe71f3807e3575745ec3ae3128420a141fd'
},
MonteTestCase{
name: 'checkpoint 92'
count: 92
digest: 'e88394adf710b9764a448abc6d62928b0268c6b119306f3c93d7b6d2'
},
MonteTestCase{
name: 'checkpoint 93'
count: 93
digest: '711cc90bfdeed121bd5a8629a9cba6df7bf8df89184ec64ee918cc67'
},
MonteTestCase{
name: 'checkpoint 94'
count: 94
digest: '3f63432484eaa1f389d27947a84e256618f9bc81015993cac386887a'
},
MonteTestCase{
name: 'checkpoint 95'
count: 95
digest: 'e00e0bf2a32227461230a065bbd2eeb5364277e83a850c53ef5c92e9'
},
MonteTestCase{
name: 'checkpoint 96'
count: 96
digest: '1977311cea23a681c83dc58a6863e362bf6c02e30f4c9c4c8439ab4e'
},
MonteTestCase{
name: 'checkpoint 97'
count: 97
digest: '2853a64f56c6282de53e30eba9418dd62eccb8c9a662c313b4768265'
},
MonteTestCase{
name: 'checkpoint 98'
count: 98
digest: 'ca9d0a2eeb484b9809c3850f166362d893f951f5e93cc7a3c72522e0'
},
MonteTestCase{
name: 'checkpoint 99'
count: 99
digest: '27033d2d89329ba9d2a39c0292552a5f1f945c115d5abf2064e93754'
},
]
fn test_monte_messages() {
mut msg_seed := hex.decode(seed)!
for c in monte_cases {
mut md0 := msg_seed.clone()
mut md1 := msg_seed.clone()
mut md2 := msg_seed.clone()
mut md3 := msg_seed.clone()
mut mi := []u8{len: 0, cap: 64}
for _ in 0 .. 1000 {
mi.clear()
mi << md0
mi << md1
mi << md2
md3 = sha256.sum224(mi)
md0 = md1.clone()
md1 = md2.clone()
md2 = md3.clone()
}
msg_seed = md3.clone()
expected_result := hex.decode(c.digest)!
assert md3 == expected_result, 'failed ${c.name}'
}
}
@@ -0,0 +1,381 @@
// These tests are derived from the Secure Hash Algorithm Validation System
// test vectors contained in:
// https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/shs/shabytetestvectors.zip
//
// For SHA224, the test vectors come from:
// SHA224ShortMsg.rsp
// SHA224LongMsg.rsp
import crypto.sha256
import encoding.hex
// This structure deals with both the short message and long message tests
struct SHA224TestCase {
name string
message string
digest string
}
// short message test cases
const short_cases = [
SHA224TestCase{
name: 'test case 0'
message: ''
digest: 'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f'
},
SHA224TestCase{
name: 'test case 1'
message: '84'
digest: '3cd36921df5d6963e73739cf4d20211e2d8877c19cff087ade9d0e3a'
},
SHA224TestCase{
name: 'test case 2'
message: '5c7b'
digest: 'daff9bce685eb831f97fc1225b03c275a6c112e2d6e76f5faf7a36e6'
},
SHA224TestCase{
name: 'test case 3'
message: '51ca3d'
digest: '2c8959023515476e38388abb43599a29876b4b33d56adc06032de3a2'
},
SHA224TestCase{
name: 'test case 4'
message: '6084347e'
digest: 'ae57c0a6d49739ba338adfa53bdae063e5c09122b77604780a8eeaa3'
},
SHA224TestCase{
name: 'test case 5'
message: '493e14623c'
digest: '7f631f295e024e74552083245ca8f988a3fb65680ae97c3040d2e65c'
},
SHA224TestCase{
name: 'test case 6'
message: 'd729d8cd1631'
digest: '342e8e6b23c1c6a54910631f098e08e836259c57e49c1b1d023d166d'
},
SHA224TestCase{
name: 'test case 7'
message: 'cbf2061e10faa5'
digest: '3aa702b1b66dc57d7aec3ccdbdfbd88592d7520f843ba5d0fa481168'
},
SHA224TestCase{
name: 'test case 8'
message: '5f77b3664823c33e'
digest: 'bdf21ff325f754157ccf417f4855360a72e8fd117d28c8fe7da3ea38'
},
SHA224TestCase{
name: 'test case 9'
message: '10713b894de4a734c0'
digest: '03842600c86f5cd60c3a2147a067cb962a05303c3488b05cb45327bd'
},
SHA224TestCase{
name: 'test case 10'
message: '006470d57dad9893dc03'
digest: 'c90026cda5ad24115059c62ae9add57793ade445d4742273288bbce7'
},
SHA224TestCase{
name: 'test case 11'
message: '6f29ca274190400720bba2'
digest: 'ac53157947aa4b2a19089182382a4363d182dd8e4ca79cd8571390be'
},
SHA224TestCase{
name: 'test case 12'
message: '17e8556176fcca2addbdde29'
digest: 'cc6ad0488db0222066f740557b5758a19b30372b302332295d8c3aff'
},
SHA224TestCase{
name: 'test case 13'
message: 'dbf163601db9a122a4026824de'
digest: '9849845f4e47e1ece9a1c1e01a0d896ffea61c6c8894a75a11ce5f49'
},
SHA224TestCase{
name: 'test case 14'
message: '5e1ef2ad86ceaf5439fe87d2ec9b'
digest: '223c5d5d4a0116b32cea044f9af0fe44babea1c5ab201502591bcd5f'
},
SHA224TestCase{
name: 'test case 15'
message: '65f3b9866fb8002b53cfaf806f702f'
digest: 'b1e0806a218d593821fde8e9eacc44ab5287c32209a94f011ab66b75'
},
SHA224TestCase{
name: 'test case 16'
message: 'b776708ffb91b3515ac46598ab9fa796'
digest: '427311b1d7ab2488791c4deeb4251d783fe5f9806bfdfb5188c5443d'
},
SHA224TestCase{
name: 'test case 17'
message: 'a4bc10b1a62c96d459fbaf3a5aa3face73'
digest: 'd7e6634723ac25cb1879bdb1508da05313530419013fe255967a39e1'
},
SHA224TestCase{
name: 'test case 18'
message: '9e8f3c6645c1749b55c50d2018ce40dc2427'
digest: '2f5a583bf588c8988a572d128a95bea5ef1b66780a7d4be9c29efc31'
},
SHA224TestCase{
name: 'test case 19'
message: '2db6d207c0b7d9117f24d78ee59abf2f316978'
digest: '35681fce28307cae19522c23cbd4a77969347f7d8ee4a3088ba90ada'
},
SHA224TestCase{
name: 'test case 20'
message: '3df5e7f399f6dd61a12a9d4e9464fc4997c1f37b'
digest: 'a3e68076e30751085a843a6cbfbf0f3dee63d9c4219c914372e50b28'
},
SHA224TestCase{
name: 'test case 21'
message: '65781d018f27ca0c72a9fa9ab4648ed369646dd3ce'
digest: 'd15ef0d872d02da6427b8d0349dea2f204e67133b7365b4b150efc3c'
},
SHA224TestCase{
name: 'test case 22'
message: 'af48eeddd93fee69d1bd7de428a63986011d10945eaf'
digest: 'b89d428ee42e397cf11029ecbb27baddd036c8938f51c8ab56b875ac'
},
SHA224TestCase{
name: 'test case 23'
message: 'df2bf0d5f9c994ac69d78baa0d512eceb74d8a047531c1'
digest: 'db8e1ce68c8c6b84d6db755c2b8bf54f3c4b081a881efcddaf303294'
},
SHA224TestCase{
name: 'test case 24'
message: '48d2f20955ea2d13433c20bc0404eb2e6ad79ed28f7cb4c0'
digest: '3617cc3179f8b59adce181eebeed5e2763f62650949224a67e53694b'
},
SHA224TestCase{
name: 'test case 25'
message: '218f74a42d3a47ef3b806601fba024b078cbff4e4b85772e0e'
digest: 'b5f40b95dcc363b97e9d00b67c5d7c37f17ab563297d2d67a4df20c9'
},
SHA224TestCase{
name: 'test case 26'
message: 'ef55b1e797000b04fcdb9b3021b09327e3b4e269d20cabdf418f'
digest: '827b223d51240c2e3271c534c19c5637b6fe10083e85bcf06761ef21'
},
SHA224TestCase{
name: 'test case 27'
message: '96df4387dc2c40297043bea36483f65e4eb1e07e93359cb7e68610'
digest: '98e430a63fcdedafc9419010f7f59a4d816a45b4f973beb62530ff8c'
},
SHA224TestCase{
name: 'test case 28'
message: '3ec0aa8d30d5ed825b77dc7095f421b1e608158797a377ff8bed641b'
digest: '3108321eb7ff857f6aae69101b937f32a51ea279a6c14ba5232ac8c1'
},
SHA224TestCase{
name: 'test case 29'
message: '8b0239712039f077ce323b35f4e306787b9b35270096e57735cff45d84'
digest: 'a5c740d3ce46bb2e0a048488f2b0605c6d0ca0ea2f382d043d13db97'
},
SHA224TestCase{
name: 'test case 30'
message: '044be30167a9758c46c727921dc4eb4e0dcb965623423e6fdd44e7a4ea52'
digest: '6eb78313c743ea8769d8340f284dda6ded64a1db64392f21abb82c5c'
},
SHA224TestCase{
name: 'test case 31'
message: '57f6118bacce47ecc31ce8b0c083d3c9219e0dbe9e4fbea154537c41231acc'
digest: '0dbb53c866d63af44c222c76c825df0e379dcedfb958db03b6fd29a5'
},
SHA224TestCase{
name: 'test case 32'
message: 'fe1f0fb02c9011f4c8c5905934ed15136771737ce31c5859e67f235fe594f5f6'
digest: 'bbeaacc632c2a3db2a9b47f157ab54aa27776c6e74cf0bcaa91b06d5'
},
SHA224TestCase{
name: 'test case 33'
message: '14fb01ae9d6015ecb3e56d6ecdfa4bc0533186adf8457f5e4a5c57c687895f3db3'
digest: '178272c7d7cc71b15074c27e3b7997d4a3ba99626986a1a16cf30030'
},
SHA224TestCase{
name: 'test case 34'
message: 'ff6c49712f044f4063c14125c0cdfba18ed8b7138453768a45dfa2d82a05f1e84227'
digest: '403284c888a7280bc8bfc25f0c34182cd378306a21a1404d4e1c40cf'
},
SHA224TestCase{
name: 'test case 35'
message: 'f900bd7e0117247f97c8fc7a665c76a35f571c3366571d6c4a3ee5d7fb93f1d1f726e2'
digest: '48235b9820d66d8885faabf6a9ede63ba2a21b6177e987a33242373e'
},
SHA224TestCase{
name: 'test case 36'
message: '42d38188ac49440cfefb77db975e083e6b22348c4c67f0f8692e88ad140d861dc828d595'
digest: '615344f890e5bcf71b5efe39de1fc942ba1fe30dd9e9146adb6a41bf'
},
SHA224TestCase{
name: 'test case 37'
message: '74fdd7d958b8ae7c2c3c5cff4266dfb2b3b842c9f59ecbbcaff575edcbcda08ccd6e08b764'
digest: '66d7d6c54fc7775a0ba845ba3e11719fa535b9289f20b098c5f7a342'
},
SHA224TestCase{
name: 'test case 38'
message: '934416dd0581e22f2bfbece7bb64afe820451fa21342df7e6f9fb37c4103381a1f7cd379bcc4'
digest: 'fae8f1aa22def4dbaa814c5b0babdec43394951792c937050d2963a6'
},
SHA224TestCase{
name: 'test case 39'
message: '102401c84a716ae72579c6ae79c359ea309ffd95abffae4c61884c03c9e99df77b6c92e492cacb'
digest: '8f34812d57a16ef8a51ad987660c5f8623e0fa9d89846e28d46d14d9'
},
SHA224TestCase{
name: 'test case 40'
message: '79bc8fb60f85d15a2386566e3e7314df284533085add1c7bb6ead3ff760c86d5633a66404761b544'
digest: '65c54014cfa30f0bc27d1c6efa96ae8481f4c2505bff272956eab0df'
},
SHA224TestCase{
name: 'test case 41'
message: 'db3121ea71294983b185207a9d8de3e484a66c0431bf07c962eb82977c4f834b7c3f1e7931a4a7f7a9'
digest: '9316d2f021c2913d63a7e66924c87c161c3cfde0ea7ba07f54772862'
},
SHA224TestCase{
name: 'test case 42'
message: '0dd51aa660c5cb4b7f78c46852c1db8707ab451c1367b6187388c8bb3873a1aa4210d0414cc6792a29a7'
digest: '31989e7a62a5132a5070d77250d8904bb82d457dc63469d06b50185e'
},
SHA224TestCase{
name: 'test case 43'
message: '487fd2e5b694b7071d3789a258a51e8604dc0d3e8f5d62f39131968e602abe1ddf6b0278962a512408b553'
digest: 'e798683438284626d710877d9eea3a0e02f349fc43acb7f9f8f9e81c'
},
SHA224TestCase{
name: 'test case 44'
message: '11183bdebfef58e4da5b1cb73be0d30b20da304d8659d921da2e270fd14626799537e4d12119e809ee97004a'
digest: '96870657d6cb668be3995aa8bd31df77840d1d1915d72482e83b6b2c'
},
SHA224TestCase{
name: 'test case 45'
message: 'a239de5c8e2644e8f030d94d98f1a30664e6fd961dc2977a9c08be5c31d8de89450945a53d79299ea2a1edde7f'
digest: 'e99743d4fd26c8800c36a67b6762247c29da6b62794123c59de06dc0'
},
SHA224TestCase{
name: 'test case 46'
message: '917c4577aa6b0f9df49999fc1c958cb09b7fd5fc80be949670f03545eb27dcaed052076b24f96f5e0f2e2f4527c0'
digest: '7ecd693d4d9cf43929464698efa0bac33c2e1424f816edc769260978'
},
SHA224TestCase{
name: 'test case 47'
message: 'c3f1e735a6741aa481ad577a98dbac1f03cc80ea0dae1b94db2369ed4e93facd29c64e4e77b25038279120bdfa3715'
digest: '86f0d89d8e14fd8b6606412d71a7a54a347b304ea5d49c208f2266ab'
},
SHA224TestCase{
name: 'test case 48'
message: 'de4fbfd553cdf37019f25afa82dc6b9970f4bb1ebbc37f80d3084c88a70722cdc523a9e3c2afbad0dc0221bfdec9a2f9'
digest: '4c5262acb4a2a44eaa9bc6757024fb202ef4d5a7a16fa37252a422b5'
},
SHA224TestCase{
name: 'test case 49'
message: 'db2e2eb636610cf42e9b33433acce1b3b925949f297dd83199f45d2861d64cd910c2db74a60b2089045e22cba0a536137d'
digest: '16bf4e45bcdc60447c68dcb30e6b08f55ce9f4124a29cf1f9a9d065d'
},
SHA224TestCase{
name: 'test case 50'
message: 'a8e729d336d5d6ac50e1e22f0b193b66e26042fc6459214129875e740ab2b142918c138aaf941863ad3b7e6065450613b273'
digest: '452bf2e5ebfc4e451cc434bc09e2a10032eed0b7627cf55e7e5ed0e2'
},
SHA224TestCase{
name: 'test case 51'
message: 'd05317d4b535f9d10f739d0c2dedf3ffb090c1ad9d205089b1346693f58273c4925c0face57ba45ad6fc687c66a88fc78878be'
digest: '4f03c439e097b51b00e314f675937c4d911505859fb7ab16adc65e44'
},
SHA224TestCase{
name: 'test case 52'
message: '26bb4ed4f0424c60fe4212ff8c955e89e2f553a7d7701be59416d2089af59fa1074724e214e919b1e30f33fb78374b4b055bbc9b'
digest: 'e7c899e27009d4dc77c2d300f191b757e52c9e7eac4b023bfab2b52a'
},
SHA224TestCase{
name: 'test case 53'
message: 'f015ec83944f03292463c4345fdb1c26d1ea07645facbc9520ae244b6eb191e53dabadb4ac0fb15cda4ed77dfb9e1193abfafb1b81'
digest: '459e40b3fbd612912f0217c60099379ce077cd02505871b0c9c14e7a'
},
SHA224TestCase{
name: 'test case 54'
message: '0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c809cb4171bfa4791539aca1abd91900e53ba93ca0efd'
digest: 'fadebab7c3d0fb8e97e429b79083087735e4ab385a789521260ef3ad'
},
SHA224TestCase{
name: 'test case 55'
message: '445e8698eeb8accbaac4ffa7d934fffd16014a430ef70f3a9174c6cfe96d1e3f6ab1377f4a7212dbb30146dd17d9f470c4dffc45b8e871'
digest: '4c7ae028c0fe61f2a9cada61fae30685b77f04c6442576e912af9fa6'
},
SHA224TestCase{
name: 'test case 56'
message: '52839f2f0853a30df14ec897a1914c685c1ac21470d00654c8c37663bfb65fa732dbb694d9dd09ced723b48d8f545846ba168988b61cc724'
digest: '2f755a57674b49d5c25cb37348f35b6fd2de2552c749f2645ba63d20'
},
SHA224TestCase{
name: 'test case 57'
message: '5fe8c2072d8900287ccaf07f3f66b0c22acd3e0bb91d9573754e19e373ac35271d8b43443436ac0c162850ef3d7f281409ad29a9bf716c77d1'
digest: '42909757f6e229f69f04cc7a863c4e70e48c7c3575057b455c959775'
},
SHA224TestCase{
name: 'test case 58'
message: 'e8064d83f3d643af8718c87e3ccd6a9733685eac61d572a22ab943f232fcb04f70858e8984449db14a76bb7eaf2458efc3ed2a32100622c52b7f'
digest: '1a1d8ed54cb45c97bc970754b43eb93d9eabde4c7b07f76ad82d8ede'
},
SHA224TestCase{
name: 'test case 59'
message: '87c9a517e28d1bb54ad20fca76460efd894d7786e68ee8d746b2f68208682157c8ad06cc324ad7a3189e09c6c39d4c768719c0a49a41669f2767d5'
digest: '605977cf87b9b309bbddaaa64e528ace66b04df9f72c0e7ec88be1da'
},
SHA224TestCase{
name: 'test case 60'
message: '59fdac3b6b32039291801c7d6f46ede8d26dc5b7a192e007116739b617569f2523680b3c0b6631af453e55805aa760c6970833ac06963bbc9dbd455e'
digest: 'e9f0cb1dc8337e906385892f2348a8ba4412318ecad9b96e3711531f'
},
SHA224TestCase{
name: 'test case 61'
message: '30350a4df0b58ff49c0fa09e426fcd7007b290c760c825c1855d9b0023b82caa51e3cab4c60cfa61492be50568e5ac0f6db0fd468e39e4536403e3809f'
digest: '776cc6636c02408fbf65ace73ae80017108b917c16c5a912fd860241'
},
SHA224TestCase{
name: 'test case 62'
message: 'ef797a0d43c30b4fe1014bdb9420879c2ff845d27e73d55a7df22930c8ece73253d8bb265b4ef2ff9c69455cc56ff25229b4126bb7bb26ee2c9ff36187b1'
digest: 'f5b9ffb102affac352a4a535a00f89b06c268cf4881d712668906025'
},
SHA224TestCase{
name: 'test case 63'
message: '716944de41710c29b659be10480bb25a351a39e577ee30e8f422d57cf62ad95bda39b6e70c61426e33fd84aca84cc7912d5eee45dc34076a5d2323a15c7964'
digest: '61645ac748db567ac862796b8d06a47afebfa2e1783d5c5f3bcd81e2'
},
SHA224TestCase{
name: 'test case 64'
message: 'a3310ba064be2e14ad32276e18cd0310c933a6e650c3c754d0243c6c61207865b4b65248f66a08edf6e0832689a9dc3a2e5d2095eeea50bd862bac88c8bd318d'
digest: 'b2a5586d9cbf0baa999157b4af06d88ae08d7c9faab4bc1a96829d65'
},
]
// long message test cases
const long_cases = [
SHA224TestCase{
name: 'test case 163'
message: 'f149e41d848f59276cfddd743bafa9a90e1ee4a263a118142b33e3702176ef0a59f8237a1cb51b42f3ded6b202d9af0997898fdd03cf60bda951c514547a0850cec25444ae2f24cb711bfbafcc3956c941d3de69f155e3f8b10f06db5f37359b772ddd43e1035a0a0d3db33242d5843033833b0dd43b870c6bf60e8deab55f317cc3273f5e3ba747f0cb65050cb7228796210d9254873643008d45f29cfd6c5b060c9a'
digest: '9db6dc3a23abd7b6c3d72c38f4843c7de48a71d0ba91a86b18393e5f'
},
SHA224TestCase{
name: 'test case 262'
message: 'c39147fad02c6ed5876eb3257837c3f456008694fac94932aa521bae9c8e77abb65524e298595abbdc5b261e9c9f0f86359dfa584bf94b740eb54d09bba6d4ad652421adf50605a170ce4a4478204e831679f1d4b61db1c9735114e595cb47ae58670403f01bb8b0c92de64013a3c6137efc33b0421dc45b638e38eb33e617d61884968e8f80bb1071e1c3b97611c15cf78e8793f8e1c95265d480c29ce08d4c2ce59ff3dc1e56e8f053a958a75085890897b625de520bd6028bb512d89ff1391cf0e7dddfdbd160ccea5fc5b04a5ac03a7f890fff56d10dc01b9f85f00d8bc4710f35f29fa073a28f0dafa798e58a2913aec5f960d662222aed06c1eb11a216b2a952da2456'
digest: '2b05b170d4976409f23ce885a0a2c0a943226688d4f5bbaf35fabb46'
},
]
fn test_short_messages() {
for c in short_cases {
message := hex.decode(c.message)!
expected_result := hex.decode(c.digest)!
actual_result := sha256.sum224(message)
assert actual_result == expected_result, 'failed ${c.name}'
}
}
fn test_long_messages() {
for c in long_cases {
message := hex.decode(c.message)!
expected_result := hex.decode(c.digest)!
actual_result := sha256.sum224(message)
assert actual_result == expected_result, 'failed ${c.name}'
}
}
+251
View File
@@ -0,0 +1,251 @@
// Copyright (c) 2019-2024 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
// Package sha256 implements the SHA224 and SHA256 hash algorithms as defined
// in FIPS 180-4.
// Based off: https://github.com/golang/go/tree/master/src/crypto/sha256
// Last commit: https://github.com/golang/go/commit/3ce865d7a0b88714cc433454ae2370a105210c01
module sha256
import encoding.binary
// The size of a SHA256 checksum in bytes.
pub const size = 32
// The size of a SHA224 checksum in bytes.
pub const size224 = 28
// The blocksize of SHA256 and SHA224 in bytes.
pub const block_size = 64
const chunk = 64
const init0 = u32(0x6A09E667)
const init1 = u32(0xBB67AE85)
const init2 = u32(0x3C6EF372)
const init3 = u32(0xA54FF53A)
const init4 = u32(0x510E527F)
const init5 = u32(0x9B05688C)
const init6 = u32(0x1F83D9AB)
const init7 = u32(0x5BE0CD19)
const init0_224 = u32(0xC1059ED8)
const init1_224 = u32(0x367CD507)
const init2_224 = u32(0x3070DD17)
const init3_224 = u32(0xF70E5939)
const init4_224 = u32(0xFFC00B31)
const init5_224 = u32(0x68581511)
const init6_224 = u32(0x64F98FA7)
const init7_224 = u32(0xBEFA4FA4)
// digest represents the partial evaluation of a checksum.
struct Digest {
mut:
h []u32
x []u8
nx int
len u64
is224 bool // mark if this digest is SHA-224
}
// free the resources taken by the Digest `d`
@[unsafe]
pub fn (mut d Digest) free() {
$if prealloc {
return
}
unsafe {
d.x.free()
d.h.free()
}
}
fn (mut d Digest) init() {
d.h = []u32{len: (8)}
d.x = []u8{len: chunk}
d.reset()
}
// reset the state of the Digest `d`
pub fn (mut d Digest) reset() {
if !d.is224 {
d.h[0] = u32(init0)
d.h[1] = u32(init1)
d.h[2] = u32(init2)
d.h[3] = u32(init3)
d.h[4] = u32(init4)
d.h[5] = u32(init5)
d.h[6] = u32(init6)
d.h[7] = u32(init7)
} else {
d.h[0] = u32(init0_224)
d.h[1] = u32(init1_224)
d.h[2] = u32(init2_224)
d.h[3] = u32(init3_224)
d.h[4] = u32(init4_224)
d.h[5] = u32(init5_224)
d.h[6] = u32(init6_224)
d.h[7] = u32(init7_224)
}
d.nx = 0
d.len = 0
}
fn (d &Digest) clone() &Digest {
return &Digest{
...d
h: d.h.clone()
x: d.x.clone()
}
}
// new returns a new Digest (implementing hash.Hash) computing the SHA256 checksum.
pub fn new() &Digest {
mut d := &Digest{}
d.init()
return d
}
// new224 returns a new Digest (implementing hash.Hash) computing the SHA224 checksum.
pub fn new224() &Digest {
mut d := &Digest{}
d.is224 = true
d.init()
return d
}
// write writes the contents of `p_` to the internal hash representation.
pub fn (mut d Digest) write(p_ []u8) !int {
unsafe {
mut p := p_
nn := p.len
d.len += u64(nn)
if d.nx > 0 {
n := copy(mut d.x[d.nx..], p)
d.nx += n
if d.nx == chunk {
block(mut d, d.x)
d.nx = 0
}
if n >= p.len {
p = []
} else {
p = p[n..]
}
}
if p.len >= chunk {
n := p.len & ~(chunk - 1)
block(mut d, p[..n])
if n >= p.len {
p = []
} else {
p = p[n..]
}
}
if p.len > 0 {
d.nx = copy(mut d.x, p)
}
return nn
}
}
// sum returns the SHA256 or SHA224 checksum of digest with the data.
pub fn (d &Digest) sum(b_in []u8) []u8 {
// Make a copy of d so that caller can keep writing and summing.
mut d0 := d.clone()
hash := d0.checksum()
mut b_out := b_in.clone()
if d0.is224 {
for b in hash[..size224] {
b_out << b
}
} else {
for b in hash {
b_out << b
}
}
return b_out
}
// checksum returns the current byte checksum of the Digest,
// it is an internal method and is not recommended because its results are not idempotent.
@[direct_array_access]
fn (mut d Digest) checksum() []u8 {
mut len := d.len
// Padding. Add a 1 bit and 0 bits until 56 bytes mod 64.
mut tmp := []u8{len: (64)}
tmp[0] = 0x80
if int(len) % 64 < 56 {
d.write(tmp[..56 - int(len) % 64]) or { panic(err) }
} else {
d.write(tmp[..64 + 56 - int(len) % 64]) or { panic(err) }
}
// Length in bits.
len <<= u64(3)
binary.big_endian_put_u64(mut tmp, len)
d.write(tmp[..8]) or { panic(err) }
if d.nx != 0 {
panic('d.nx != 0')
}
mut digest := []u8{len: size}
binary.big_endian_put_u32(mut digest, d.h[0])
binary.big_endian_put_u32(mut digest[4..], d.h[1])
binary.big_endian_put_u32(mut digest[8..], d.h[2])
binary.big_endian_put_u32(mut digest[12..], d.h[3])
binary.big_endian_put_u32(mut digest[16..], d.h[4])
binary.big_endian_put_u32(mut digest[20..], d.h[5])
binary.big_endian_put_u32(mut digest[24..], d.h[6])
if !d.is224 {
binary.big_endian_put_u32(mut digest[28..], d.h[7])
}
return digest
}
// sum returns the SHA256 checksum of the bytes in `data`.
// Example: assert sha256.sum('V'.bytes()).len > 0 == true
pub fn sum(data []u8) []u8 {
return sum256(data)
}
// sum256 returns the SHA256 checksum of the data.
pub fn sum256(data []u8) []u8 {
mut d := new()
d.write(data) or { panic(err) }
return d.checksum()
}
// sum224 returns the SHA224 checksum of the data.
pub fn sum224(data []u8) []u8 {
mut d := new224()
d.write(data) or { panic(err) }
checksum := d.checksum()
mut result := []u8{len: size224}
copy(mut result, checksum[..size224])
return result
}
fn block(mut dig Digest, p []u8) {
// For now just use block_generic until we have specific
// architecture optimized versions
block_generic(mut dig, p)
}
// size returns the size of the checksum in bytes.
pub fn (d &Digest) size() int {
if !d.is224 {
return size
}
return size224
}
// block_size returns the block size of the checksum in bytes.
pub fn (d &Digest) block_size() int {
return block_size
}
// hexhash returns a hexadecimal SHA256 hash sum `string` of `s`.
// Example: assert sha256.hexhash('V') == 'de5a6f78116eca62d7fc5ce159d23ae6b889b365a1739ad2cf36f925a140d0cc'
pub fn hexhash(s string) string {
return sum256(s.bytes()).hex()
}
// hexhash_224 returns a hexadecimal SHA224 hash sum `string` of `s`.
pub fn hexhash_224(s string) string {
return sum224(s.bytes()).hex()
}
@@ -0,0 +1,551 @@
// These tests are derived from the Secure Hash Algorithm Validation System
// test vectors contained in:
// https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/shs/shabytetestvectors.zip
//
// For SHA256, the test vectors come from:
// SHA256Monte.rsp
import crypto.sha256
import encoding.hex
const seed = '6d1e72ad03ddeb5de891e572e2396f8da015d899ef0e79503152d6010a3fe691'
struct MonteTestCase {
name string
count int
digest string
}
const monte_cases = [
MonteTestCase{
name: 'checkpoint 0'
count: 0
digest: 'e93c330ae5447738c8aa85d71a6c80f2a58381d05872d26bdd39f1fcd4f2b788'
},
MonteTestCase{
name: 'checkpoint 1'
count: 1
digest: '2e78f8c8772ea7c9331d41ed3f9cdf27d8f514a99342ee766ee3b8b0d0b121c0'
},
MonteTestCase{
name: 'checkpoint 2'
count: 2
digest: 'd6a23dff1b7f2eddc1a212f8a218397523a799b07386a30692fd6fe9d2bf0944'
},
MonteTestCase{
name: 'checkpoint 3'
count: 3
digest: 'fb0099a964fad5a88cf12952f2991ce256a4ac3049f3d389c3b9e6c00e585db4'
},
MonteTestCase{
name: 'checkpoint 4'
count: 4
digest: 'f9eba2a4cf6263826beaf6150057849eb975a9513c0b76ecad0f1c19ebbad89b'
},
MonteTestCase{
name: 'checkpoint 5'
count: 5
digest: '3ddf05ba8dfec982451a3e9a97695ea9cdb7098c877d0c2cd2c64e58a87754d9'
},
MonteTestCase{
name: 'checkpoint 6'
count: 6
digest: '2cc3fe501e3b2e33e60407b0a27025735dd04fd7623bb4fceeebae5cad67ad4b'
},
MonteTestCase{
name: 'checkpoint 7'
count: 7
digest: 'c534802a459b40c792e1fa68e54ceab69e333fbeeecad65fb124d2f3cc1f1fc1'
},
MonteTestCase{
name: 'checkpoint 8'
count: 8
digest: '8986e95d85e64822287c78cb7a714339431332182107109d57827776c6cc930e'
},
MonteTestCase{
name: 'checkpoint 9'
count: 9
digest: '72361401c670d07f1151a95e2ee914665c2bdb1228581833c7dc53b89c01c927'
},
MonteTestCase{
name: 'checkpoint 10'
count: 10
digest: '124c443bad9d955e084a3961b079c43c59b5e0d666af38f2f37846e85369a618'
},
MonteTestCase{
name: 'checkpoint 11'
count: 11
digest: '81914b78674a2a6204eef78ff51369526bf0c2e121cd364eb40a8435479dda14'
},
MonteTestCase{
name: 'checkpoint 12'
count: 12
digest: '8eac9d963b44021b70a527ea07420b03f51a998d0d6cb73ad4cb7fc688b4d174'
},
MonteTestCase{
name: 'checkpoint 13'
count: 13
digest: '0427263b4dd3ebfcb7871939dbaca5ca94e794f748c02920c9759dfa554ea534'
},
MonteTestCase{
name: 'checkpoint 14'
count: 14
digest: '3e9d754f2ec273b0056c2fcad2e891aaf9616fe74005d36cbf5ccba2e037b5b3'
},
MonteTestCase{
name: 'checkpoint 15'
count: 15
digest: '986b6594ed96a819e49edb9f65db2ea52168973d7e18ae9e0b8869a8b5dd29a0'
},
MonteTestCase{
name: 'checkpoint 16'
count: 16
digest: '117578126a35176a00f8c0cf999442df0890737be1880f06e6a7270959c114c6'
},
MonteTestCase{
name: 'checkpoint 17'
count: 17
digest: 'fd7f5574788d8ef64b83333ffb62e4cd3311e638db0c514071c19b84e9117afe'
},
MonteTestCase{
name: 'checkpoint 18'
count: 18
digest: '19db7ba6e3488a9e935af33ffb912d60c9d3b98a0be1d78e0b374dcb5274a7fb'
},
MonteTestCase{
name: 'checkpoint 19'
count: 19
digest: '52519e6319505df7a9aa83778618ec10b78c5771bac50e8d3f59bc815dabfb1f'
},
MonteTestCase{
name: 'checkpoint 20'
count: 20
digest: '434d7795fc7510af04b613e120f7f48e6d613ec056ae9fbc7c869b87c1dce63e'
},
MonteTestCase{
name: 'checkpoint 21'
count: 21
digest: '020324de7f6763be57bc4a6a0960258ea401ffe40d68f854e82ccfa9e0612ff7'
},
MonteTestCase{
name: 'checkpoint 22'
count: 22
digest: 'b87c7fd0ec4cd35fab077b64d00917ad06aaccb095bbe4603466644ce6cbce18'
},
MonteTestCase{
name: 'checkpoint 23'
count: 23
digest: '01abbd12b2b476b2d540d0c47edcb56263ea658a8080a8f08dbb313942562f00'
},
MonteTestCase{
name: 'checkpoint 24'
count: 24
digest: 'ce95bb2bf2d5c91402e13ed5271615607f39e0678aae776d18a78351b90b5838'
},
MonteTestCase{
name: 'checkpoint 25'
count: 25
digest: 'b81af264b0bb485f6656be91478f7b96c324fe262fcc366d9ce3edd44ccb85d0'
},
MonteTestCase{
name: 'checkpoint 26'
count: 26
digest: '9e2ad901200ca524c91373f7b5eda9cda142353e763862e350314f793a0b700d'
},
MonteTestCase{
name: 'checkpoint 27'
count: 27
digest: 'dbfabc7124338d6845f083cb1bbdf7b4060274d8e0e98d08bb7ca3779059b45b'
},
MonteTestCase{
name: 'checkpoint 28'
count: 28
digest: 'd93c2cd61f5476ea08d85f741720ab2ce5c4e38cd8254758238155fd68ea7723'
},
MonteTestCase{
name: 'checkpoint 29'
count: 29
digest: '232d9c3b583e297439c859150738e1b1d530812d63a9a2c1cb8e40cb50a2f27b'
},
MonteTestCase{
name: 'checkpoint 30'
count: 30
digest: '8b9c858bd135138d9023a0b5fcf3f12ebbc3b7f721ee0b44be1871187f21f506'
},
MonteTestCase{
name: 'checkpoint 31'
count: 31
digest: '05cedbd568ce9adcf5022999b8f3a28995a910c572375186da5febd775d62b79'
},
MonteTestCase{
name: 'checkpoint 32'
count: 32
digest: '24282cba8f5dfce7e423a103488a9a924080d549853c699159d27816dbdbe5d9'
},
MonteTestCase{
name: 'checkpoint 33'
count: 33
digest: 'ba6e3c38128f93f288e781af8a13e7ce5120c2a43a6d1c0d4edc831247350079'
},
MonteTestCase{
name: 'checkpoint 34'
count: 34
digest: '706fffec5b69f5ef5465b6a8663c302143af743c6b7cd5fec9f3fa9bf9b2e285'
},
MonteTestCase{
name: 'checkpoint 35'
count: 35
digest: '6d32c55c005eea65dacdf0e90f436943d0d0acec3c2355c36e2df1a86d1a11a7'
},
MonteTestCase{
name: 'checkpoint 36'
count: 36
digest: 'b353f425293db464ad814177ea9689f43054bcdbaf75675e918b78a82ca97a50'
},
MonteTestCase{
name: 'checkpoint 37'
count: 37
digest: 'c3fa9993130b3c95d9aed30243ba902035933d18adf5e21d2567674769062e81'
},
MonteTestCase{
name: 'checkpoint 38'
count: 38
digest: '1e77e07988ebd618740c2f89a7bcf0ae2542279ea8895b39aa70ba8bc37ee00f'
},
MonteTestCase{
name: 'checkpoint 39'
count: 39
digest: '063927892a0b095be7d21987ff8157cd4c674c1cd01ab9f0834824e8efbcf938'
},
MonteTestCase{
name: 'checkpoint 40'
count: 40
digest: 'f43054c280f05371cfbac776d43d6001f71350d898677f035aa8f7e5bd7b3fa3'
},
MonteTestCase{
name: 'checkpoint 41'
count: 41
digest: '2427934b28c7a9c2b18a5b7e996351aa567523744f60d54dc35bbb61f56f6fd4'
},
MonteTestCase{
name: 'checkpoint 42'
count: 42
digest: '3633976d174279161e13b49e5866c144ce8c1d17ec1901ad56a02c900273fe11'
},
MonteTestCase{
name: 'checkpoint 43'
count: 43
digest: '5f9788660d82c80155a7fea91896be3be2eb6a7b2ce963f3804cd09da5ac0c8f'
},
MonteTestCase{
name: 'checkpoint 44'
count: 44
digest: '097ef57de6df98c29346e67e7f676569ad402f7a1c88d1cf39ce2d44fd706f72'
},
MonteTestCase{
name: 'checkpoint 45'
count: 45
digest: 'fedcc810c74706a27fc0b6663ab2f9de0761089682dff1279fcd91312af1b8e3'
},
MonteTestCase{
name: 'checkpoint 46'
count: 46
digest: 'bd5d61fea8d23089f3f30266b1daa636a352e49476526e71cc0735cbd17054fe'
},
MonteTestCase{
name: 'checkpoint 47'
count: 47
digest: '5ead027c03d7a55c17f0c783b6d77670cdb8942772077d09dff9a46ecd527bec'
},
MonteTestCase{
name: 'checkpoint 48'
count: 48
digest: '7a06eeea07ca9eb94a98a5e9f00b7efd8de9843b6aa888822c3dccf803637732'
},
MonteTestCase{
name: 'checkpoint 49'
count: 49
digest: '44b6a895058ed3f31a5549407af8f788631f8a6eb8c0a5f2e15facc9190b5672'
},
MonteTestCase{
name: 'checkpoint 50'
count: 50
digest: 'f8a58bff4b54aaebe18fc3f0bb1d24974a125530756dd4a0f15628c35c02ea1c'
},
MonteTestCase{
name: 'checkpoint 51'
count: 51
digest: '3bf2ae5408399aba59f42e5bed35a00d038fada16013ffa5da9e8b7207f6012c'
},
MonteTestCase{
name: 'checkpoint 52'
count: 52
digest: '31d33c0275986b06f6dccf570d1064c7b36e1574cc4371d4bba2e55321d75397'
},
MonteTestCase{
name: 'checkpoint 53'
count: 53
digest: 'bda59cbd65e87a57df3f03c89e4d9511de71da05e2eee0560948696b37615f8f'
},
MonteTestCase{
name: 'checkpoint 54'
count: 54
digest: 'f431cc1817569e92c8ba11ec4741e6dd2e361156575af7b482587ed78e9fb7fe'
},
MonteTestCase{
name: 'checkpoint 55'
count: 55
digest: '1b3b3789a32165f725167da6f5ef89d95de5992783961440fce67b66c3351ea6'
},
MonteTestCase{
name: 'checkpoint 56'
count: 56
digest: 'c9873a09c079ca7f477b5601519ce51896c2a35a28fe05fe8b13e990813c6634'
},
MonteTestCase{
name: 'checkpoint 57'
count: 57
digest: 'fb16cc865ddcf513be298c7d514033ab3fae7a80b285d2b43e82363342e498f4'
},
MonteTestCase{
name: 'checkpoint 58'
count: 58
digest: 'ebaebc261b327f8be24026e32099a6b15927c54dbe390b72756f3f6362ea3b3a'
},
MonteTestCase{
name: 'checkpoint 59'
count: 59
digest: 'ae5a4fdc779d808ba898966c8c14a6c9894107ef3e1d680f6ae37e95cb7e1b67'
},
MonteTestCase{
name: 'checkpoint 60'
count: 60
digest: '5a4a67451c197b038c540878b6e7bc6fce3eea9c95795d611359703d6cc7ca02'
},
MonteTestCase{
name: 'checkpoint 61'
count: 61
digest: 'efb075aa051070a6b2303e026f81a5262a6e64eabb270ec5e13fc6efa3529f6f'
},
MonteTestCase{
name: 'checkpoint 62'
count: 62
digest: '8ff3df1a5cd0840bce61520f1e5645ce272a37b884c1750c69a957134c1a20d2'
},
MonteTestCase{
name: 'checkpoint 63'
count: 63
digest: '8fbd86567c20dc3ea9948dd5ea6f5204028c4ba258c35052994e7c86de2d7701'
},
MonteTestCase{
name: 'checkpoint 64'
count: 64
digest: '670559572a74e9af0513a3f9243bfbfd5805b837705faedc3c480d67a92bc124'
},
MonteTestCase{
name: 'checkpoint 65'
count: 65
digest: 'ef2ad8656fac9c593d301fcfac77a7815d50b42526d3a44e1573316a25b05904'
},
MonteTestCase{
name: 'checkpoint 66'
count: 66
digest: 'a3484a7a6cb5c941e15346a3ac4e09e99a5189cc96a87104d196af3c43cf995e'
},
MonteTestCase{
name: 'checkpoint 67'
count: 67
digest: '966851a0ef41f8d8ff970f4340a8dae8eec4f1999f5fd4f6cbcfa372fbf85495'
},
MonteTestCase{
name: 'checkpoint 68'
count: 68
digest: '8e1559cd4431febfa15662a2ccf2cac82f5401b2657551480bb0e3dd2111032c'
},
MonteTestCase{
name: 'checkpoint 69'
count: 69
digest: '5f535e2e7351cb8caf0070166218238a843c17472cea2f5911008be5d7fd6ba2'
},
MonteTestCase{
name: 'checkpoint 70'
count: 70
digest: '86ac4ea15f10c264b158058f5c13a36a87ac72f840071bbc45399b36823a5709'
},
MonteTestCase{
name: 'checkpoint 71'
count: 71
digest: '5c0d3fe289b2aac7d1bbaf57f4154b8d10875cffc9d8bd2402255ed1615f1d5f'
},
MonteTestCase{
name: 'checkpoint 72'
count: 72
digest: 'd7d808366d0c8b76ce3e7ab80ea11b4e2f8758f9ff404a3aafbf5b0cc191adcb'
},
MonteTestCase{
name: 'checkpoint 73'
count: 73
digest: 'e0768536856d1d7399667d6fd2c32f72416eeea1c40a313ee6edc910a5c3b786'
},
MonteTestCase{
name: 'checkpoint 74'
count: 74
digest: 'd670923731b3e598f5c4db4c7e57fe2275cc6c49b4bf67cb91d520846aec256e'
},
MonteTestCase{
name: 'checkpoint 75'
count: 75
digest: '2cb0bdcc305ef3b3d6b7265ab62bee555c524102679da122424713a9a01d69f6'
},
MonteTestCase{
name: 'checkpoint 76'
count: 76
digest: '5acdc323fe067a4b915ee521ac8eb81bcff4e205d53e4e7f9a69d436035cc5ad'
},
MonteTestCase{
name: 'checkpoint 77'
count: 77
digest: 'e634c43558d12c2a8710f2d6f10a86411cfad5a014e6b6cc159733c8ccece283'
},
MonteTestCase{
name: 'checkpoint 78'
count: 78
digest: '4a05f4bc3fcaf50e6d0916d7e7024b0ed22e9a3c413ff4bbcc0922d2326dcf6e'
},
MonteTestCase{
name: 'checkpoint 79'
count: 79
digest: '17c9d6029e15d3fd84e6809c5ef8a279a040f49ada91601a3ba4572cef7c08bd'
},
MonteTestCase{
name: 'checkpoint 80'
count: 80
digest: '1f21e137da2427536758409f3fbf5842589c5f587f0b9d2d10430f840faaaf45'
},
MonteTestCase{
name: 'checkpoint 81'
count: 81
digest: 'e3d38cff8a8d7fc00693dca5e37b03e7b10dafe4926023e26d937106ddac6a78'
},
MonteTestCase{
name: 'checkpoint 82'
count: 82
digest: 'cd749eb05c67038fe837910310b3b4cdda190f6235fa970602f865bec1b61a1b'
},
MonteTestCase{
name: 'checkpoint 83'
count: 83
digest: 'd596ccddea01b4ae29b68b0e8a191007f0c89a1016c380b49786f2d4fac4c43d'
},
MonteTestCase{
name: 'checkpoint 84'
count: 84
digest: 'cbccb1ff23e33c59dc4c858093c9e215c3759acfe6bc84ff75940b59b25a4e40'
},
MonteTestCase{
name: 'checkpoint 85'
count: 85
digest: '7214c134e9a963d6c43969d3ef44ece825dd9cf35bda5fcce92a6b9d0d3fd1b8'
},
MonteTestCase{
name: 'checkpoint 86'
count: 86
digest: 'aceaf5b775779621319f9ab5d4d370a3359cd6553ed2328cdc9dbab5b68840fa'
},
MonteTestCase{
name: 'checkpoint 87'
count: 87
digest: 'e8123acb0a2fb62978d3811b31676975542993932108ab14d487ad7875ddef72'
},
MonteTestCase{
name: 'checkpoint 88'
count: 88
digest: '660202a436fb05c3d59be699734e77c9750c906c8597ca213d064853ecf8c9f3'
},
MonteTestCase{
name: 'checkpoint 89'
count: 89
digest: '4752b0a5ec3f1fb295d5bfa98fa63a0ba38a02a4c1e1f73b0c4d4e88a07e0317'
},
MonteTestCase{
name: 'checkpoint 90'
count: 90
digest: '1e24f1467c36b051af3241fcf8c2c868b86dcb8e4669931878018e9914129b42'
},
MonteTestCase{
name: 'checkpoint 91'
count: 91
digest: 'd1c3efc99d9487e147282d811ab932d4a24362d09ac909f4854e783887068891'
},
MonteTestCase{
name: 'checkpoint 92'
count: 92
digest: '7dc455cf6f8b2042b6f0f368c44f18a080e5d3912ce3cdaf7142bd61ae50d02e'
},
MonteTestCase{
name: 'checkpoint 93'
count: 93
digest: '4b991c15789084eb1d6c1d7ce8f0928df4d3931c0c22c571f375849b9a6c2b71'
},
MonteTestCase{
name: 'checkpoint 94'
count: 94
digest: '8b78f95a007cfb0bd054a1f5d962cd8d927665f79a5ce9e0fc31105e57b8460b'
},
MonteTestCase{
name: 'checkpoint 95'
count: 95
digest: 'bf305423849cf773fc54206d8ae3c000c3e8b359cba8364581d1f91b0a201032'
},
MonteTestCase{
name: 'checkpoint 96'
count: 96
digest: '47006af96cff3843d3ed53bdedb167490d7bfefd93ae3e9ef473cb53aa840fc0'
},
MonteTestCase{
name: 'checkpoint 97'
count: 97
digest: 'c53cf5026162021fd2345dbad7c53d3a3df47b5bdff8cd34a0ccfee06dbb7328'
},
MonteTestCase{
name: 'checkpoint 98'
count: 98
digest: '3326899b575f93cdaff757f8ab7c3996a2fe930450d5002d4575f4e4cc4b4360'
},
MonteTestCase{
name: 'checkpoint 99'
count: 99
digest: '6a912ba4188391a78e6f13d88ed2d14e13afce9db6f7dcbf4a48c24f3db02778'
},
]
fn test_monte_messages() {
mut msg_seed := hex.decode(seed)!
for c in monte_cases {
mut md0 := msg_seed.clone()
mut md1 := msg_seed.clone()
mut md2 := msg_seed.clone()
mut md3 := msg_seed.clone()
mut mi := []u8{len: 0, cap: 128}
for _ in 0 .. 1000 {
mi.clear()
mi << md0
mi << md1
mi << md2
md3 = sha256.sum(mi)
md0 = md1.clone()
md1 = md2.clone()
md2 = md3.clone()
}
msg_seed = md3.clone()
expected_result := hex.decode(c.digest)!
assert md3 == expected_result, 'failed ${c.name}'
}
}
@@ -0,0 +1,376 @@
// These tests are derived from the Secure Hash Algorithm Validation System
// test vectors contained in:
// https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/shs/shabytetestvectors.zip
//
// For SHA256, the test vectors come from:
// SHA256ShortMsg.rsp
// SHA256LongMsg.rsp
import crypto.sha256
import encoding.hex
// This structure deals with both the short message and long message tests
struct SHA256TestCase {
name string
message string
digest string
}
// short message test cases
const short_cases = [
SHA256TestCase{
name: 'test case 0'
message: ''
digest: 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
},
SHA256TestCase{
name: 'test case 1'
message: 'd3'
digest: '28969cdfa74a12c82f3bad960b0b000aca2ac329deea5c2328ebc6f2ba9802c1'
},
SHA256TestCase{
name: 'test case 2'
message: '11af'
digest: '5ca7133fa735326081558ac312c620eeca9970d1e70a4b95533d956f072d1f98'
},
SHA256TestCase{
name: 'test case 3'
message: 'b4190e'
digest: 'dff2e73091f6c05e528896c4c831b9448653dc2ff043528f6769437bc7b975c2'
},
SHA256TestCase{
name: 'test case 4'
message: '74ba2521'
digest: 'b16aa56be3880d18cd41e68384cf1ec8c17680c45a02b1575dc1518923ae8b0e'
},
SHA256TestCase{
name: 'test case 5'
message: 'c299209682'
digest: 'f0887fe961c9cd3beab957e8222494abb969b1ce4c6557976df8b0f6d20e9166'
},
SHA256TestCase{
name: 'test case 6'
message: 'e1dc724d5621'
digest: 'eca0a060b489636225b4fa64d267dabbe44273067ac679f20820bddc6b6a90ac'
},
SHA256TestCase{
name: 'test case 7'
message: '06e076f5a442d5'
digest: '3fd877e27450e6bbd5d74bb82f9870c64c66e109418baa8e6bbcff355e287926'
},
SHA256TestCase{
name: 'test case 8'
message: '5738c929c4f4ccb6'
digest: '963bb88f27f512777aab6c8b1a02c70ec0ad651d428f870036e1917120fb48bf'
},
SHA256TestCase{
name: 'test case 9'
message: '3334c58075d3f4139e'
digest: '078da3d77ed43bd3037a433fd0341855023793f9afd08b4b08ea1e5597ceef20'
},
SHA256TestCase{
name: 'test case 10'
message: '74cb9381d89f5aa73368'
digest: '73d6fad1caaa75b43b21733561fd3958bdc555194a037c2addec19dc2d7a52bd'
},
SHA256TestCase{
name: 'test case 11'
message: '76ed24a0f40a41221ebfcf'
digest: '044cef802901932e46dc46b2545e6c99c0fc323a0ed99b081bda4216857f38ac'
},
SHA256TestCase{
name: 'test case 12'
message: '9baf69cba317f422fe26a9a0'
digest: 'fe56287cd657e4afc50dba7a3a54c2a6324b886becdcd1fae473b769e551a09b'
},
SHA256TestCase{
name: 'test case 13'
message: '68511cdb2dbbf3530d7fb61cbc'
digest: 'af53430466715e99a602fc9f5945719b04dd24267e6a98471f7a7869bd3b4313'
},
SHA256TestCase{
name: 'test case 14'
message: 'af397a8b8dd73ab702ce8e53aa9f'
digest: 'd189498a3463b18e846b8ab1b41583b0b7efc789dad8a7fb885bbf8fb5b45c5c'
},
SHA256TestCase{
name: 'test case 15'
message: '294af4802e5e925eb1c6cc9c724f09'
digest: 'dcbaf335360de853b9cddfdafb90fa75567d0d3d58af8db9d764113aef570125'
},
SHA256TestCase{
name: 'test case 16'
message: '0a27847cdc98bd6f62220b046edd762b'
digest: '80c25ec1600587e7f28b18b1b18e3cdc89928e39cab3bc25e4d4a4c139bcedc4'
},
SHA256TestCase{
name: 'test case 17'
message: '1b503fb9a73b16ada3fcf1042623ae7610'
digest: 'd5c30315f72ed05fe519a1bf75ab5fd0ffec5ac1acb0daf66b6b769598594509'
},
SHA256TestCase{
name: 'test case 18'
message: '59eb45bbbeb054b0b97334d53580ce03f699'
digest: '32c38c54189f2357e96bd77eb00c2b9c341ebebacc2945f97804f59a93238288'
},
SHA256TestCase{
name: 'test case 19'
message: '58e5a3259cb0b6d12c83f723379e35fd298b60'
digest: '9b5b37816de8fcdf3ec10b745428708df8f391c550ea6746b2cafe019c2b6ace'
},
SHA256TestCase{
name: 'test case 20'
message: 'c1ef39cee58e78f6fcdc12e058b7f902acd1a93b'
digest: '6dd52b0d8b48cc8146cebd0216fbf5f6ef7eeafc0ff2ff9d1422d6345555a142'
},
SHA256TestCase{
name: 'test case 21'
message: '9cab7d7dcaec98cb3ac6c64dd5d4470d0b103a810c'
digest: '44d34809fc60d1fcafa7f37b794d1d3a765dd0d23194ebbe340f013f0c39b613'
},
SHA256TestCase{
name: 'test case 22'
message: 'ea157c02ebaf1b22de221b53f2353936d2359d1e1c97'
digest: '9df5c16a3f580406f07d96149303d8c408869b32053b726cf3defd241e484957'
},
SHA256TestCase{
name: 'test case 23'
message: 'da999bc1f9c7acff32828a73e672d0a492f6ee895c6867'
digest: '672b54e43f41ee77584bdf8bf854d97b6252c918f7ea2d26bc4097ea53a88f10'
},
SHA256TestCase{
name: 'test case 24'
message: '47991301156d1d977c0338efbcad41004133aefbca6bcf7e'
digest: 'feeb4b2b59fec8fdb1e55194a493d8c871757b5723675e93d3ac034b380b7fc9'
},
SHA256TestCase{
name: 'test case 25'
message: '2e7ea84da4bc4d7cfb463e3f2c8647057afff3fbececa1d200'
digest: '76e3acbc718836f2df8ad2d0d2d76f0cfa5fea0986be918f10bcee730df441b9'
},
SHA256TestCase{
name: 'test case 26'
message: '47c770eb4549b6eff6381d62e9beb464cd98d341cc1c09981a7a'
digest: '6733809c73e53666c735b3bd3daf87ebc77c72756150a616a194108d71231272'
},
SHA256TestCase{
name: 'test case 27'
message: 'ac4c26d8b43b8579d8f61c9807026e83e9b586e1159bd43b851937'
digest: '0e6e3c143c3a5f7f38505ed6adc9b48c18edf6dedf11635f6e8f9ac73c39fe9e'
},
SHA256TestCase{
name: 'test case 28'
message: '0777fc1e1ca47304c2e265692838109e26aab9e5c4ae4e8600df4b1f'
digest: 'ffb4fc03e054f8ecbc31470fc023bedcd4a406b9dd56c71da1b660dcc4842c65'
},
SHA256TestCase{
name: 'test case 29'
message: '1a57251c431d4e6c2e06d65246a296915071a531425ecf255989422a66'
digest: 'c644612cd326b38b1c6813b1daded34448805aef317c35f548dfb4a0d74b8106'
},
SHA256TestCase{
name: 'test case 30'
message: '9b245fdad9baeb890d9c0d0eff816efb4ca138610bc7d78cb1a801ed3273'
digest: 'c0e29eeeb0d3a7707947e623cdc7d1899adc70dd7861205ea5e5813954fb7957'
},
SHA256TestCase{
name: 'test case 31'
message: '95a765809caf30ada90ad6d61c2b4b30250df0a7ce23b7753c9187f4319ce2'
digest: 'a4139b74b102cf1e2fce229a6cd84c87501f50afa4c80feacf7d8cf5ed94f042'
},
SHA256TestCase{
name: 'test case 32'
message: '09fc1accc230a205e4a208e64a8f204291f581a12756392da4b8c0cf5ef02b95'
digest: '4f44c1c7fbebb6f9601829f3897bfd650c56fa07844be76489076356ac1886a4'
},
SHA256TestCase{
name: 'test case 33'
message: '0546f7b8682b5b95fd32385faf25854cb3f7b40cc8fa229fbd52b16934aab388a7'
digest: 'b31ad3cd02b10db282b3576c059b746fb24ca6f09fef69402dc90ece7421cbb7'
},
SHA256TestCase{
name: 'test case 34'
message: 'b12db4a1025529b3b7b1e45c6dbc7baa8897a0576e66f64bf3f8236113a6276ee77d'
digest: '1c38bf6bbfd32292d67d1d651fd9d5b623b6ec1e854406223f51d0df46968712'
},
SHA256TestCase{
name: 'test case 35'
message: 'e68cb6d8c1866c0a71e7313f83dc11a5809cf5cfbeed1a587ce9c2c92e022abc1644bb'
digest: 'c2684c0dbb85c232b6da4fb5147dd0624429ec7e657991edd95eda37a587269e'
},
SHA256TestCase{
name: 'test case 36'
message: '4e3d8ac36d61d9e51480831155b253b37969fe7ef49db3b39926f3a00b69a36774366000'
digest: 'bf9d5e5b5393053f055b380baed7e792ae85ad37c0ada5fd4519542ccc461cf3'
},
SHA256TestCase{
name: 'test case 37'
message: '03b264be51e4b941864f9b70b4c958f5355aac294b4b87cb037f11f85f07eb57b3f0b89550'
digest: 'd1f8bd684001ac5a4b67bbf79f87de524d2da99ac014dec3e4187728f4557471'
},
SHA256TestCase{
name: 'test case 38'
message: 'd0fefd96787c65ffa7f910d6d0ada63d64d5c4679960e7f06aeb8c70dfef954f8e39efdb629b'
digest: '49ba38db85c2796f85ffd57dd5ec337007414528ae33935b102d16a6b91ba6c1'
},
SHA256TestCase{
name: 'test case 39'
message: 'b7c79d7e5f1eeccdfedf0e7bf43e730d447e607d8d1489823d09e11201a0b1258039e7bd4875b1'
digest: '725e6f8d888ebaf908b7692259ab8839c3248edd22ca115bb13e025808654700'
},
SHA256TestCase{
name: 'test case 40'
message: '64cd363ecce05fdfda2486d011a3db95b5206a19d3054046819dd0d36783955d7e5bf8ba18bf738a'
digest: '32caef024f84e97c30b4a7b9d04b678b3d8a6eb2259dff5b7f7c011f090845f8'
},
SHA256TestCase{
name: 'test case 41'
message: '6ac6c63d618eaf00d91c5e2807e83c093912b8e202f78e139703498a79c6067f54497c6127a23910a6'
digest: '4bb33e7c6916e08a9b3ed6bcef790aaaee0dcf2e7a01afb056182dea2dad7d63'
},
SHA256TestCase{
name: 'test case 42'
message: 'd26826db9baeaa892691b68900b96163208e806a1da077429e454fa011840951a031327e605ab82ecce2'
digest: '3ac7ac6bed82fdc8cd15b746f0ee7489158192c238f371c1883c9fe90b3e2831'
},
SHA256TestCase{
name: 'test case 43'
message: '3f7a059b65d6cb0249204aac10b9f1a4ac9e5868adebbe935a9eb5b9019e1c938bfc4e5c5378997a3947f2'
digest: 'bfce809534eefe871273964d32f091fe756c71a7f512ef5f2300bcd57f699e74'
},
SHA256TestCase{
name: 'test case 44'
message: '60ffcb23d6b88e485b920af81d1083f6291d06ac8ca3a965b85914bc2add40544a027fca936bbde8f359051c'
digest: '1d26f3e04f89b4eaa9dbed9231bb051eef2e8311ad26fe53d0bf0b821eaf7567'
},
SHA256TestCase{
name: 'test case 45'
message: '9ecd07b684bb9e0e6692e320cec4510ca79fcdb3a2212c26d90df65db33e692d073cc174840db797504e482eef'
digest: '0ffeb644a49e787ccc6970fe29705a4f4c2bfcfe7d19741c158333ff6982cc9c'
},
SHA256TestCase{
name: 'test case 46'
message: '9d64de7161895884e7fa3d6e9eb996e7ebe511b01fe19cd4a6b3322e80aaf52bf6447ed1854e71001f4d54f8931d'
digest: 'd048ee1524014adf9a56e60a388277de194c694cc787fc5a1b554ea9f07abfdf'
},
SHA256TestCase{
name: 'test case 47'
message: 'c4ad3c5e78d917ecb0cbbcd1c481fc2aaf232f7e289779f40e504cc309662ee96fecbd20647ef00e46199fbc482f46'
digest: '50dbf40066f8d270484ee2ef6632282dfa300a85a8530eceeb0e04275e1c1efd'
},
SHA256TestCase{
name: 'test case 48'
message: '4eef5107459bddf8f24fc7656fd4896da8711db50400c0164847f692b886ce8d7f4d67395090b3534efd7b0d298da34b'
digest: '7c5d14ed83dab875ac25ce7feed6ef837d58e79dc601fb3c1fca48d4464e8b83'
},
SHA256TestCase{
name: 'test case 49'
message: '047d2758e7c2c9623f9bdb93b6597c5e84a0cd34e610014bcb25b49ed05c7e356e98c7a672c3dddcaeb84317ef614d342f'
digest: '7d53eccd03da37bf58c1962a8f0f708a5c5c447f6a7e9e26137c169d5bdd82e4'
},
SHA256TestCase{
name: 'test case 50'
message: '3d83df37172c81afd0de115139fbf4390c22e098c5af4c5ab4852406510bc0e6cf741769f44430c5270fdae0cb849d71cbab'
digest: '99dc772e91ea02d9e421d552d61901016b9fd4ad2df4a8212c1ec5ba13893ab2'
},
SHA256TestCase{
name: 'test case 51'
message: '33fd9bc17e2b271fa04c6b93c0bdeae98654a7682d31d9b4dab7e6f32cd58f2f148a68fbe7a88c5ab1d88edccddeb30ab21e5e'
digest: 'cefdae1a3d75e792e8698d5e71f177cc761314e9ad5df9602c6e60ae65c4c267'
},
SHA256TestCase{
name: 'test case 52'
message: '77a879cfa11d7fcac7a8282cc38a43dcf37643cc909837213bd6fd95d956b219a1406cbe73c52cd56c600e55b75bc37ea69641bc'
digest: 'c99d64fa4dadd4bc8a389531c68b4590c6df0b9099c4d583bc00889fb7b98008'
},
SHA256TestCase{
name: 'test case 53'
message: '45a3e6b86527f20b4537f5af96cfc5ad8777a2dde6cf7511886c5590ece24fc61b226739d207dabfe32ba6efd9ff4cd5db1bd5ead3'
digest: '4d12a849047c6acd4b2eee6be35fa9051b02d21d50d419543008c1d82c427072'
},
SHA256TestCase{
name: 'test case 54'
message: '25362a4b9d74bde6128c4fdc672305900947bc3ada9d9d316ebcf1667ad4363189937251f149c72e064a48608d940b7574b17fefc0df'
digest: 'f8e4ccab6c979229f6066cc0cb0cfa81bb21447c16c68773be7e558e9f9d798d'
},
SHA256TestCase{
name: 'test case 55'
message: '3ebfb06db8c38d5ba037f1363e118550aad94606e26835a01af05078533cc25f2f39573c04b632f62f68c294ab31f2a3e2a1a0d8c2be51'
digest: '6595a2ef537a69ba8583dfbf7f5bec0ab1f93ce4c8ee1916eff44a93af5749c4'
},
SHA256TestCase{
name: 'test case 56'
message: '2d52447d1244d2ebc28650e7b05654bad35b3a68eedc7f8515306b496d75f3e73385dd1b002625024b81a02f2fd6dffb6e6d561cb7d0bd7a'
digest: 'cfb88d6faf2de3a69d36195acec2e255e2af2b7d933997f348e09f6ce5758360'
},
SHA256TestCase{
name: 'test case 57'
message: '4cace422e4a015a75492b3b3bbfbdf3758eaff4fe504b46a26c90dacc119fa9050f603d2b58b398cad6d6d9fa922a154d9e0bc4389968274b0'
digest: '4d54b2d284a6794581224e08f675541c8feab6eefa3ac1cfe5da4e03e62f72e4'
},
SHA256TestCase{
name: 'test case 58'
message: '8620b86fbcaace4ff3c2921b8466ddd7bacae07eefef693cf17762dcabb89a84010fc9a0fb76ce1c26593ad637a61253f224d1b14a05addccabe'
digest: 'dba490256c9720c54c612a5bd1ef573cd51dc12b3e7bd8c6db2eabe0aacb846b'
},
SHA256TestCase{
name: 'test case 59'
message: 'd1be3f13febafefc14414d9fb7f693db16dc1ae270c5b647d80da8583587c1ad8cb8cb01824324411ca5ace3ca22e179a4ff4986f3f21190f3d7f3'
digest: '02804978eba6e1de65afdbc6a6091ed6b1ecee51e8bff40646a251de6678b7ef'
},
SHA256TestCase{
name: 'test case 60'
message: 'f499cc3f6e3cf7c312ffdfba61b1260c37129c1afb391047193367b7b2edeb579253e51d62ba6d911e7b818ccae1553f6146ea780f78e2219f629309'
digest: '0b66c8b4fefebc8dc7da0bbedc1114f228aa63c37d5c30e91ab500f3eadfcec5'
},
SHA256TestCase{
name: 'test case 61'
message: '6dd6efd6f6caa63b729aa8186e308bc1bda06307c05a2c0ae5a3684e6e460811748690dc2b58775967cfcc645fd82064b1279fdca771803db9dca0ff53'
digest: 'c464a7bf6d180de4f744bb2fe5dc27a3f681334ffd54a9814650e60260a478e3'
},
SHA256TestCase{
name: 'test case 62'
message: '6511a2242ddb273178e19a82c57c85cb05a6887ff2014cf1a31cb9ba5df1695aadb25c22b3c5ed51c10d047d256b8e3442842ae4e6c525f8d7a5a944af2a'
digest: 'd6859c0b5a0b66376a24f56b2ab104286ed0078634ba19112ace0d6d60a9c1ae'
},
SHA256TestCase{
name: 'test case 63'
message: 'e2f76e97606a872e317439f1a03fcd92e632e5bd4e7cbc4e97f1afc19a16fde92d77cbe546416b51640cddb92af996534dfd81edb17c4424cf1ac4d75aceeb'
digest: '18041bd4665083001fba8c5411d2d748e8abbfdcdfd9218cb02b68a78e7d4c23'
},
SHA256TestCase{
name: 'test case 64'
message: '5a86b737eaea8ee976a0a24da63e7ed7eefad18a101c1211e2b3650c5187c2a8a650547208251f6d4237e661c7bf4c77f335390394c37fa1a9f9be836ac28509'
digest: '42e61e174fbb3897d6dd6cef3dd2802fe67b331953b06114a65c772859dfc1aa'
},
]
// long message test cases
const long_cases = [
SHA256TestCase{
name: 'test case 163'
message: '451101250ec6f26652249d59dc974b7361d571a8101cdfd36aba3b5854d3ae086b5fdd4597721b66e3c0dc5d8c606d9657d0e323283a5217d1f53f2f284f57b85c8a61ac8924711f895c5ed90ef17745ed2d728abd22a5f7a13479a462d71b56c19a74a40b655c58edfe0a188ad2cf46cbf30524f65d423c837dd1ff2bf462ac4198007345bb44dbb7b1c861298cdf61982a833afc728fae1eda2f87aa2c9480858bec'
digest: '3c593aa539fdcdae516cdf2f15000f6634185c88f505b39775fb9ab137a10aa2'
},
]
fn test_short_messages() {
for c in short_cases {
message := hex.decode(c.message)!
expected_result := hex.decode(c.digest)!
actual_result := sha256.sum(message)
assert actual_result == expected_result, 'failed ${c.name}'
}
}
fn test_long_messages() {
for c in long_cases {
message := hex.decode(c.message)!
expected_result := hex.decode(c.digest)!
actual_result := sha256.sum(message)
assert actual_result == expected_result, 'failed ${c.name}'
}
}
+59
View File
@@ -0,0 +1,59 @@
// Copyright (c) 2019-2024 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
import crypto.sha256
import hash
// verify sha256.Digest implements hash.Hash
fn test_digest_implements_hash() {
get_digest := fn () hash.Hash {
return sha256.new()
}
}
fn test_crypto_sha256() {
assert sha256.sum('This is a sha256 checksum.'.bytes()).hex() == 'dc7163299659529eae29683eb1ffec50d6c8fc7275ecb10c145fde0e125b8727'
}
fn test_crypto_sha256_writer() {
mut digest := sha256.new()
digest.write('This is a'.bytes()) or { assert false }
digest.write(' sha256 checksum.'.bytes()) or { assert false }
mut sum := digest.sum([])
assert sum.hex() == 'dc7163299659529eae29683eb1ffec50d6c8fc7275ecb10c145fde0e125b8727'
sum = digest.sum([])
assert sum.hex() == 'dc7163299659529eae29683eb1ffec50d6c8fc7275ecb10c145fde0e125b8727'
}
fn test_crypto_sha256_writer_reset() {
mut digest := sha256.new()
digest.write('This is a'.bytes()) or { assert false }
digest.write(' sha256 checksum.'.bytes()) or { assert false }
_ = digest.sum([])
digest.reset()
digest.write('This is a'.bytes()) or { assert false }
digest.write(' sha256 checksum.'.bytes()) or { assert false }
sum := digest.sum([])
assert sum.hex() == 'dc7163299659529eae29683eb1ffec50d6c8fc7275ecb10c145fde0e125b8727'
}
fn test_crypto_sha256_224() {
data := 'hello world\n'.bytes()
mut digest := sha256.new224()
expected := '95041dd60ab08c0bf5636d50be85fe9790300f39eb84602858a9b430'
// with sum224 function
sum224 := sha256.sum224(data)
assert sum224.hex() == expected
// with sum
_ := digest.write(data)!
sum := digest.sum([])
assert sum.hex() == expected
// with checksum
digest.reset()
_ := digest.write(data)!
chksum := digest.sum([])
assert chksum.hex() == expected
}
@@ -0,0 +1,154 @@
// Copyright (c) 2019-2024 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
// SHA256 block step.
// This is the generic version with no architecture optimizations.
// In its own file so that an architecture
// optimized version can be substituted
module sha256
import math.bits
const _k = [
0x428a2f98,
0x71374491,
0xb5c0fbcf,
0xe9b5dba5,
0x3956c25b,
0x59f111f1,
0x923f82a4,
0xab1c5ed5,
0xd807aa98,
0x12835b01,
0x243185be,
0x550c7dc3,
0x72be5d74,
0x80deb1fe,
0x9bdc06a7,
0xc19bf174,
0xe49b69c1,
0xefbe4786,
0x0fc19dc6,
0x240ca1cc,
0x2de92c6f,
0x4a7484aa,
0x5cb0a9dc,
0x76f988da,
0x983e5152,
0xa831c66d,
0xb00327c8,
0xbf597fc7,
0xc6e00bf3,
0xd5a79147,
0x06ca6351,
0x14292967,
0x27b70a85,
0x2e1b2138,
0x4d2c6dfc,
0x53380d13,
0x650a7354,
0x766a0abb,
0x81c2c92e,
0x92722c85,
0xa2bfe8a1,
0xa81a664b,
0xc24b8b70,
0xc76c51a3,
0xd192e819,
0xd6990624,
0xf40e3585,
0x106aa070,
0x19a4c116,
0x1e376c08,
0x2748774c,
0x34b0bcb5,
0x391c0cb3,
0x4ed8aa4a,
0x5b9cca4f,
0x682e6ff3,
0x748f82ee,
0x78a5636f,
0x84c87814,
0x8cc70208,
0x90befffa,
0xa4506ceb,
0xbef9a3f7,
0xc67178f2,
]
@[direct_array_access]
fn block_generic(mut dig Digest, p_ []u8) {
unsafe {
mut p := p_
// Keep the message schedule on the stack.
mut w := [64]u32{}
mut h0 := dig.h[0]
mut h1 := dig.h[1]
mut h2 := dig.h[2]
mut h3 := dig.h[3]
mut h4 := dig.h[4]
mut h5 := dig.h[5]
mut h6 := dig.h[6]
mut h7 := dig.h[7]
for p.len >= chunk {
// Can interlace the computation of w with the
// rounds below if needed for speed.
for i in 0 .. 16 {
j := i * 4
w[i] = u32(p[j]) << 24 | u32(p[j + 1]) << 16 | u32(p[j + 2]) << 8 | u32(p[j + 3])
}
for i := 16; i < 64; i++ {
v1 := w[i - 2]
t1 := (bits.rotate_left_32(v1, -17)) ^ (bits.rotate_left_32(v1, -19)) ^ (v1 >> 10)
v2 := w[i - 15]
t2 := (bits.rotate_left_32(v2, -7)) ^ (bits.rotate_left_32(v2, -18)) ^ (v2 >> 3)
w[i] = t1 + w[i - 7] + t2 + w[i - 16]
}
mut a := h0
mut b := h1
mut c := h2
mut d := h3
mut e := h4
mut f := h5
mut g := h6
mut h := h7
for i in 0 .. 64 {
t1 := h +
((bits.rotate_left_32(e, -6)) ^ (bits.rotate_left_32(e, -11)) ^ (bits.rotate_left_32(e, -25))) +
((e & f) ^ (~e & g)) + u32(_k[i]) + w[i]
t2 :=
((bits.rotate_left_32(a, -2)) ^ (bits.rotate_left_32(a, -13)) ^ (bits.rotate_left_32(a, -22))) +
((a & b) ^ (a & c) ^ (b & c))
h = g
g = f
f = e
e = d + t1
d = c
c = b
b = a
a = t1 + t2
}
h0 += a
h1 += b
h2 += c
h3 += d
h4 += e
h5 += f
h6 += g
h7 += h
if chunk >= p.len {
p = []
} else {
p = p[chunk..]
}
}
dig.h[0] = h0
dig.h[1] = h1
dig.h[2] = h2
dig.h[3] = h3
dig.h[4] = h4
dig.h[5] = h5
dig.h[6] = h6
dig.h[7] = h7
}
}