| 1 | // These tests are derived from the Secure Hash Algorithm Validation System |
| 2 | // test vectors contained in: |
| 3 | // https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/shs/shabytetestvectors.zip |
| 4 | // |
| 5 | // For SHA1, the test vectors come from: |
| 6 | // SHA1ShortMsg.rsp |
| 7 | // SHA1LongMsg.rsp |
| 8 | // SHA1Monte.rsp |
| 9 | import crypto.sha1 |
| 10 | import encoding.hex |
| 11 | |
| 12 | // This structure deals with both the short message and long message tests |
| 13 | struct SHA1TestCase { |
| 14 | name string |
| 15 | message string |
| 16 | digest string |
| 17 | } |
| 18 | |
| 19 | // short message test cases |
| 20 | const short_cases = [ |
| 21 | SHA1TestCase{ |
| 22 | name: 'test case 0' |
| 23 | message: '' |
| 24 | digest: 'da39a3ee5e6b4b0d3255bfef95601890afd80709' |
| 25 | }, |
| 26 | SHA1TestCase{ |
| 27 | name: 'test case 1' |
| 28 | message: '36' |
| 29 | digest: 'c1dfd96eea8cc2b62785275bca38ac261256e278' |
| 30 | }, |
| 31 | SHA1TestCase{ |
| 32 | name: 'test case 2' |
| 33 | message: '195a' |
| 34 | digest: '0a1c2d555bbe431ad6288af5a54f93e0449c9232' |
| 35 | }, |
| 36 | SHA1TestCase{ |
| 37 | name: 'test case 3' |
| 38 | message: 'df4bd2' |
| 39 | digest: 'bf36ed5d74727dfd5d7854ec6b1d49468d8ee8aa' |
| 40 | }, |
| 41 | SHA1TestCase{ |
| 42 | name: 'test case 4' |
| 43 | message: '549e959e' |
| 44 | digest: 'b78bae6d14338ffccfd5d5b5674a275f6ef9c717' |
| 45 | }, |
| 46 | SHA1TestCase{ |
| 47 | name: 'test case 5' |
| 48 | message: 'f7fb1be205' |
| 49 | digest: '60b7d5bb560a1acf6fa45721bd0abb419a841a89' |
| 50 | }, |
| 51 | SHA1TestCase{ |
| 52 | name: 'test case 6' |
| 53 | message: 'c0e5abeaea63' |
| 54 | digest: 'a6d338459780c08363090fd8fc7d28dc80e8e01f' |
| 55 | }, |
| 56 | SHA1TestCase{ |
| 57 | name: 'test case 7' |
| 58 | message: '63bfc1ed7f78ab' |
| 59 | digest: '860328d80509500c1783169ebf0ba0c4b94da5e5' |
| 60 | }, |
| 61 | SHA1TestCase{ |
| 62 | name: 'test case 8' |
| 63 | message: '7e3d7b3eada98866' |
| 64 | digest: '24a2c34b976305277ce58c2f42d5092031572520' |
| 65 | }, |
| 66 | SHA1TestCase{ |
| 67 | name: 'test case 9' |
| 68 | message: '9e61e55d9ed37b1c20' |
| 69 | digest: '411ccee1f6e3677df12698411eb09d3ff580af97' |
| 70 | }, |
| 71 | SHA1TestCase{ |
| 72 | name: 'test case 10' |
| 73 | message: '9777cf90dd7c7e863506' |
| 74 | digest: '05c915b5ed4e4c4afffc202961f3174371e90b5c' |
| 75 | }, |
| 76 | SHA1TestCase{ |
| 77 | name: 'test case 11' |
| 78 | message: '4eb08c9e683c94bea00dfa' |
| 79 | digest: 'af320b42d7785ca6c8dd220463be23a2d2cb5afc' |
| 80 | }, |
| 81 | SHA1TestCase{ |
| 82 | name: 'test case 12' |
| 83 | message: '0938f2e2ebb64f8af8bbfc91' |
| 84 | digest: '9f4e66b6ceea40dcf4b9166c28f1c88474141da9' |
| 85 | }, |
| 86 | SHA1TestCase{ |
| 87 | name: 'test case 13' |
| 88 | message: '74c9996d14e87d3e6cbea7029d' |
| 89 | digest: 'e6c4363c0852951991057f40de27ec0890466f01' |
| 90 | }, |
| 91 | SHA1TestCase{ |
| 92 | name: 'test case 14' |
| 93 | message: '51dca5c0f8e5d49596f32d3eb874' |
| 94 | digest: '046a7b396c01379a684a894558779b07d8c7da20' |
| 95 | }, |
| 96 | SHA1TestCase{ |
| 97 | name: 'test case 15' |
| 98 | message: '3a36ea49684820a2adc7fc4175ba78' |
| 99 | digest: 'd58a262ee7b6577c07228e71ae9b3e04c8abcda9' |
| 100 | }, |
| 101 | SHA1TestCase{ |
| 102 | name: 'test case 16' |
| 103 | message: '3552694cdf663fd94b224747ac406aaf' |
| 104 | digest: 'a150de927454202d94e656de4c7c0ca691de955d' |
| 105 | }, |
| 106 | SHA1TestCase{ |
| 107 | name: 'test case 17' |
| 108 | message: 'f216a1cbde2446b1edf41e93481d33e2ed' |
| 109 | digest: '35a4b39fef560e7ea61246676e1b7e13d587be30' |
| 110 | }, |
| 111 | SHA1TestCase{ |
| 112 | name: 'test case 18' |
| 113 | message: 'a3cf714bf112647e727e8cfd46499acd35a6' |
| 114 | digest: '7ce69b1acdce52ea7dbd382531fa1a83df13cae7' |
| 115 | }, |
| 116 | SHA1TestCase{ |
| 117 | name: 'test case 19' |
| 118 | message: '148de640f3c11591a6f8c5c48632c5fb79d3b7' |
| 119 | digest: 'b47be2c64124fa9a124a887af9551a74354ca411' |
| 120 | }, |
| 121 | SHA1TestCase{ |
| 122 | name: 'test case 20' |
| 123 | message: '63a3cc83fd1ec1b6680e9974a0514e1a9ecebb6a' |
| 124 | digest: '8bb8c0d815a9c68a1d2910f39d942603d807fbcc' |
| 125 | }, |
| 126 | SHA1TestCase{ |
| 127 | name: 'test case 21' |
| 128 | message: '875a90909a8afc92fb7070047e9d081ec92f3d08b8' |
| 129 | digest: 'b486f87fb833ebf0328393128646a6f6e660fcb1' |
| 130 | }, |
| 131 | SHA1TestCase{ |
| 132 | name: 'test case 22' |
| 133 | message: '444b25f9c9259dc217772cc4478c44b6feff62353673' |
| 134 | digest: '76159368f99dece30aadcfb9b7b41dab33688858' |
| 135 | }, |
| 136 | SHA1TestCase{ |
| 137 | name: 'test case 23' |
| 138 | message: '487351c8a5f440e4d03386483d5fe7bb669d41adcbfdb7' |
| 139 | digest: 'dbc1cb575ce6aeb9dc4ebf0f843ba8aeb1451e89' |
| 140 | }, |
| 141 | SHA1TestCase{ |
| 142 | name: 'test case 24' |
| 143 | message: '46b061ef132b87f6d3b0ee2462f67d910977da20aed13705' |
| 144 | digest: 'd7a98289679005eb930ab75efd8f650f991ee952' |
| 145 | }, |
| 146 | SHA1TestCase{ |
| 147 | name: 'test case 25' |
| 148 | message: '3842b6137bb9d27f3ca5bafe5bbb62858344fe4ba5c41589a5' |
| 149 | digest: 'fda26fa9b4874ab701ed0bb64d134f89b9c4cc50' |
| 150 | }, |
| 151 | SHA1TestCase{ |
| 152 | name: 'test case 26' |
| 153 | message: '44d91d3d465a4111462ba0c7ec223da6735f4f5200453cf132c3' |
| 154 | digest: 'c2ff7ccde143c8f0601f6974b1903eb8d5741b6e' |
| 155 | }, |
| 156 | SHA1TestCase{ |
| 157 | name: 'test case 27' |
| 158 | message: 'cce73f2eabcb52f785d5a6df63c0a105f34a91ca237fe534ee399d' |
| 159 | digest: '643c9dc20a929608f6caa9709d843ca6fa7a76f4' |
| 160 | }, |
| 161 | SHA1TestCase{ |
| 162 | name: 'test case 28' |
| 163 | message: '664e6e7946839203037a65a12174b244de8cbc6ec3f578967a84f9ce' |
| 164 | digest: '509ef787343d5b5a269229b961b96241864a3d74' |
| 165 | }, |
| 166 | SHA1TestCase{ |
| 167 | name: 'test case 29' |
| 168 | message: '9597f714b2e45e3399a7f02aec44921bd78be0fefee0c5e9b499488f6e' |
| 169 | digest: 'b61ce538f1a1e6c90432b233d7af5b6524ebfbe3' |
| 170 | }, |
| 171 | SHA1TestCase{ |
| 172 | name: 'test case 30' |
| 173 | message: '75c5ad1f3cbd22e8a95fc3b089526788fb4ebceed3e7d4443da6e081a35e' |
| 174 | digest: '5b7b94076b2fc20d6adb82479e6b28d07c902b75' |
| 175 | }, |
| 176 | SHA1TestCase{ |
| 177 | name: 'test case 31' |
| 178 | message: 'dd245bffe6a638806667768360a95d0574e1a0bd0d18329fdb915ca484ac0d' |
| 179 | digest: '6066db99fc358952cf7fb0ec4d89cb0158ed91d7' |
| 180 | }, |
| 181 | SHA1TestCase{ |
| 182 | name: 'test case 32' |
| 183 | message: '0321794b739418c24e7c2e565274791c4be749752ad234ed56cb0a6347430c6b' |
| 184 | digest: 'b89962c94d60f6a332fd60f6f07d4f032a586b76' |
| 185 | }, |
| 186 | SHA1TestCase{ |
| 187 | name: 'test case 33' |
| 188 | message: '4c3dcf95c2f0b5258c651fcd1d51bd10425d6203067d0748d37d1340d9ddda7db3' |
| 189 | digest: '17bda899c13d35413d2546212bcd8a93ceb0657b' |
| 190 | }, |
| 191 | SHA1TestCase{ |
| 192 | name: 'test case 34' |
| 193 | message: 'b8d12582d25b45290a6e1bb95da429befcfdbf5b4dd41cdf3311d6988fa17cec0723' |
| 194 | digest: 'badcdd53fdc144b8bf2cc1e64d10f676eebe66ed' |
| 195 | }, |
| 196 | SHA1TestCase{ |
| 197 | name: 'test case 35' |
| 198 | message: '6fda97527a662552be15efaeba32a3aea4ed449abb5c1ed8d9bfff544708a425d69b72' |
| 199 | digest: '01b4646180f1f6d2e06bbe22c20e50030322673a' |
| 200 | }, |
| 201 | SHA1TestCase{ |
| 202 | name: 'test case 36' |
| 203 | message: '09fa2792acbb2417e8ed269041cc03c77006466e6e7ae002cf3f1af551e8ce0bb506d705' |
| 204 | digest: '10016dc3a2719f9034ffcc689426d28292c42fc9' |
| 205 | }, |
| 206 | SHA1TestCase{ |
| 207 | name: 'test case 37' |
| 208 | message: '5efa2987da0baf0a54d8d728792bcfa707a15798dc66743754406914d1cfe3709b1374eaeb' |
| 209 | digest: '9f42fa2bce6ef021d93c6b2d902273797e426535' |
| 210 | }, |
| 211 | SHA1TestCase{ |
| 212 | name: 'test case 38' |
| 213 | message: '2836de99c0f641cd55e89f5af76638947b8227377ef88bfba662e5682babc1ec96c6992bc9a0' |
| 214 | digest: 'cdf48bacbff6f6152515323f9b43a286e0cb8113' |
| 215 | }, |
| 216 | SHA1TestCase{ |
| 217 | name: 'test case 39' |
| 218 | message: '42143a2b9e1d0b354df3264d08f7b602f54aad922a3d63006d097f683dc11b90178423bff2f7fe' |
| 219 | digest: 'b88fb75274b9b0fd57c0045988cfcef6c3ce6554' |
| 220 | }, |
| 221 | SHA1TestCase{ |
| 222 | name: 'test case 40' |
| 223 | message: 'eb60c28ad8aeda807d69ebc87552024ad8aca68204f1bcd29dc5a81dd228b591e2efb7c4df75ef03' |
| 224 | digest: 'c06d3a6a12d9e8db62e8cff40ca23820d61d8aa7' |
| 225 | }, |
| 226 | SHA1TestCase{ |
| 227 | name: 'test case 41' |
| 228 | message: '7de4ba85ec54747cdc42b1f23546b7e490e31280f066e52fac117fd3b0792e4de62d5843ee98c72015' |
| 229 | digest: '6e40f9e83a4be93874bc97cdebb8da6889ae2c7a' |
| 230 | }, |
| 231 | SHA1TestCase{ |
| 232 | name: 'test case 42' |
| 233 | message: 'e70653637bc5e388ccd8dc44e5eace36f7398f2bac993042b9bc2f4fb3b0ee7e23a96439dc01134b8c7d' |
| 234 | digest: '3efc940c312ef0dfd4e1143812248db89542f6a5' |
| 235 | }, |
| 236 | SHA1TestCase{ |
| 237 | name: 'test case 43' |
| 238 | message: 'dd37bc9f0b3a4788f9b54966f252174c8ce487cbe59c53c22b81bf77621a7ce7616dcb5b1e2ee63c2c309b' |
| 239 | digest: 'a0cf03f7badd0c3c3c4ea3717f5a4fb7e67b2e56' |
| 240 | }, |
| 241 | SHA1TestCase{ |
| 242 | name: 'test case 44' |
| 243 | message: '5f485c637ae30b1e30497f0fb7ec364e13c906e2813daa34161b7ac4a4fd7a1bddd79601bbd22cef1f57cbc7' |
| 244 | digest: 'a544e06f1a07ceb175a51d6d9c0111b3e15e9859' |
| 245 | }, |
| 246 | SHA1TestCase{ |
| 247 | name: 'test case 45' |
| 248 | message: 'f6c237fb3cfe95ec8414cc16d203b4874e644cc9a543465cad2dc563488a659e8a2e7c981e2a9f22e5e868ffe1' |
| 249 | digest: '199d986ed991b99a071f450c6b1121a727e8c735' |
| 250 | }, |
| 251 | SHA1TestCase{ |
| 252 | name: 'test case 46' |
| 253 | message: 'da7ab3291553c659873c95913768953c6e526d3a26590898c0ade89ff56fbd110f1436af590b17fed49f8c4b2b1e' |
| 254 | digest: '33bac6104b0ad6128d091b5d5e2999099c9f05de' |
| 255 | }, |
| 256 | SHA1TestCase{ |
| 257 | name: 'test case 47' |
| 258 | message: '8cfa5fd56ee239ca47737591cba103e41a18acf8e8d257b0dbe8851134a81ff6b2e97104b39b76e19da256a17ce52d' |
| 259 | digest: '76d7db6e18c1f4ae225ce8ccc93c8f9a0dfeb969' |
| 260 | }, |
| 261 | SHA1TestCase{ |
| 262 | name: 'test case 48' |
| 263 | message: '57e89659d878f360af6de45a9a5e372ef40c384988e82640a3d5e4b76d2ef181780b9a099ac06ef0f8a7f3f764209720' |
| 264 | digest: 'f652f3b1549f16710c7402895911e2b86a9b2aee' |
| 265 | }, |
| 266 | SHA1TestCase{ |
| 267 | name: 'test case 49' |
| 268 | message: 'b91e64235dbd234eea2ae14a92a173ebe835347239cff8b02074416f55c6b60dc6ced06ae9f8d705505f0d617e4b29aef9' |
| 269 | digest: '63faebb807f32be708cf00fc35519991dc4e7f68' |
| 270 | }, |
| 271 | SHA1TestCase{ |
| 272 | name: 'test case 50' |
| 273 | message: 'e42a67362a581e8cf3d847502215755d7ad425ca030c4360b0f7ef513e6980265f61c9fa18dd9ce668f38dbc2a1ef8f83cd6' |
| 274 | digest: '0e6730bc4a0e9322ea205f4edfff1fffda26af0a' |
| 275 | }, |
| 276 | SHA1TestCase{ |
| 277 | name: 'test case 51' |
| 278 | message: '634db92c22010e1cbf1e1623923180406c515272209a8acc42de05cc2e96a1e94c1f9f6b93234b7f4c55de8b1961a3bf352259' |
| 279 | digest: 'b61a3a6f42e8e6604b93196c43c9e84d5359e6fe' |
| 280 | }, |
| 281 | SHA1TestCase{ |
| 282 | name: 'test case 52' |
| 283 | message: 'cc6ca3a8cb391cd8a5aff1faa7b3ffbdd21a5a3ce66cfaddbfe8b179e4c860be5ec66bd2c6de6a39a25622f9f2fcb3fc05af12b5' |
| 284 | digest: '32d979ca1b3ed0ed8c890d99ec6dd85e6c16abf4' |
| 285 | }, |
| 286 | SHA1TestCase{ |
| 287 | name: 'test case 53' |
| 288 | message: '7c0e6a0d35f8ac854c7245ebc73693731bbbc3e6fab644466de27bb522fcb99307126ae718fe8f00742e6e5cb7a687c88447cbc961' |
| 289 | digest: '6f18190bd2d02fc93bce64756575cea36d08b1c3' |
| 290 | }, |
| 291 | SHA1TestCase{ |
| 292 | name: 'test case 54' |
| 293 | message: 'c5581d40b331e24003901bd6bf244aca9e9601b9d81252bb38048642731f1146b8a4c69f88e148b2c8f8c14f15e1d6da57b2daa9991e' |
| 294 | digest: '68f525feea1d8dbe0117e417ca46708d18d7629a' |
| 295 | }, |
| 296 | SHA1TestCase{ |
| 297 | name: 'test case 55' |
| 298 | message: 'ec6b4a88713df27c0f2d02e738b69db43abda3921317259c864c1c386e9a5a3f533dc05f3beeb2bec2aac8e06db4c6cb3cddcf697e03d5' |
| 299 | digest: 'a7272e2308622ff7a339460adc61efd0ea8dabdc' |
| 300 | }, |
| 301 | SHA1TestCase{ |
| 302 | name: 'test case 56' |
| 303 | message: '0321736beba578e90abc1a90aa56157d871618f6de0d764cc8c91e06c68ecd3b9de3824064503384db67beb7fe012232dacaef93a000fba7' |
| 304 | digest: 'aef843b86916c16f66c84d83a6005d23fd005c9e' |
| 305 | }, |
| 306 | SHA1TestCase{ |
| 307 | name: 'test case 57' |
| 308 | message: 'd0a249a97b5f1486721a50d4c4ab3f5d674a0e29925d5bf2678ef6d8d521e456bd84aa755328c83fc890837726a8e7877b570dba39579aabdd' |
| 309 | digest: 'be2cd6f380969be59cde2dff5e848a44e7880bd6' |
| 310 | }, |
| 311 | SHA1TestCase{ |
| 312 | name: 'test case 58' |
| 313 | message: 'c32138531118f08c7dcc292428ad20b45ab27d9517a18445f38b8f0c2795bcdfe3ffe384e65ecbf74d2c9d0da88398575326074904c1709ba072' |
| 314 | digest: 'e5eb4543deee8f6a5287845af8b593a95a9749a1' |
| 315 | }, |
| 316 | SHA1TestCase{ |
| 317 | name: 'test case 59' |
| 318 | message: 'b0f4cfb939ea785eabb7e7ca7c476cdd9b227f015d905368ba00ae96b9aaf720297491b3921267576b72c8f58d577617e844f9f0759b399c6b064c' |
| 319 | digest: '534c850448dd486787b62bdec2d4a0b140a1b170' |
| 320 | }, |
| 321 | SHA1TestCase{ |
| 322 | name: 'test case 60' |
| 323 | message: 'bd02e51b0cf2c2b8d204a026b41a66fbfc2ac37ee9411fc449c8d1194a0792a28ee731407dfc89b6dfc2b10faa27723a184afef8fd83def858a32d3f' |
| 324 | digest: '6fbfa6e4edce4cc85a845bf0d228dc39acefc2fa' |
| 325 | }, |
| 326 | SHA1TestCase{ |
| 327 | name: 'test case 61' |
| 328 | message: 'e33146b83e4bb671392218da9a77f8d9f5974147182fb95ba662cb66011989c16d9af104735d6f79841aa4d1df276615b50108df8a29dbc9de31f4260d' |
| 329 | digest: '018872691d9b04e8220e09187df5bc5fa6257cd9' |
| 330 | }, |
| 331 | SHA1TestCase{ |
| 332 | name: 'test case 62' |
| 333 | message: '411c13c75073c1e2d4b1ecf13139ba9656cd35c14201f1c7c6f0eeb58d2dbfe35bfdeccc92c3961cfabb590bc1eb77eac15732fb0275798680e0c7292e50' |
| 334 | digest: 'd98d512a35572f8bd20de62e9510cc21145c5bf4' |
| 335 | }, |
| 336 | SHA1TestCase{ |
| 337 | name: 'test case 63' |
| 338 | message: 'f2c76ef617fa2bfc8a4d6bcbb15fe88436fdc2165d3074629579079d4d5b86f5081ab177b4c3f530376c9c924cbd421a8daf8830d0940c4fb7589865830699' |
| 339 | digest: '9f3ea255f6af95c5454e55d7354cabb45352ea0b' |
| 340 | }, |
| 341 | SHA1TestCase{ |
| 342 | name: 'test case 64' |
| 343 | message: '45927e32ddf801caf35e18e7b5078b7f5435278212ec6bb99df884f49b327c6486feae46ba187dc1cc9145121e1492e6b06e9007394dc33b7748f86ac3207cfe' |
| 344 | digest: 'a70cfbfe7563dd0e665c7c6715a96a8d756950c0' |
| 345 | }, |
| 346 | ] |
| 347 | |
| 348 | // long message test cases |
| 349 | const long_cases = [ |
| 350 | SHA1TestCase{ |
| 351 | name: 'test case 163' |
| 352 | message: '7c9c67323a1df1adbfe5ceb415eaef0155ece2820f4d50c1ec22cba4928ac656c83fe585db6a78ce40bc42757aba7e5a3f582428d6ca68d0c3978336a6efb729613e8d9979016204bfd921322fdd5222183554447de5e6e9bbe6edf76d7b71e18dc2e8d6dc89b7398364f652fafc734329aafa3dcd45d4f31e388e4fafd7fc6495f37ca5cbab7f54d586463da4bfeaa3bae09f7b8e9239d832b4f0a733aa609cc1f8d4' |
| 353 | digest: 'd8fd6a91ef3b6ced05b98358a99107c1fac8c807' |
| 354 | }, |
| 355 | SHA1TestCase{ |
| 356 | name: 'test case 262' |
| 357 | message: '6cb70d19c096200f9249d2dbc04299b0085eb068257560be3a307dbd741a3378ebfa03fcca610883b07f7fea563a866571822472dade8a0bec4b98202d47a344312976a7bcb3964427eacb5b0525db22066599b81be41e5adaf157d925fac04b06eb6e01deb753babf33be16162b214e8db017212fafa512cdc8c0d0a15c10f632e8f4f47792c64d3f026004d173df50cf0aa7976066a79a8d78deeeec951dab7cc90f68d16f786671feba0b7d269d92941c4f02f432aa5ce2aab6194dcc6fd3ae36c8433274ef6b1bd0d314636be47ba38d1948343a38bf9406523a0b2a8cd78ed6266ee3c9b5c60620b308cc6b3a73c6060d5268a7d82b6a33b93a6fd6fe1de55231d12c97' |
| 358 | digest: '4a75a406f4de5f9e1132069d66717fc424376388' |
| 359 | }, |
| 360 | ] |
| 361 | |
| 362 | fn test_short_messages() { |
| 363 | for c in short_cases { |
| 364 | message := hex.decode(c.message)! |
| 365 | expected_result := hex.decode(c.digest)! |
| 366 | |
| 367 | actual_result := sha1.sum(message) |
| 368 | |
| 369 | assert actual_result == expected_result, 'failed ${c.name}' |
| 370 | } |
| 371 | } |
| 372 | |
| 373 | fn test_long_messages() { |
| 374 | for c in long_cases { |
| 375 | message := hex.decode(c.message)! |
| 376 | expected_result := hex.decode(c.digest)! |
| 377 | |
| 378 | actual_result := sha1.sum(message) |
| 379 | |
| 380 | assert actual_result == expected_result, 'failed ${c.name}' |
| 381 | } |
| 382 | } |
| 383 | |