@@ -19,7 +19,6 @@ import (
19
19
"crypto/ecdsa"
20
20
"crypto/elliptic"
21
21
"crypto/hmac"
22
- "crypto/rand"
23
22
"crypto/rsa"
24
23
"crypto/x509"
25
24
"errors"
@@ -110,6 +109,22 @@ func New(securityLevel int, hashFamily string, keyStore bccsp.KeyStore) (bccsp.B
110
109
verifiers : verifiers ,
111
110
hashers : hashers }
112
111
112
+ // Set the key generators
113
+ keyGenerators := make (map [reflect.Type ]KeyGenerator )
114
+ keyGenerators [reflect .TypeOf (& bccsp.ECDSAKeyGenOpts {})] = & ecdsaKeyGenerator {curve : conf .ellipticCurve }
115
+ keyGenerators [reflect .TypeOf (& bccsp.ECDSAP256KeyGenOpts {})] = & ecdsaKeyGenerator {curve : elliptic .P256 ()}
116
+ keyGenerators [reflect .TypeOf (& bccsp.ECDSAP384KeyGenOpts {})] = & ecdsaKeyGenerator {curve : elliptic .P384 ()}
117
+ keyGenerators [reflect .TypeOf (& bccsp.AESKeyGenOpts {})] = & aesKeyGenerator {length : conf .aesBitLength }
118
+ keyGenerators [reflect .TypeOf (& bccsp.AES256KeyGenOpts {})] = & aesKeyGenerator {length : 32 }
119
+ keyGenerators [reflect .TypeOf (& bccsp.AES192KeyGenOpts {})] = & aesKeyGenerator {length : 24 }
120
+ keyGenerators [reflect .TypeOf (& bccsp.AES128KeyGenOpts {})] = & aesKeyGenerator {length : 16 }
121
+ keyGenerators [reflect .TypeOf (& bccsp.RSAKeyGenOpts {})] = & rsaKeyGenerator {length : conf .rsaBitLength }
122
+ keyGenerators [reflect .TypeOf (& bccsp.RSA1024KeyGenOpts {})] = & rsaKeyGenerator {length : 1024 }
123
+ keyGenerators [reflect .TypeOf (& bccsp.RSA2048KeyGenOpts {})] = & rsaKeyGenerator {length : 2048 }
124
+ keyGenerators [reflect .TypeOf (& bccsp.RSA3072KeyGenOpts {})] = & rsaKeyGenerator {length : 3072 }
125
+ keyGenerators [reflect .TypeOf (& bccsp.RSA4096KeyGenOpts {})] = & rsaKeyGenerator {length : 4096 }
126
+ impl .keyGenerators = keyGenerators
127
+
113
128
return impl , nil
114
129
}
115
130
@@ -118,11 +133,12 @@ type impl struct {
118
133
conf * config
119
134
ks bccsp.KeyStore
120
135
121
- encryptors map [reflect.Type ]Encryptor
122
- decryptors map [reflect.Type ]Decryptor
123
- signers map [reflect.Type ]Signer
124
- verifiers map [reflect.Type ]Verifier
125
- hashers map [reflect.Type ]Hasher
136
+ keyGenerators map [reflect.Type ]KeyGenerator
137
+ encryptors map [reflect.Type ]Encryptor
138
+ decryptors map [reflect.Type ]Decryptor
139
+ signers map [reflect.Type ]Signer
140
+ verifiers map [reflect.Type ]Verifier
141
+ hashers map [reflect.Type ]Hasher
126
142
}
127
143
128
144
// KeyGen generates a key using opts.
@@ -132,115 +148,14 @@ func (csp *impl) KeyGen(opts bccsp.KeyGenOpts) (k bccsp.Key, err error) {
132
148
return nil , errors .New ("Invalid Opts parameter. It must not be nil." )
133
149
}
134
150
135
- // Parse algorithm
136
- switch opts .(type ) {
137
- case * bccsp.ECDSAKeyGenOpts :
138
- lowLevelKey , err := ecdsa .GenerateKey (csp .conf .ellipticCurve , rand .Reader )
139
- if err != nil {
140
- return nil , fmt .Errorf ("Failed generating ECDSA key [%s]" , err )
141
- }
142
-
143
- k = & ecdsaPrivateKey {lowLevelKey }
144
-
145
- case * bccsp.ECDSAP256KeyGenOpts :
146
- lowLevelKey , err := ecdsa .GenerateKey (elliptic .P256 (), rand .Reader )
147
- if err != nil {
148
- return nil , fmt .Errorf ("Failed generating ECDSA P256 key [%s]" , err )
149
- }
150
-
151
- k = & ecdsaPrivateKey {lowLevelKey }
152
-
153
- case * bccsp.ECDSAP384KeyGenOpts :
154
- lowLevelKey , err := ecdsa .GenerateKey (elliptic .P384 (), rand .Reader )
155
- if err != nil {
156
- return nil , fmt .Errorf ("Failed generating ECDSA P384 key [%s]" , err )
157
- }
158
-
159
- k = & ecdsaPrivateKey {lowLevelKey }
160
-
161
- case * bccsp.AESKeyGenOpts :
162
- lowLevelKey , err := GetRandomBytes (csp .conf .aesBitLength )
163
-
164
- if err != nil {
165
- return nil , fmt .Errorf ("Failed generating AES key [%s]" , err )
166
- }
167
-
168
- k = & aesPrivateKey {lowLevelKey , false }
169
-
170
- case * bccsp.AES256KeyGenOpts :
171
- lowLevelKey , err := GetRandomBytes (32 )
172
-
173
- if err != nil {
174
- return nil , fmt .Errorf ("Failed generating AES 256 key [%s]" , err )
175
- }
176
-
177
- k = & aesPrivateKey {lowLevelKey , false }
178
-
179
- case * bccsp.AES192KeyGenOpts :
180
- lowLevelKey , err := GetRandomBytes (24 )
181
-
182
- if err != nil {
183
- return nil , fmt .Errorf ("Failed generating AES 192 key [%s]" , err )
184
- }
185
-
186
- k = & aesPrivateKey {lowLevelKey , false }
187
-
188
- case * bccsp.AES128KeyGenOpts :
189
- lowLevelKey , err := GetRandomBytes (16 )
190
-
191
- if err != nil {
192
- return nil , fmt .Errorf ("Failed generating AES 128 key [%s]" , err )
193
- }
194
-
195
- k = & aesPrivateKey {lowLevelKey , false }
196
-
197
- case * bccsp.RSAKeyGenOpts :
198
- lowLevelKey , err := rsa .GenerateKey (rand .Reader , csp .conf .rsaBitLength )
199
-
200
- if err != nil {
201
- return nil , fmt .Errorf ("Failed generating RSA key [%s]" , err )
202
- }
203
-
204
- k = & rsaPrivateKey {lowLevelKey }
205
-
206
- case * bccsp.RSA1024KeyGenOpts :
207
- lowLevelKey , err := rsa .GenerateKey (rand .Reader , 1024 )
208
-
209
- if err != nil {
210
- return nil , fmt .Errorf ("Failed generating RSA 1024 key [%s]" , err )
211
- }
212
-
213
- k = & rsaPrivateKey {lowLevelKey }
214
-
215
- case * bccsp.RSA2048KeyGenOpts :
216
- lowLevelKey , err := rsa .GenerateKey (rand .Reader , 2048 )
217
-
218
- if err != nil {
219
- return nil , fmt .Errorf ("Failed generating RSA 2048 key [%s]" , err )
220
- }
221
-
222
- k = & rsaPrivateKey {lowLevelKey }
223
-
224
- case * bccsp.RSA3072KeyGenOpts :
225
- lowLevelKey , err := rsa .GenerateKey (rand .Reader , 3072 )
226
-
227
- if err != nil {
228
- return nil , fmt .Errorf ("Failed generating RSA 3072 key [%s]" , err )
229
- }
230
-
231
- k = & rsaPrivateKey {lowLevelKey }
232
-
233
- case * bccsp.RSA4096KeyGenOpts :
234
- lowLevelKey , err := rsa .GenerateKey (rand .Reader , 4096 )
235
-
236
- if err != nil {
237
- return nil , fmt .Errorf ("Failed generating RSA 4096 key [%s]" , err )
238
- }
239
-
240
- k = & rsaPrivateKey {lowLevelKey }
151
+ keyGenerator , found := csp .keyGenerators [reflect .TypeOf (opts )]
152
+ if ! found {
153
+ return nil , fmt .Errorf ("Unsupported 'KeyGenOpts' provided [%v]" , opts )
154
+ }
241
155
242
- default :
243
- return nil , fmt .Errorf ("Unrecognized KeyGenOpts provided [%s]" , opts .Algorithm ())
156
+ k , err = keyGenerator .KeyGen (opts )
157
+ if err != nil {
158
+ return nil , err
244
159
}
245
160
246
161
// If the key is not Ephemeral, store it.
0 commit comments