Skip to content

Commit 47cecb5

Browse files
fix shift bug in sha256 (#164)
1 parent b519245 commit 47cecb5

2 files changed

Lines changed: 51 additions & 10 deletions

File tree

src/math/src/sha256.cairo

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,19 +63,19 @@ fn sha256(mut data: Array<u8>) -> Array<u8> {
6363
};
6464

6565
// add length to the end
66-
let mut res = (data_len & 0xff00000000000000) / 0xffffffffffffff;
66+
let mut res = (data_len & 0xff00000000000000) / 0x100000000000000;
6767
data.append(res.try_into().unwrap());
68-
res = (data_len.into() & 0xff000000000000) / 0xffffffffffff;
68+
res = (data_len.into() & 0xff000000000000) / 0x1000000000000;
6969
data.append(res.try_into().unwrap());
70-
res = (data_len.into() & 0xff0000000000) / 0xffffffffff;
70+
res = (data_len.into() & 0xff0000000000) / 0x10000000000;
7171
data.append(res.try_into().unwrap());
72-
res = (data_len.into() & 0xff00000000) / 0xffffffff;
72+
res = (data_len.into() & 0xff00000000) / 0x100000000;
7373
data.append(res.try_into().unwrap());
74-
res = (data_len.into() & 0xff000000) / 0xffffff;
74+
res = (data_len.into() & 0xff000000) / 0x1000000;
7575
data.append(res.try_into().unwrap());
76-
res = (data_len.into() & 0xff0000) / 0xffff;
76+
res = (data_len.into() & 0xff0000) / 0x10000;
7777
data.append(res.try_into().unwrap());
78-
res = (data_len.into() & 0xff00) / 0xff;
78+
res = (data_len.into() & 0xff00) / 0x100;
7979
data.append(res.try_into().unwrap());
8080
res = data_len.into() & 0xff;
8181
data.append(res.try_into().unwrap());
@@ -93,11 +93,11 @@ fn from_u32Array_to_u8Array(mut data: Span<u32>) -> Array<u8> {
9393
loop {
9494
match data.pop_front() {
9595
Option::Some(val) => {
96-
let mut res = (*val & 0xff000000) / 0xffffff;
96+
let mut res = (*val & 0xff000000) / 0x1000000;
9797
result.append(res.try_into().unwrap());
98-
res = (*val & 0xff0000) / 0xffff;
98+
res = (*val & 0xff0000) / 0x10000;
9999
result.append(res.try_into().unwrap());
100-
res = (*val & 0xff00) / 0xff;
100+
res = (*val & 0xff00) / 0x100;
101101
result.append(res.try_into().unwrap());
102102
res = *val & 0xff;
103103
result.append(res.try_into().unwrap());

src/math/src/tests/sha256_test.cairo

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,47 @@ fn sha256_empty_test() {
4343
assert(*result[31] == 0x55, 'invalid result');
4444
}
4545

46+
#[test]
47+
#[available_gas(200000000000)]
48+
fn sha256_random_data_test() {
49+
let mut input: Array<u8> = array![
50+
0x57, 0x77, 0x71, 0x71, 0x66, 0x50, 0x45, 0x51, 0x51, 0x43, 0x39, 0x48, 0x38
51+
];
52+
let result = sha256::sha256(input);
53+
assert(*result[0] == 61, 'invalid result');
54+
assert(*result[1] == 226, 'invalid result');
55+
assert(*result[2] == 188, 'invalid result');
56+
assert(*result[3] == 242, 'invalid result');
57+
assert(*result[4] == 118, 'invalid result');
58+
assert(*result[5] == 121, 'invalid result');
59+
assert(*result[6] == 7, 'invalid result');
60+
assert(*result[7] == 225, 'invalid result');
61+
assert(*result[8] == 150, 'invalid result');
62+
assert(*result[9] == 220, 'invalid result');
63+
assert(*result[10] == 105, 'invalid result');
64+
assert(*result[11] == 158, 'invalid result');
65+
assert(*result[12] == 185, 'invalid result');
66+
assert(*result[13] == 180, 'invalid result');
67+
assert(*result[14] == 139, 'invalid result');
68+
assert(*result[15] == 103, 'invalid result');
69+
assert(*result[16] == 221, 'invalid result');
70+
assert(*result[17] == 95, 'invalid result');
71+
assert(*result[18] == 56, 'invalid result');
72+
assert(*result[19] == 88, 'invalid result');
73+
assert(*result[20] == 209, 'invalid result');
74+
assert(*result[21] == 159, 'invalid result');
75+
assert(*result[22] == 255, 'invalid result');
76+
assert(*result[23] == 247, 'invalid result');
77+
assert(*result[24] == 145, 'invalid result');
78+
assert(*result[25] == 146, 'invalid result');
79+
assert(*result[26] == 83, 'invalid result');
80+
assert(*result[27] == 110, 'invalid result');
81+
assert(*result[28] == 185, 'invalid result');
82+
assert(*result[29] == 5, 'invalid result');
83+
assert(*result[30] == 248, 'invalid result');
84+
assert(*result[31] == 15, 'invalid result');
85+
}
86+
4687
#[test]
4788
#[available_gas(2000000000)]
4889
fn sha256_lorem_ipsum_test() {

0 commit comments

Comments
 (0)