-
Notifications
You must be signed in to change notification settings - Fork 21
/
xmss.go
140 lines (103 loc) · 3.11 KB
/
xmss.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
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package xmss
import (
"io"
"github.com/deatil/go-cryptobin/xmss"
)
const XMSS_OID_LEN = 4
func GenerateKey(rand io.Reader, oid uint32) (*xmss.PrivateKey, *xmss.PublicKey, error) {
params, err := NewParamsWithOid(oid)
if err != nil {
return nil, nil, err
}
priv, pub, err := xmss.GenerateKey(rand, params)
if err != nil {
return nil, nil, err
}
var i uint32
d := make([]byte, XMSS_OID_LEN)
x := make([]byte, XMSS_OID_LEN)
for i = 0; i < XMSS_OID_LEN; i++ {
d[XMSS_OID_LEN - i - 1] = byte((oid >> (8 * i)) & 0xFF)
x[XMSS_OID_LEN - i - 1] = byte((oid >> (8 * i)) & 0xFF)
}
pri := new(xmss.PrivateKey)
pri.D = append(d, priv.D...)
pub2 := new(xmss.PublicKey)
pub2.X = append(x, pub.X...)
return pri, pub2, nil
}
func GenerateKeyWithName(rand io.Reader, name string) (*xmss.PrivateKey, *xmss.PublicKey, error) {
oid, err := GetOidByName(name)
if err != nil {
return nil, nil, err
}
return GenerateKey(rand, oid)
}
func Sign(priv *xmss.PrivateKey, msg []byte) ([]byte, error) {
var oid uint32 = 0
var i uint32
for i = 0; i < XMSS_OID_LEN; i++ {
oid |= uint32(priv.D[XMSS_OID_LEN - i - 1]) << (i * 8)
}
params, err := NewParamsWithOid(oid)
if err != nil {
return nil, err
}
pri := new(xmss.PrivateKey)
pri.D = priv.D[XMSS_OID_LEN:]
return pri.Sign(params, msg)
}
func Verify(pub *xmss.PublicKey, msg, signature []byte) (match bool) {
var oid uint32 = 0
var i uint32
for i = 0; i < XMSS_OID_LEN; i++ {
oid |= uint32(pub.X[XMSS_OID_LEN - i - 1]) << (i * 8)
}
params, err := NewParamsWithOid(oid)
if err != nil {
return false
}
pub2 := new(xmss.PublicKey)
pub2.X = pub.X[XMSS_OID_LEN:]
return xmss.Verify(params, pub2, msg, signature)
}
// 获取私钥 OID 类型 / Get PrivateKey OID type name
func GetPrivateKeyTypeName(priv *xmss.PrivateKey) (string, error) {
var oid uint32 = 0
var i uint32
for i = 0; i < XMSS_OID_LEN; i++ {
oid |= uint32(priv.D[XMSS_OID_LEN - i - 1]) << (i * 8)
}
return GetNameByOid(oid)
}
// 获取公钥 OID 类型 / Get PublicKey OID type name
func GetPublicKeyTypeName(pub *xmss.PublicKey) (string, error) {
var oid uint32 = 0
var i uint32
for i = 0; i < XMSS_OID_LEN; i++ {
oid |= uint32(pub.X[XMSS_OID_LEN - i - 1]) << (i * 8)
}
return GetNameByOid(oid)
}
// 导出公钥 / Export PublicKey
func ExportPublicKey(priv *xmss.PrivateKey) (*xmss.PublicKey, error) {
var oid uint32 = 0
var i uint32
for i = 0; i < XMSS_OID_LEN; i++ {
oid |= uint32(priv.D[XMSS_OID_LEN - i - 1]) << (i * 8)
}
params, err := NewParamsWithOid(oid)
if err != nil {
return nil, err
}
pri := new(xmss.PrivateKey)
pri.D = priv.D[XMSS_OID_LEN:]
pub := pri.PublicKey(params)
x := make([]byte, XMSS_OID_LEN)
for i = 0; i < XMSS_OID_LEN; i++ {
x[XMSS_OID_LEN - i - 1] = byte((oid >> (8 * i)) & 0xFF)
}
pub2 := new(xmss.PublicKey)
pub2.X = append(x, pub.X...)
return pub2, nil
}