Initial project import
This commit is contained in:
commit
23f2d29e32
11957 files changed
+1754577
No files matched your search
@@ -0,0 +1,177 @@
|
||||
// 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 sha1 implements the SHA-1 hash algorithm as defined in RFC 3174.
|
||||
// SHA-1 is cryptographically broken and should not be used for secure
|
||||
// applications.
|
||||
// Based off: https://github.com/golang/go/blob/master/src/crypto/sha1
|
||||
// Last commit: https://github.com/golang/go/commit/3ce865d7a0b88714cc433454ae2370a105210c01
|
||||
module sha1
|
||||
|
||||
import encoding.binary
|
||||
|
||||
// The size of a SHA-1 checksum in bytes.
|
||||
pub const size = 20
|
||||
// The blocksize of SHA-1 in bytes.
|
||||
pub const block_size = 64
|
||||
|
||||
const chunk = 64
|
||||
const init0 = u32(0x67452301)
|
||||
const init1 = u32(0xEFCDAB89)
|
||||
const init2 = u32(0x98BADCFE)
|
||||
const init3 = u32(0x10325476)
|
||||
const init4 = u32(0xC3D2E1F0)
|
||||
|
||||
// digest represents the partial evaluation of a checksum.
|
||||
struct Digest {
|
||||
mut:
|
||||
h []u32
|
||||
x []u8
|
||||
nx int
|
||||
len u64
|
||||
}
|
||||
|
||||
// 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.x = []u8{len: chunk}
|
||||
d.h = []u32{len: (5)}
|
||||
d.reset()
|
||||
}
|
||||
|
||||
// reset the state of the Digest `d`
|
||||
pub fn (mut d Digest) reset() {
|
||||
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.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 SHA1 checksum.
|
||||
pub fn new() &Digest {
|
||||
mut d := &Digest{}
|
||||
d.init()
|
||||
return d
|
||||
}
|
||||
|
||||
// write writes the contents of `p_` to the internal hash representation.
|
||||
@[manualfree]
|
||||
pub fn (mut d Digest) write(p_ []u8) !int {
|
||||
nn := p_.len
|
||||
unsafe {
|
||||
mut p := p_
|
||||
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 a copy of the generated sum of the bytes in `b_in`.
|
||||
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()
|
||||
for b in hash {
|
||||
b_out << b
|
||||
}
|
||||
return b_out
|
||||
}
|
||||
|
||||
// checksum returns the current byte checksum of the `Digest`,
|
||||
@[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 <<= 3
|
||||
binary.big_endian_put_u64(mut tmp, len)
|
||||
d.write(tmp[..8]) or { panic(err) }
|
||||
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])
|
||||
return digest
|
||||
}
|
||||
|
||||
// sum returns the SHA-1 checksum of the bytes passed in `data`.
|
||||
pub fn sum(data []u8) []u8 {
|
||||
mut d := new()
|
||||
d.write(data) or { panic(err) }
|
||||
return d.checksum()
|
||||
}
|
||||
|
||||
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 {
|
||||
return size
|
||||
}
|
||||
|
||||
// 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 SHA1 hash sum `string` of `s`.
|
||||
pub fn hexhash(s string) string {
|
||||
return sum(s.bytes()).hex()
|
||||
}
|
||||
@@ -0,0 +1,545 @@
|
||||
import crypto.sha1
|
||||
import encoding.hex
|
||||
|
||||
const seed = 'dd4df644eaf3d85bace2b21accaa22b28821f5cd'
|
||||
|
||||
struct MonteTestCase {
|
||||
name string
|
||||
count int
|
||||
digest string
|
||||
}
|
||||
|
||||
const monte_cases = [
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 0'
|
||||
count: 0
|
||||
digest: '11f5c38b4479d4ad55cb69fadf62de0b036d5163'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 1'
|
||||
count: 1
|
||||
digest: '5c26de848c21586bec36995809cb02d3677423d9'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 2'
|
||||
count: 2
|
||||
digest: '453b5fcf263d01c891d7897d4013990f7c1fb0ab'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 3'
|
||||
count: 3
|
||||
digest: '36d0273ae363f992bbc313aa4ff602e95c207be3'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 4'
|
||||
count: 4
|
||||
digest: 'd1c65e9ac55727fbf30eaf5f00cc22b9bab81a2c'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 5'
|
||||
count: 5
|
||||
digest: '2c477cd77e5749da7fc4e5ca7eed77166e8ceae6'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 6'
|
||||
count: 6
|
||||
digest: '60b11211137f46863501a32a435976eabd4532f3'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 7'
|
||||
count: 7
|
||||
digest: '0894f4f012a1e5344044e0ecfa6f078382064602'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 8'
|
||||
count: 8
|
||||
digest: '06b6222855cae9bed77e9e3050d164a98286ea5f'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 9'
|
||||
count: 9
|
||||
digest: 'e2872694d3d23a68a24419c35bd9ac9006248a8f'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 10'
|
||||
count: 10
|
||||
digest: 'ea43595eb1cff3a7e045c5868d0775b4409b14a3'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 11'
|
||||
count: 11
|
||||
digest: '05a9e94fdc792a61aa60bcd37592acee1f983280'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 12'
|
||||
count: 12
|
||||
digest: '7d11aa9413cd89a387a5c0f9aa5ce541be2aa6e8'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 13'
|
||||
count: 13
|
||||
digest: '37297d053aaa4a845cc9ce0c0165644ab8d0e00b'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 14'
|
||||
count: 14
|
||||
digest: 'd9dcde396d69748c1fe357f8b662a27ce89082c8'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 15'
|
||||
count: 15
|
||||
digest: '737a484499b6858b14e656c328979e8aa56b0a43'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 16'
|
||||
count: 16
|
||||
digest: '4e9c8b3bce910432ac2ad17d51e6b9ec4f92c1ad'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 17'
|
||||
count: 17
|
||||
digest: '62325b9a7cebcc6da3bfe781d84eb53a6eb7b019'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 18'
|
||||
count: 18
|
||||
digest: '4710670e071609d470f7d628d8ea978dfb9234ac'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 19'
|
||||
count: 19
|
||||
digest: '23baee80eee052f3263ac26dd12ea6504a5bd234'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 20'
|
||||
count: 20
|
||||
digest: '9451efb9c9586a403747acfa3ec74d359bb9d7ff'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 21'
|
||||
count: 21
|
||||
digest: '37e9d7c81b79f090c8e05848050936c64a1bd662'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 22'
|
||||
count: 22
|
||||
digest: 'a6489ff37141f7a86dd978f685fdd4789d1993dc'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 23'
|
||||
count: 23
|
||||
digest: '39650d32501dfcee212d0de10af9db47e4e5af65'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 24'
|
||||
count: 24
|
||||
digest: 'cd4ea3474e046b281da5a4bf69fd873ef8d568d6'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 25'
|
||||
count: 25
|
||||
digest: '0d7b518c07c6da877eee35301a99c7563f1840df'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 26'
|
||||
count: 26
|
||||
digest: '68a70ae466532f7f61af138889c0d3f9670f3590'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 27'
|
||||
count: 27
|
||||
digest: 'c0222aae5fd2b9eff143ac93c4493abe5c8806af'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 28'
|
||||
count: 28
|
||||
digest: 'd2efc5aa0b29db15f3e5de82aaa0a8ce888ffb2f'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 29'
|
||||
count: 29
|
||||
digest: 'eec4f55d02c627dcee36b5b5606603bdc9a94a26'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 30'
|
||||
count: 30
|
||||
digest: '0e706fb1a1fa26aab74efcef57ab6a49c07ca7bd'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 31'
|
||||
count: 31
|
||||
digest: '2ea392ca8043686424f7e9500edfb9e9297943f7'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 32'
|
||||
count: 32
|
||||
digest: '74737ef257b32a4cb9428c866b65bee62ccbe653'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 33'
|
||||
count: 33
|
||||
digest: 'df3e86e49a0429fa81f553b04b9fc003510e9a51'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 34'
|
||||
count: 34
|
||||
digest: '79c3049944fbf8b80dadadc7f5174e5cfdf996de'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 35'
|
||||
count: 35
|
||||
digest: 'f25e2eca4cfb6da8e8b7b62f581672fab80754fa'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 36'
|
||||
count: 36
|
||||
digest: '76509239d9fd6c6f050c0d9b3777b5645e4d4c70'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 37'
|
||||
count: 37
|
||||
digest: 'cf4bb3e1f330c862e239d9b010bd842f302bd227'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 38'
|
||||
count: 38
|
||||
digest: '4eeac7ab2ac9e4c81ed1a93a300b2af75beddb08'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 39'
|
||||
count: 39
|
||||
digest: '46443ba72a64fff4b5252fbac9ef93c2949f8585'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 40'
|
||||
count: 40
|
||||
digest: '5e9c42482343a54aadb11ab00c2e00cbe25ec91a'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 41'
|
||||
count: 41
|
||||
digest: '93acee1977128f2a4218678b32e2844f23eb526b'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 42'
|
||||
count: 42
|
||||
digest: '226065d299b2d6c582d386897b93f2adf14de00b'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 43'
|
||||
count: 43
|
||||
digest: '672fed0d90c21d4ec0111a7284bcf1bbd72af9bd'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 44'
|
||||
count: 44
|
||||
digest: '90d642f12f28cb3dad7daad84cf0f94ded1137ae'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 45'
|
||||
count: 45
|
||||
digest: '4a2815b58ffc858e5e7e9e6106765458d2af4ec3'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 46'
|
||||
count: 46
|
||||
digest: '29fa3679032421b78b7a08c54766c1592f6739c1'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 47'
|
||||
count: 47
|
||||
digest: '19f4e30393eb66c6e200744fa8999d224e6df173'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 48'
|
||||
count: 48
|
||||
digest: '30650026be77212088ab50438e04b4b8e3761977'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 49'
|
||||
count: 49
|
||||
digest: '993d0e135bcd598fa673c6f19251bcbde18b7b34'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 50'
|
||||
count: 50
|
||||
digest: 'c9eaf20b473219a70efe85940620426c6ff6f4a4'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 51'
|
||||
count: 51
|
||||
digest: '6325d0b83c308bd42854ce69446e85ba36348d7d'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 52'
|
||||
count: 52
|
||||
digest: '2fb354f8a68030efb747f78812060a9c05e92164'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 53'
|
||||
count: 53
|
||||
digest: 'a7e33bd16f770c17e8818ad5a5fc4fee673eae56'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 54'
|
||||
count: 54
|
||||
digest: 'ff23e7105bc9f4dad0fb9c6519d1eae16439a5d6'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 55'
|
||||
count: 55
|
||||
digest: 'a31aca821e163213cd2ae84cf56c1134daa4a621'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 56'
|
||||
count: 56
|
||||
digest: '94ab9cfd4cf9bf2e4409dbcdc9ef2c8b611cc69d'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 57'
|
||||
count: 57
|
||||
digest: 'c0194064ce48dde771b7871efa86a4a6e87eec76'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 58'
|
||||
count: 58
|
||||
digest: 'f1a9065e3e7f98753c6f833f5ffe74133f6b887f'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 59'
|
||||
count: 59
|
||||
digest: 'b8b3cd6ca1d5b5610e43212f8df75211aaddcf96'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 60'
|
||||
count: 60
|
||||
digest: '33c3a8d739cc2f83be597aa11c43e2ad6f0d2436'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 61'
|
||||
count: 61
|
||||
digest: '4f5c67e5110f3663b7aa88759dbba6fa82f2d705'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 62'
|
||||
count: 62
|
||||
digest: 'b1ebc87c7b2b8fe73e7a882d3f4f0492946e0d7c'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 63'
|
||||
count: 63
|
||||
digest: '01566616fe4a8c7cf22f21031ac6ea7fb7ce15db'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 64'
|
||||
count: 64
|
||||
digest: '5650f3517a393792781d23b4c9d360bf8bd31d65'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 65'
|
||||
count: 65
|
||||
digest: 'a4fdbd24cb4a328b898b804b103caa98baedd3fa'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 66'
|
||||
count: 66
|
||||
digest: '0cf01eecec4b85aa39f40aa9b4dce208d68eb17b'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 67'
|
||||
count: 67
|
||||
digest: 'ae9ac147bab7c10609abe6e931a5ab087a41dc5a'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 68'
|
||||
count: 68
|
||||
digest: 'c0328145ce63fb0aceeb414e791d2be92009b1ec'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 69'
|
||||
count: 69
|
||||
digest: '60343e5fb7eee00d31ea507b820ddbb7ef405dc7'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 70'
|
||||
count: 70
|
||||
digest: 'e0b97cd9149ff9955b6a35b3a79ecb3bdbd2a5a5'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 71'
|
||||
count: 71
|
||||
digest: '4e4fdcd382ae0f3f4fbda5fd934eee0d6ad37df5'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 72'
|
||||
count: 72
|
||||
digest: '9d97dd237d193482cf3ab862a38843762e69077f'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 73'
|
||||
count: 73
|
||||
digest: '2bc927d17ff2f8a844f6f36a944a64d73d431192'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 74'
|
||||
count: 74
|
||||
digest: 'b91200306b769aab18e5e411b5bd5e7bce1cc80e'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 75'
|
||||
count: 75
|
||||
digest: 'c47493a666085e1b7a75618761a80c402f46546d'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 76'
|
||||
count: 76
|
||||
digest: '31355869b80ff84fac239db694ada07d3be26b15'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 77'
|
||||
count: 77
|
||||
digest: '1a2022f6330bf96f025cb7d8f0201a7d70b3b58e'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 78'
|
||||
count: 78
|
||||
digest: '0f60d7c5ad49efce939c3a27da9973f7f1747848'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 79'
|
||||
count: 79
|
||||
digest: 'ceada087801616fc6c08cfa469658f3dc5239ca7'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 80'
|
||||
count: 80
|
||||
digest: '4ad0cf9181122b06df714397bd5366aa90bfc9fa'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 81'
|
||||
count: 81
|
||||
digest: 'ac6404e6b9d5c0fa17fa77fd39850f22b76ecd83'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 82'
|
||||
count: 82
|
||||
digest: 'f0658218adffb9ee9328577854b6387393957a3a'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 83'
|
||||
count: 83
|
||||
digest: '6fe9992747897389957b9a91467a4ec983829ab6'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 84'
|
||||
count: 84
|
||||
digest: '74320b3ddde6dbfbdad3ad29a7695f5a275b2105'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 85'
|
||||
count: 85
|
||||
digest: '2009ea5d6452f51d12477740e374e0e313134779'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 86'
|
||||
count: 86
|
||||
digest: '7dbf33d7125709f101fea4ec03436ab95a900c28'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 87'
|
||||
count: 87
|
||||
digest: '0c05b78e324cb265bd6adc7452249eaa85bccb3f'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 88'
|
||||
count: 88
|
||||
digest: '10c1b9b2de8a9050fb6f4b10a99f7e1e47159f25'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 89'
|
||||
count: 89
|
||||
digest: '20072c1f691142d9b83a090dd01f446b4e325a1c'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 90'
|
||||
count: 90
|
||||
digest: 'ffcb6a1525f20803cfc79deb40addfd3e7b2f05c'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 91'
|
||||
count: 91
|
||||
digest: 'bdcbb4ed636e244bb0fe6af4bc53998936df4ebc'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 92'
|
||||
count: 92
|
||||
digest: 'f58ccbc65a2ffa5b35274dd0ceb4ea70eb73c26a'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 93'
|
||||
count: 93
|
||||
digest: 'fbe95ac75e4b9cccd1a5debf757fa1a502d07944'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 94'
|
||||
count: 94
|
||||
digest: 'a8babac55950dba4993601d35adff874a2b9bb2a'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 95'
|
||||
count: 95
|
||||
digest: '594db79de71c7651e9eef2f08bb7be3d26b6ee99'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 96'
|
||||
count: 96
|
||||
digest: '63377d45d0e2d0c987bebe8086c76a5e8b63a14b'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 97'
|
||||
count: 97
|
||||
digest: 'cd1e7a192130866aa87fd1c8b43e9b7a0eab7615'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 98'
|
||||
count: 98
|
||||
digest: 'b3c69ad5dbdd34b7b45b2a89dad72f4cf1d8fd73'
|
||||
},
|
||||
MonteTestCase{
|
||||
name: 'checkpoint 99'
|
||||
count: 99
|
||||
digest: '01b7be5b70ef64843a03fdbb3b247a6278d2cbe1'
|
||||
},
|
||||
]
|
||||
|
||||
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 = sha1.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,382 @@
|
||||
// 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 SHA1, the test vectors come from:
|
||||
// SHA1ShortMsg.rsp
|
||||
// SHA1LongMsg.rsp
|
||||
// SHA1Monte.rsp
|
||||
import crypto.sha1
|
||||
import encoding.hex
|
||||
|
||||
// This structure deals with both the short message and long message tests
|
||||
struct SHA1TestCase {
|
||||
name string
|
||||
message string
|
||||
digest string
|
||||
}
|
||||
|
||||
// short message test cases
|
||||
const short_cases = [
|
||||
SHA1TestCase{
|
||||
name: 'test case 0'
|
||||
message: ''
|
||||
digest: 'da39a3ee5e6b4b0d3255bfef95601890afd80709'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 1'
|
||||
message: '36'
|
||||
digest: 'c1dfd96eea8cc2b62785275bca38ac261256e278'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 2'
|
||||
message: '195a'
|
||||
digest: '0a1c2d555bbe431ad6288af5a54f93e0449c9232'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 3'
|
||||
message: 'df4bd2'
|
||||
digest: 'bf36ed5d74727dfd5d7854ec6b1d49468d8ee8aa'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 4'
|
||||
message: '549e959e'
|
||||
digest: 'b78bae6d14338ffccfd5d5b5674a275f6ef9c717'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 5'
|
||||
message: 'f7fb1be205'
|
||||
digest: '60b7d5bb560a1acf6fa45721bd0abb419a841a89'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 6'
|
||||
message: 'c0e5abeaea63'
|
||||
digest: 'a6d338459780c08363090fd8fc7d28dc80e8e01f'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 7'
|
||||
message: '63bfc1ed7f78ab'
|
||||
digest: '860328d80509500c1783169ebf0ba0c4b94da5e5'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 8'
|
||||
message: '7e3d7b3eada98866'
|
||||
digest: '24a2c34b976305277ce58c2f42d5092031572520'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 9'
|
||||
message: '9e61e55d9ed37b1c20'
|
||||
digest: '411ccee1f6e3677df12698411eb09d3ff580af97'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 10'
|
||||
message: '9777cf90dd7c7e863506'
|
||||
digest: '05c915b5ed4e4c4afffc202961f3174371e90b5c'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 11'
|
||||
message: '4eb08c9e683c94bea00dfa'
|
||||
digest: 'af320b42d7785ca6c8dd220463be23a2d2cb5afc'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 12'
|
||||
message: '0938f2e2ebb64f8af8bbfc91'
|
||||
digest: '9f4e66b6ceea40dcf4b9166c28f1c88474141da9'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 13'
|
||||
message: '74c9996d14e87d3e6cbea7029d'
|
||||
digest: 'e6c4363c0852951991057f40de27ec0890466f01'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 14'
|
||||
message: '51dca5c0f8e5d49596f32d3eb874'
|
||||
digest: '046a7b396c01379a684a894558779b07d8c7da20'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 15'
|
||||
message: '3a36ea49684820a2adc7fc4175ba78'
|
||||
digest: 'd58a262ee7b6577c07228e71ae9b3e04c8abcda9'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 16'
|
||||
message: '3552694cdf663fd94b224747ac406aaf'
|
||||
digest: 'a150de927454202d94e656de4c7c0ca691de955d'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 17'
|
||||
message: 'f216a1cbde2446b1edf41e93481d33e2ed'
|
||||
digest: '35a4b39fef560e7ea61246676e1b7e13d587be30'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 18'
|
||||
message: 'a3cf714bf112647e727e8cfd46499acd35a6'
|
||||
digest: '7ce69b1acdce52ea7dbd382531fa1a83df13cae7'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 19'
|
||||
message: '148de640f3c11591a6f8c5c48632c5fb79d3b7'
|
||||
digest: 'b47be2c64124fa9a124a887af9551a74354ca411'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 20'
|
||||
message: '63a3cc83fd1ec1b6680e9974a0514e1a9ecebb6a'
|
||||
digest: '8bb8c0d815a9c68a1d2910f39d942603d807fbcc'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 21'
|
||||
message: '875a90909a8afc92fb7070047e9d081ec92f3d08b8'
|
||||
digest: 'b486f87fb833ebf0328393128646a6f6e660fcb1'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 22'
|
||||
message: '444b25f9c9259dc217772cc4478c44b6feff62353673'
|
||||
digest: '76159368f99dece30aadcfb9b7b41dab33688858'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 23'
|
||||
message: '487351c8a5f440e4d03386483d5fe7bb669d41adcbfdb7'
|
||||
digest: 'dbc1cb575ce6aeb9dc4ebf0f843ba8aeb1451e89'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 24'
|
||||
message: '46b061ef132b87f6d3b0ee2462f67d910977da20aed13705'
|
||||
digest: 'd7a98289679005eb930ab75efd8f650f991ee952'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 25'
|
||||
message: '3842b6137bb9d27f3ca5bafe5bbb62858344fe4ba5c41589a5'
|
||||
digest: 'fda26fa9b4874ab701ed0bb64d134f89b9c4cc50'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 26'
|
||||
message: '44d91d3d465a4111462ba0c7ec223da6735f4f5200453cf132c3'
|
||||
digest: 'c2ff7ccde143c8f0601f6974b1903eb8d5741b6e'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 27'
|
||||
message: 'cce73f2eabcb52f785d5a6df63c0a105f34a91ca237fe534ee399d'
|
||||
digest: '643c9dc20a929608f6caa9709d843ca6fa7a76f4'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 28'
|
||||
message: '664e6e7946839203037a65a12174b244de8cbc6ec3f578967a84f9ce'
|
||||
digest: '509ef787343d5b5a269229b961b96241864a3d74'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 29'
|
||||
message: '9597f714b2e45e3399a7f02aec44921bd78be0fefee0c5e9b499488f6e'
|
||||
digest: 'b61ce538f1a1e6c90432b233d7af5b6524ebfbe3'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 30'
|
||||
message: '75c5ad1f3cbd22e8a95fc3b089526788fb4ebceed3e7d4443da6e081a35e'
|
||||
digest: '5b7b94076b2fc20d6adb82479e6b28d07c902b75'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 31'
|
||||
message: 'dd245bffe6a638806667768360a95d0574e1a0bd0d18329fdb915ca484ac0d'
|
||||
digest: '6066db99fc358952cf7fb0ec4d89cb0158ed91d7'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 32'
|
||||
message: '0321794b739418c24e7c2e565274791c4be749752ad234ed56cb0a6347430c6b'
|
||||
digest: 'b89962c94d60f6a332fd60f6f07d4f032a586b76'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 33'
|
||||
message: '4c3dcf95c2f0b5258c651fcd1d51bd10425d6203067d0748d37d1340d9ddda7db3'
|
||||
digest: '17bda899c13d35413d2546212bcd8a93ceb0657b'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 34'
|
||||
message: 'b8d12582d25b45290a6e1bb95da429befcfdbf5b4dd41cdf3311d6988fa17cec0723'
|
||||
digest: 'badcdd53fdc144b8bf2cc1e64d10f676eebe66ed'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 35'
|
||||
message: '6fda97527a662552be15efaeba32a3aea4ed449abb5c1ed8d9bfff544708a425d69b72'
|
||||
digest: '01b4646180f1f6d2e06bbe22c20e50030322673a'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 36'
|
||||
message: '09fa2792acbb2417e8ed269041cc03c77006466e6e7ae002cf3f1af551e8ce0bb506d705'
|
||||
digest: '10016dc3a2719f9034ffcc689426d28292c42fc9'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 37'
|
||||
message: '5efa2987da0baf0a54d8d728792bcfa707a15798dc66743754406914d1cfe3709b1374eaeb'
|
||||
digest: '9f42fa2bce6ef021d93c6b2d902273797e426535'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 38'
|
||||
message: '2836de99c0f641cd55e89f5af76638947b8227377ef88bfba662e5682babc1ec96c6992bc9a0'
|
||||
digest: 'cdf48bacbff6f6152515323f9b43a286e0cb8113'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 39'
|
||||
message: '42143a2b9e1d0b354df3264d08f7b602f54aad922a3d63006d097f683dc11b90178423bff2f7fe'
|
||||
digest: 'b88fb75274b9b0fd57c0045988cfcef6c3ce6554'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 40'
|
||||
message: 'eb60c28ad8aeda807d69ebc87552024ad8aca68204f1bcd29dc5a81dd228b591e2efb7c4df75ef03'
|
||||
digest: 'c06d3a6a12d9e8db62e8cff40ca23820d61d8aa7'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 41'
|
||||
message: '7de4ba85ec54747cdc42b1f23546b7e490e31280f066e52fac117fd3b0792e4de62d5843ee98c72015'
|
||||
digest: '6e40f9e83a4be93874bc97cdebb8da6889ae2c7a'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 42'
|
||||
message: 'e70653637bc5e388ccd8dc44e5eace36f7398f2bac993042b9bc2f4fb3b0ee7e23a96439dc01134b8c7d'
|
||||
digest: '3efc940c312ef0dfd4e1143812248db89542f6a5'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 43'
|
||||
message: 'dd37bc9f0b3a4788f9b54966f252174c8ce487cbe59c53c22b81bf77621a7ce7616dcb5b1e2ee63c2c309b'
|
||||
digest: 'a0cf03f7badd0c3c3c4ea3717f5a4fb7e67b2e56'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 44'
|
||||
message: '5f485c637ae30b1e30497f0fb7ec364e13c906e2813daa34161b7ac4a4fd7a1bddd79601bbd22cef1f57cbc7'
|
||||
digest: 'a544e06f1a07ceb175a51d6d9c0111b3e15e9859'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 45'
|
||||
message: 'f6c237fb3cfe95ec8414cc16d203b4874e644cc9a543465cad2dc563488a659e8a2e7c981e2a9f22e5e868ffe1'
|
||||
digest: '199d986ed991b99a071f450c6b1121a727e8c735'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 46'
|
||||
message: 'da7ab3291553c659873c95913768953c6e526d3a26590898c0ade89ff56fbd110f1436af590b17fed49f8c4b2b1e'
|
||||
digest: '33bac6104b0ad6128d091b5d5e2999099c9f05de'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 47'
|
||||
message: '8cfa5fd56ee239ca47737591cba103e41a18acf8e8d257b0dbe8851134a81ff6b2e97104b39b76e19da256a17ce52d'
|
||||
digest: '76d7db6e18c1f4ae225ce8ccc93c8f9a0dfeb969'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 48'
|
||||
message: '57e89659d878f360af6de45a9a5e372ef40c384988e82640a3d5e4b76d2ef181780b9a099ac06ef0f8a7f3f764209720'
|
||||
digest: 'f652f3b1549f16710c7402895911e2b86a9b2aee'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 49'
|
||||
message: 'b91e64235dbd234eea2ae14a92a173ebe835347239cff8b02074416f55c6b60dc6ced06ae9f8d705505f0d617e4b29aef9'
|
||||
digest: '63faebb807f32be708cf00fc35519991dc4e7f68'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 50'
|
||||
message: 'e42a67362a581e8cf3d847502215755d7ad425ca030c4360b0f7ef513e6980265f61c9fa18dd9ce668f38dbc2a1ef8f83cd6'
|
||||
digest: '0e6730bc4a0e9322ea205f4edfff1fffda26af0a'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 51'
|
||||
message: '634db92c22010e1cbf1e1623923180406c515272209a8acc42de05cc2e96a1e94c1f9f6b93234b7f4c55de8b1961a3bf352259'
|
||||
digest: 'b61a3a6f42e8e6604b93196c43c9e84d5359e6fe'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 52'
|
||||
message: 'cc6ca3a8cb391cd8a5aff1faa7b3ffbdd21a5a3ce66cfaddbfe8b179e4c860be5ec66bd2c6de6a39a25622f9f2fcb3fc05af12b5'
|
||||
digest: '32d979ca1b3ed0ed8c890d99ec6dd85e6c16abf4'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 53'
|
||||
message: '7c0e6a0d35f8ac854c7245ebc73693731bbbc3e6fab644466de27bb522fcb99307126ae718fe8f00742e6e5cb7a687c88447cbc961'
|
||||
digest: '6f18190bd2d02fc93bce64756575cea36d08b1c3'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 54'
|
||||
message: 'c5581d40b331e24003901bd6bf244aca9e9601b9d81252bb38048642731f1146b8a4c69f88e148b2c8f8c14f15e1d6da57b2daa9991e'
|
||||
digest: '68f525feea1d8dbe0117e417ca46708d18d7629a'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 55'
|
||||
message: 'ec6b4a88713df27c0f2d02e738b69db43abda3921317259c864c1c386e9a5a3f533dc05f3beeb2bec2aac8e06db4c6cb3cddcf697e03d5'
|
||||
digest: 'a7272e2308622ff7a339460adc61efd0ea8dabdc'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 56'
|
||||
message: '0321736beba578e90abc1a90aa56157d871618f6de0d764cc8c91e06c68ecd3b9de3824064503384db67beb7fe012232dacaef93a000fba7'
|
||||
digest: 'aef843b86916c16f66c84d83a6005d23fd005c9e'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 57'
|
||||
message: 'd0a249a97b5f1486721a50d4c4ab3f5d674a0e29925d5bf2678ef6d8d521e456bd84aa755328c83fc890837726a8e7877b570dba39579aabdd'
|
||||
digest: 'be2cd6f380969be59cde2dff5e848a44e7880bd6'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 58'
|
||||
message: 'c32138531118f08c7dcc292428ad20b45ab27d9517a18445f38b8f0c2795bcdfe3ffe384e65ecbf74d2c9d0da88398575326074904c1709ba072'
|
||||
digest: 'e5eb4543deee8f6a5287845af8b593a95a9749a1'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 59'
|
||||
message: 'b0f4cfb939ea785eabb7e7ca7c476cdd9b227f015d905368ba00ae96b9aaf720297491b3921267576b72c8f58d577617e844f9f0759b399c6b064c'
|
||||
digest: '534c850448dd486787b62bdec2d4a0b140a1b170'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 60'
|
||||
message: 'bd02e51b0cf2c2b8d204a026b41a66fbfc2ac37ee9411fc449c8d1194a0792a28ee731407dfc89b6dfc2b10faa27723a184afef8fd83def858a32d3f'
|
||||
digest: '6fbfa6e4edce4cc85a845bf0d228dc39acefc2fa'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 61'
|
||||
message: 'e33146b83e4bb671392218da9a77f8d9f5974147182fb95ba662cb66011989c16d9af104735d6f79841aa4d1df276615b50108df8a29dbc9de31f4260d'
|
||||
digest: '018872691d9b04e8220e09187df5bc5fa6257cd9'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 62'
|
||||
message: '411c13c75073c1e2d4b1ecf13139ba9656cd35c14201f1c7c6f0eeb58d2dbfe35bfdeccc92c3961cfabb590bc1eb77eac15732fb0275798680e0c7292e50'
|
||||
digest: 'd98d512a35572f8bd20de62e9510cc21145c5bf4'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 63'
|
||||
message: 'f2c76ef617fa2bfc8a4d6bcbb15fe88436fdc2165d3074629579079d4d5b86f5081ab177b4c3f530376c9c924cbd421a8daf8830d0940c4fb7589865830699'
|
||||
digest: '9f3ea255f6af95c5454e55d7354cabb45352ea0b'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 64'
|
||||
message: '45927e32ddf801caf35e18e7b5078b7f5435278212ec6bb99df884f49b327c6486feae46ba187dc1cc9145121e1492e6b06e9007394dc33b7748f86ac3207cfe'
|
||||
digest: 'a70cfbfe7563dd0e665c7c6715a96a8d756950c0'
|
||||
},
|
||||
]
|
||||
|
||||
// long message test cases
|
||||
const long_cases = [
|
||||
SHA1TestCase{
|
||||
name: 'test case 163'
|
||||
message: '7c9c67323a1df1adbfe5ceb415eaef0155ece2820f4d50c1ec22cba4928ac656c83fe585db6a78ce40bc42757aba7e5a3f582428d6ca68d0c3978336a6efb729613e8d9979016204bfd921322fdd5222183554447de5e6e9bbe6edf76d7b71e18dc2e8d6dc89b7398364f652fafc734329aafa3dcd45d4f31e388e4fafd7fc6495f37ca5cbab7f54d586463da4bfeaa3bae09f7b8e9239d832b4f0a733aa609cc1f8d4'
|
||||
digest: 'd8fd6a91ef3b6ced05b98358a99107c1fac8c807'
|
||||
},
|
||||
SHA1TestCase{
|
||||
name: 'test case 262'
|
||||
message: '6cb70d19c096200f9249d2dbc04299b0085eb068257560be3a307dbd741a3378ebfa03fcca610883b07f7fea563a866571822472dade8a0bec4b98202d47a344312976a7bcb3964427eacb5b0525db22066599b81be41e5adaf157d925fac04b06eb6e01deb753babf33be16162b214e8db017212fafa512cdc8c0d0a15c10f632e8f4f47792c64d3f026004d173df50cf0aa7976066a79a8d78deeeec951dab7cc90f68d16f786671feba0b7d269d92941c4f02f432aa5ce2aab6194dcc6fd3ae36c8433274ef6b1bd0d314636be47ba38d1948343a38bf9406523a0b2a8cd78ed6266ee3c9b5c60620b308cc6b3a73c6060d5268a7d82b6a33b93a6fd6fe1de55231d12c97'
|
||||
digest: '4a75a406f4de5f9e1132069d66717fc424376388'
|
||||
},
|
||||
]
|
||||
|
||||
fn test_short_messages() {
|
||||
for c in short_cases {
|
||||
message := hex.decode(c.message)!
|
||||
expected_result := hex.decode(c.digest)!
|
||||
|
||||
actual_result := sha1.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 := sha1.sum(message)
|
||||
|
||||
assert actual_result == expected_result, 'failed ${c.name}'
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
// 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.sha1
|
||||
import hash
|
||||
|
||||
// verify sha1.Digest implements hash.Hash
|
||||
fn test_digest_implements_hash() {
|
||||
get_digest := fn () hash.Hash {
|
||||
return sha1.new()
|
||||
}
|
||||
}
|
||||
|
||||
fn test_crypto_sha1() {
|
||||
assert sha1.sum('This is a sha1 checksum.'.bytes()).hex() == 'e100d74442faa5dcd59463b808983c810a8eb5a1'
|
||||
}
|
||||
|
||||
fn test_crypto_sha1_writer() {
|
||||
mut digest := sha1.new()
|
||||
digest.write('This is a'.bytes()) or { assert false }
|
||||
digest.write(' sha1 checksum.'.bytes()) or { assert false }
|
||||
mut sum := digest.sum([])
|
||||
assert sum.hex() == 'e100d74442faa5dcd59463b808983c810a8eb5a1'
|
||||
sum = digest.sum([])
|
||||
assert sum.hex() == 'e100d74442faa5dcd59463b808983c810a8eb5a1'
|
||||
}
|
||||
|
||||
fn test_crypto_sha1_writer_reset() {
|
||||
mut digest := sha1.new()
|
||||
digest.write('This is a'.bytes()) or { assert false }
|
||||
digest.write(' sha1 checksum.'.bytes()) or { assert false }
|
||||
_ = digest.sum([])
|
||||
digest.reset()
|
||||
digest.write('This is a'.bytes()) or { assert false }
|
||||
digest.write(' sha1 checksum.'.bytes()) or { assert false }
|
||||
sum := digest.sum([])
|
||||
assert sum.hex() == 'e100d74442faa5dcd59463b808983c810a8eb5a1'
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
// 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.
|
||||
// This is the generic version with no architecture optimizations.
|
||||
// In its own file so that an architecture
|
||||
// optimized version can be substituted
|
||||
module sha1
|
||||
|
||||
import math.bits
|
||||
|
||||
const _k0 = u32(0x5A827999)
|
||||
const _k1 = u32(0x6ED9EBA1)
|
||||
const _k2 = u32(0x8F1BBCDC)
|
||||
const _k3 = u32(0xCA62C1D6)
|
||||
|
||||
@[direct_array_access]
|
||||
fn block_generic(mut dig Digest, p_ []u8) {
|
||||
unsafe {
|
||||
mut p := p_
|
||||
mut w := []u32{len: (16)}
|
||||
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]
|
||||
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])
|
||||
}
|
||||
mut a := h0
|
||||
mut b := h1
|
||||
mut c := h2
|
||||
mut d := h3
|
||||
mut e := h4
|
||||
// Each of the four 20-iteration rounds
|
||||
// differs only in the computation of f and
|
||||
// the choice of K (_k0, _k1, etc).
|
||||
mut i := 0
|
||||
for i < 16 {
|
||||
f := b & c | (~b) & d
|
||||
t := bits.rotate_left_32(a, 5) + f + e + w[i & 0xf] + u32(_k0)
|
||||
e = d
|
||||
d = c
|
||||
c = bits.rotate_left_32(b, 30)
|
||||
b = a
|
||||
a = t
|
||||
i++
|
||||
}
|
||||
for i < 20 {
|
||||
tmp := w[(i - 3) & 0xf] ^ w[(i - 8) & 0xf] ^ w[(i - 14) & 0xf] ^ w[i & 0xf]
|
||||
w[i & 0xf] = (tmp << 1) | (tmp >> (32 - 1))
|
||||
f := b & c | (~b) & d
|
||||
t := bits.rotate_left_32(a, 5) + f + e + w[i & 0xf] + u32(_k0)
|
||||
e = d
|
||||
d = c
|
||||
c = bits.rotate_left_32(b, 30)
|
||||
b = a
|
||||
a = t
|
||||
i++
|
||||
}
|
||||
for i < 40 {
|
||||
tmp := w[(i - 3) & 0xf] ^ w[(i - 8) & 0xf] ^ w[(i - 14) & 0xf] ^ w[i & 0xf]
|
||||
w[i & 0xf] = (tmp << 1) | (tmp >> (32 - 1))
|
||||
f := b ^ c ^ d
|
||||
t := bits.rotate_left_32(a, 5) + f + e + w[i & 0xf] + u32(_k1)
|
||||
e = d
|
||||
d = c
|
||||
c = bits.rotate_left_32(b, 30)
|
||||
b = a
|
||||
a = t
|
||||
i++
|
||||
}
|
||||
for i < 60 {
|
||||
tmp := w[(i - 3) & 0xf] ^ w[(i - 8) & 0xf] ^ w[(i - 14) & 0xf] ^ w[i & 0xf]
|
||||
w[i & 0xf] = (tmp << 1) | (tmp >> (32 - 1))
|
||||
f := ((b | c) & d) | (b & c)
|
||||
t := bits.rotate_left_32(a, 5) + f + e + w[i & 0xf] + u32(_k2)
|
||||
e = d
|
||||
d = c
|
||||
c = bits.rotate_left_32(b, 30)
|
||||
b = a
|
||||
a = t
|
||||
i++
|
||||
}
|
||||
for i < 80 {
|
||||
tmp := w[(i - 3) & 0xf] ^ w[(i - 8) & 0xf] ^ w[(i - 14) & 0xf] ^ w[i & 0xf]
|
||||
w[i & 0xf] = (tmp << 1) | (tmp >> (32 - 1))
|
||||
f := b ^ c ^ d
|
||||
t := bits.rotate_left_32(a, 5) + f + e + w[i & 0xf] + u32(_k3)
|
||||
e = d
|
||||
d = c
|
||||
c = bits.rotate_left_32(b, 30)
|
||||
b = a
|
||||
a = t
|
||||
i++
|
||||
}
|
||||
h0 += a
|
||||
h1 += b
|
||||
h2 += c
|
||||
h3 += d
|
||||
h4 += e
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user