-
Notifications
You must be signed in to change notification settings - Fork 260
/
Copy pathmain.nr
101 lines (84 loc) · 2.23 KB
/
main.nr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
global NIBBLE_LENGTH: comptime Field = 16;
fn compact_decode<N>(input: [u8; N], length: Field) -> ([u4; NIBBLE_LENGTH], Field)
{
constrain 2*input.len() as u64 <= NIBBLE_LENGTH as u64;
constrain length as u64 <= input.len() as u64;
let mut nibble = [0 as u4; NIBBLE_LENGTH];
let first_nibble = (input[0] >> 4) as u4;
let parity = first_nibble as u1;
if parity == 1
{
nibble[0] = (input[0] & 0x0f) as u4;
for i in 1..input.len()
{
if i as u64 < length as u64
{
let x = input[i];
nibble[2*i - 1] = (x >> 4) as u4;
nibble[2*i] = (x & 0x0f) as u4;
}
}
}
else
{
for i in 0..2
{
if (i as u64) < length as u64 - 1
{
let x = input[i + 1];
nibble[2*i] = (x >> 4) as u4;
nibble[2*i + 1] = (x & 0x0f) as u4;
}
}
}
let out = (nibble, 2*length + (parity as Field) - 2);
out
}
fn enc<N>(value: [u8; N], value_length: Field) -> ([u8; 32], Field)
{
constrain value.len() as u8 >= value_length as u8;
let mut out_value = [0; 32];
if value_length == 0
{
let out = (out_value, value_length);
out
}
else { if value_length as u8 < 31
{
out_value[0] = 0x80 + value_length as u8;
for i in 1..value.len()
{
out_value[i] = value[i-1];
}
let out = (out_value, value_length + 1);
out
}
else
{
let out = (out_value, 32);
out
}
}
}
fn main(x: [u8; 5], z: Field)
{
//Issue 1144
let (nib, len) = compact_decode(x,z);
constrain len == 5;
constrain [nib[0], nib[1], nib[2], nib[3], nib[4]] == [15, 1, 12, 11, 8];
}
#[test]
// Issue 1144
fn test_1144()
{
main([0x3f, 0x1c, 0xb8, 0x99, 0xab], 3);
}
// Issue 1169
fn enc_test()
{
let val1 = [0xb8,0x8f,0x61,0xe6,0xfb,0xda,0x83,0xfb,0xff,0xfa,0xbe,0x36,0x41,0x12,0x13,0x74,0x80,0x39,0x80,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00];
let val1_length = 20;
let enc_val1 = enc(val1,val1_length);
constrain enc_val1.0 == [0x94,0xb8,0x8f,0x61,0xe6,0xfb,0xda,0x83,0xfb,0xff,0xfa,0xbe,0x36,0x41,0x12,0x13,0x74,0x80,0x39,0x80,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00];
constrain enc_val1.1 == 21;
}