1
2
3
4
5 package pkcs11
6
7
30 import "C"
31 import "unsafe"
32
33
34 type GCMParams struct {
35 arena
36 params *C.CK_GCM_PARAMS
37 iv []byte
38 aad []byte
39 tagSize int
40 }
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 func NewGCMParams(iv, aad []byte, tagSize int) *GCMParams {
61 return &GCMParams{
62 iv: iv,
63 aad: aad,
64 tagSize: tagSize,
65 }
66 }
67
68 func cGCMParams(p *GCMParams) []byte {
69 params := C.CK_GCM_PARAMS{
70 ulTagBits: C.CK_ULONG(p.tagSize),
71 }
72 var arena arena
73 if len(p.iv) > 0 {
74 iv, ivLen := arena.Allocate(p.iv)
75 params.pIv = C.CK_BYTE_PTR(iv)
76 params.ulIvLen = ivLen
77 params.ulIvBits = ivLen * 8
78 }
79 if len(p.aad) > 0 {
80 aad, aadLen := arena.Allocate(p.aad)
81 params.pAAD = C.CK_BYTE_PTR(aad)
82 params.ulAADLen = aadLen
83 }
84 p.Free()
85 p.arena = arena
86 p.params = ¶ms
87 return C.GoBytes(unsafe.Pointer(¶ms), C.int(unsafe.Sizeof(params)))
88 }
89
90
91
92
93
94 func (p *GCMParams) IV() []byte {
95 if p == nil || p.params == nil {
96 return nil
97 }
98 newIv := C.GoBytes(unsafe.Pointer(p.params.pIv), C.int(p.params.ulIvLen))
99 iv := make([]byte, len(newIv))
100 copy(iv, newIv)
101 return iv
102 }
103
104
105
106
107
108 func (p *GCMParams) Free() {
109 if p == nil || p.arena == nil {
110 return
111 }
112 p.arena.Free()
113 p.params = nil
114 p.arena = nil
115 }
116
117
118 func NewPSSParams(hashAlg, mgf, saltLength uint) []byte {
119 p := C.CK_RSA_PKCS_PSS_PARAMS{
120 hashAlg: C.CK_MECHANISM_TYPE(hashAlg),
121 mgf: C.CK_RSA_PKCS_MGF_TYPE(mgf),
122 sLen: C.CK_ULONG(saltLength),
123 }
124 return C.GoBytes(unsafe.Pointer(&p), C.int(unsafe.Sizeof(p)))
125 }
126
127
128 type OAEPParams struct {
129 HashAlg uint
130 MGF uint
131 SourceType uint
132 SourceData []byte
133 }
134
135
136 func NewOAEPParams(hashAlg, mgf, sourceType uint, sourceData []byte) *OAEPParams {
137 return &OAEPParams{
138 HashAlg: hashAlg,
139 MGF: mgf,
140 SourceType: sourceType,
141 SourceData: sourceData,
142 }
143 }
144
145 func cOAEPParams(p *OAEPParams, arena arena) ([]byte, arena) {
146 params := C.CK_RSA_PKCS_OAEP_PARAMS{
147 hashAlg: C.CK_MECHANISM_TYPE(p.HashAlg),
148 mgf: C.CK_RSA_PKCS_MGF_TYPE(p.MGF),
149 source: C.CK_RSA_PKCS_OAEP_SOURCE_TYPE(p.SourceType),
150 }
151 if len(p.SourceData) != 0 {
152 buf, len := arena.Allocate(p.SourceData)
153
154 C.putOAEPParams(¶ms, buf, len)
155 }
156 return C.GoBytes(unsafe.Pointer(¶ms), C.int(unsafe.Sizeof(params))), arena
157 }
158
159
160 type ECDH1DeriveParams struct {
161 KDF uint
162 SharedData []byte
163 PublicKeyData []byte
164 }
165
166
167 func NewECDH1DeriveParams(kdf uint, sharedData []byte, publicKeyData []byte) *ECDH1DeriveParams {
168 return &ECDH1DeriveParams{
169 KDF: kdf,
170 SharedData: sharedData,
171 PublicKeyData: publicKeyData,
172 }
173 }
174
175 func cECDH1DeriveParams(p *ECDH1DeriveParams, arena arena) ([]byte, arena) {
176 params := C.CK_ECDH1_DERIVE_PARAMS{
177 kdf: C.CK_EC_KDF_TYPE(p.KDF),
178 }
179
180
181 if len(p.SharedData) != 0 {
182 sharedData, sharedDataLen := arena.Allocate(p.SharedData)
183 C.putECDH1SharedParams(¶ms, sharedData, sharedDataLen)
184 }
185
186 publicKeyData, publicKeyDataLen := arena.Allocate(p.PublicKeyData)
187 C.putECDH1PublicParams(¶ms, publicKeyData, publicKeyDataLen)
188
189 return C.GoBytes(unsafe.Pointer(¶ms), C.int(unsafe.Sizeof(params))), arena
190 }
191
View as plain text