-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkeys.go
67 lines (56 loc) · 2.04 KB
/
keys.go
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
package ctrsigcheck
import (
"math/big"
)
var commonKeys = [...][]byte{
{0x64, 0xc5, 0xfd, 0x55, 0xdd, 0x3a, 0xd9, 0x88, 0x32, 0x5b, 0xaa, 0xec, 0x52, 0x43, 0xdb, 0x98},
{0x4a, 0xaa, 0x3d, 0x0e, 0x27, 0xd4, 0xd7, 0x28, 0xd0, 0xb1, 0xb4, 0x33, 0xf0, 0xf9, 0xcb, 0xc8},
{0xfb, 0xb0, 0xef, 0x8c, 0xdb, 0xb0, 0xd8, 0xe4, 0x53, 0xcd, 0x99, 0x34, 0x43, 0x71, 0x69, 0x7f},
{0x25, 0x95, 0x9b, 0x7a, 0xd0, 0x40, 0x9f, 0x72, 0x68, 0x41, 0x98, 0xba, 0x2e, 0xcd, 0x7d, 0xc6},
{0x7a, 0xda, 0x22, 0xca, 0xff, 0xc4, 0x76, 0xcc, 0x82, 0x97, 0xa0, 0xc7, 0xce, 0xee, 0xee, 0xbe},
{0xa5, 0x05, 0x1c, 0xa1, 0xb3, 0x7d, 0xcf, 0x3a, 0xfb, 0xcf, 0x8c, 0xc1, 0xed, 0xd9, 0xce, 0x02},
}
var fixedSystemKey = []byte{0x52, 0x7c, 0xe6, 0x30, 0xa9, 0xca, 0x30, 0x5f, 0x36, 0x96, 0xf3, 0xcd, 0xe9, 0x54, 0x19, 0x4b}
var zeroKey = []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
var ncchKeyX = []byte{0xb9, 0x8e, 0x95, 0xce, 0xca, 0x3e, 0x4d, 0x17, 0x1f, 0x76, 0xa9, 0x4d, 0xe9, 0x34, 0xc0, 0x53}
var keygenConst = new(big.Int).SetBytes([]byte{0x1f, 0xf9, 0xe9, 0xaa, 0xc5, 0xfe, 0x04, 0x08, 0x02, 0x45, 0x91, 0xdc, 0x5d, 0x52, 0x76, 0x8a})
func lrot(src []byte, n uint) []byte {
count := len(src)
dst := make([]byte, count)
if count > 0 {
offset := int(n/8) % count
n %= 8
for i := range dst {
dst[i] = src[(i+offset)%count]<<n | src[(i+offset+1)%count]>>(8-n)
}
}
return dst
}
func rrot(src []byte, n uint) []byte {
count := len(src)
dst := make([]byte, count)
if count > 0 {
offset := int(n/8) % count
n %= 8
for i := range dst {
dst[i] = src[(i+count-offset)%count]>>n | src[(i+count-offset-1)%count]<<(8-n)
}
}
return dst
}
func keygen(x, y []byte) []byte {
if len(x) != 16 {
panic("keyX must be 128 bit long")
}
if len(y) != 16 {
panic("keyY must be 128 bit long")
}
// key = (((x <<< 2) ^ y) + KEYGEN_CONST) >>> 41
key := lrot(x, 2)
for i := range key {
key[i] ^= y[i]
}
key = new(big.Int).Add(new(big.Int).SetBytes(key), keygenConst).Bytes()
key = key[len(key)-16:]
return rrot(key, 41)
}