|
1 | 1 | package jose
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "errors" |
5 |
| - "crypto/rsa" |
6 | 4 | "crypto/rand"
|
7 |
| - "hash" |
| 5 | + "crypto/rsa" |
8 | 6 | "crypto/sha1"
|
9 | 7 | "crypto/sha256"
|
| 8 | + "crypto/sha512" |
| 9 | + "errors" |
| 10 | + "hash" |
| 11 | + |
10 | 12 | "github.com/dvsekhvalnov/jose2go/arrays"
|
11 | 13 | )
|
12 | 14 |
|
13 | 15 | // RS-AES using OAEP key management algorithm implementation
|
14 | 16 | func init() {
|
15 |
| - RegisterJwa(&RsaOaep {shaSizeBits:1}) |
16 |
| - RegisterJwa(&RsaOaep {shaSizeBits:256}) |
| 17 | + RegisterJwa(&RsaOaep{shaSizeBits: 1}) |
| 18 | + RegisterJwa(&RsaOaep{shaSizeBits: 256}) |
| 19 | + RegisterJwa(&RsaOaep{shaSizeBits: 384}) |
| 20 | + RegisterJwa(&RsaOaep{shaSizeBits: 512}) |
17 | 21 | }
|
18 | 22 |
|
19 |
| -type RsaOaep struct{ |
| 23 | +type RsaOaep struct { |
20 | 24 | shaSizeBits int
|
21 |
| - // func shaF() hash.Hash |
22 | 25 | }
|
23 | 26 |
|
24 | 27 | func (alg *RsaOaep) Name() string {
|
25 | 28 | switch alg.shaSizeBits {
|
26 |
| - case 1: return RSA_OAEP |
27 |
| - default: return RSA_OAEP_256 |
| 29 | + case 1: |
| 30 | + return RSA_OAEP |
| 31 | + case 256: |
| 32 | + return RSA_OAEP_256 |
| 33 | + case 384: |
| 34 | + return RSA_OAEP_384 |
| 35 | + default: |
| 36 | + return RSA_OAEP_512 |
28 | 37 | }
|
29 | 38 | }
|
30 | 39 |
|
31 | 40 | func (alg *RsaOaep) WrapNewKey(cekSizeBits int, key interface{}, header map[string]interface{}) (cek []byte, encryptedCek []byte, err error) {
|
32 |
| - if pubKey,ok:=key.(*rsa.PublicKey);ok { |
33 |
| - if cek,err = arrays.Random(cekSizeBits>>3);err==nil { |
34 |
| - encryptedCek,err=rsa.EncryptOAEP(alg.sha(),rand.Reader,pubKey,cek,nil) |
| 41 | + if pubKey, ok := key.(*rsa.PublicKey); ok { |
| 42 | + if cek, err = arrays.Random(cekSizeBits >> 3); err == nil { |
| 43 | + encryptedCek, err = rsa.EncryptOAEP(alg.sha(), rand.Reader, pubKey, cek, nil) |
35 | 44 | return
|
36 | 45 | }
|
37 | 46 |
|
38 |
| - return nil,nil,err |
| 47 | + return nil, nil, err |
39 | 48 | }
|
40 | 49 |
|
41 |
| - return nil,nil,errors.New("RsaOaep.WrapNewKey(): expected key to be '*rsa.PublicKey'") |
| 50 | + return nil, nil, errors.New("RsaOaep.WrapNewKey(): expected key to be '*rsa.PublicKey'") |
42 | 51 | }
|
43 | 52 |
|
44 | 53 | func (alg *RsaOaep) Unwrap(encryptedCek []byte, key interface{}, cekSizeBits int, header map[string]interface{}) (cek []byte, err error) {
|
45 |
| - if privKey,ok:=key.(*rsa.PrivateKey);ok { |
46 |
| - return rsa.DecryptOAEP(alg.sha(), rand.Reader, privKey, encryptedCek, nil) |
| 54 | + if privKey, ok := key.(*rsa.PrivateKey); ok { |
| 55 | + return rsa.DecryptOAEP(alg.sha(), rand.Reader, privKey, encryptedCek, nil) |
47 | 56 | }
|
48 |
| - |
49 |
| - return nil,errors.New("RsaOaep.Unwrap(): expected key to be '*rsa.PrivateKey'") |
| 57 | + |
| 58 | + return nil, errors.New("RsaOaep.Unwrap(): expected key to be '*rsa.PrivateKey'") |
50 | 59 | }
|
51 | 60 |
|
52 | 61 | func (alg *RsaOaep) sha() hash.Hash {
|
53 | 62 | switch alg.shaSizeBits {
|
54 |
| - case 1: return sha1.New() |
55 |
| - default: return sha256.New() |
| 63 | + case 1: |
| 64 | + return sha1.New() |
| 65 | + case 256: |
| 66 | + return sha256.New() |
| 67 | + case 384: |
| 68 | + return sha512.New384() |
| 69 | + default: |
| 70 | + return sha512.New() |
56 | 71 | }
|
57 | 72 | }
|
0 commit comments