Skip to content

Commit 90844c3

Browse files
committed
RSA-OAEP-384,RSA-OAEP-512 key management algos support
1 parent 0a0673d commit 90844c3

File tree

3 files changed

+61
-20
lines changed

3 files changed

+61
-20
lines changed

jose.go

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ const (
3737
RSA1_5 = "RSA1_5" //RSAES with PKCS #1 v1.5 padding, RFC 3447
3838
RSA_OAEP = "RSA-OAEP" //RSAES using Optimal Assymetric Encryption Padding, RFC 3447
3939
RSA_OAEP_256 = "RSA-OAEP-256" //RSAES using Optimal Assymetric Encryption Padding with SHA-256, RFC 3447
40+
RSA_OAEP_384 = "RSA-OAEP-384" //RSAES using Optimal Assymetric Encryption Padding with SHA-384, RFC 3447
41+
RSA_OAEP_512 = "RSA-OAEP-512" //RSAES using Optimal Assymetric Encryption Padding with SHA-512, RFC 3447
4042
A128KW = "A128KW" //AES Key Wrap Algorithm using 128 bit keys, RFC 3394
4143
A192KW = "A192KW" //AES Key Wrap Algorithm using 192 bit keys, RFC 3394
4244
A256KW = "A256KW" //AES Key Wrap Algorithm using 256 bit keys, RFC 3394

jose_test.go

+24
Original file line numberDiff line numberDiff line change
@@ -2141,6 +2141,30 @@ func (s *TestSuite) TestDecrypt_RSA_OAEP_256_A256CBC_HS512(c *C) {
21412141
c.Assert(test, Equals, `{"exp":1392553211,"sub":"alice","nbf":1392552611,"aud":["https:\/\/app-one.com","https:\/\/app-two.com"],"iss":"https:\/\/openid.net","jti":"586dd129-a29f-49c8-9de7-454af1155e27","iat":1392552611}`)
21422142
}
21432143

2144+
func (s *TestSuite) TestDecrypt_RSA_OAEP_384_A192GCM(c *C) {
2145+
//given
2146+
token := "eyJlbmMiOiJBMTkyR0NNIiwiYWxnIjoiUlNBLU9BRVAtMzg0In0.pT2_03Aa03PWky6L5LoW9UR2KYbdgQqpiU2lRsZxfKk2OUC-MPs6rAECylRtSPOWMYhW1NKaGrmt07jAi7gCs2ijwgpyD1VyM3GmmOrnsWwP_MW8WTWIpnLgaL1ajHjrlM3ZZuSFNLSw-O_-JfY6JHKUeCbq7Gta95l6AESDDGLxVW_wJnZLkNVqY-pq5_eBR1Gk1jOWpxb68MTr8k8gLivvuRRBWRiX4i52kcRFFaKcNp65ZmXTr3HOgf0BiGSzEZQFDwwpzGE5aaD8DcWEyn8R3LsxZU9puOILdkKo7MvHNkjZkTHWQFpe9L4Ppd8wX-fh4mLweyCCcJylzJHN1g.Vz8ymkRo6KT-ADV4.BmVs6Y4PE6zR2ALEDYjC8bCUQjALvsWwhbt9MU-Vo0mZpCIXZdwW8sAIF9n62GH7FPoNQbaXTXfpziyGPGFCxiB6StkppiGFo5Af4mGXx55YFNXghMkZfS9Oy3Ib0SbagF0GNR_cWXyfzanHCeskqcYOICEHwiAdONzwLhgCXt57R3TdoK6EL_wJKy6vhEL2pOsg5woj2P7NLuGezNUoB1vrpqTbySeoS8eZJ3Rz54_ShzdcVl8kBJ7WRRN_Iw.yErR3LUS8PbBClIwF7kI_Q"
2147+
2148+
//when
2149+
test, _, err := Decode(token, PrivKey())
2150+
2151+
//then
2152+
c.Assert(err, IsNil)
2153+
c.Assert(test, Equals, `{"sub":"alice","aud":["https://app-one.com","https://app-two.com"],"nbf":1731426506,"iss":"https://openid.net","exp":1731427106,"iat":1731426506,"jti":"49c091f4-f176-4227-ab82-b236beac2b94"}`)
2154+
}
2155+
2156+
func (s *TestSuite) TestDecrypt_RSA_OAEP_512_A256GCM(c *C) {
2157+
//given
2158+
token := "eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAtNTEyIn0.dDvBnxku8qBk0Ry8MRoIkWVszEsI0NKiBQtYnDQ6sq8mQyFp9dEbF-4_0a6_e6qZs5lyEjE-4y9Y-dV3rKymTXHqOVtsyUvrF_bGQ5rOThBkd08wcpEe7OiFIuWWcujJQ5p77IAkBlpedt3hb7tE2kbhMkocTSUXzWmWjLIka3teYUfbv2Rifacpj_XPXejDgYifVMnOcN7LFjbhEl7aajpy9nseWx9ihnAFbPdf7fT8cm9lEM8damUoFPIH4KUrHmAk72F49yT8OODjY-Sl93Q1vo1PbVMX-J6kTY3h0CcsAabnLs3Cn8OamHXxeWtQsWKmfazmOIp_uRCisTgwcg.hrJ7S_BfciovKcRB.YSqRYn0c-NQ3C86O7kpFev0Wt5RpOi_hHknLVgn04zwZGZGqS3zr7t5v-j4bHgouFhv1GdN5xvu0gFW1xXjo0_ZxcLNmHFmOAa3I7LtsPy4cW3Hkuy3wEblLg8cRoPTaLSvRPt9w2j_wy1beH9zrEqcf_KC3cKCzmoY0FatVwof5V9ICqtfFunv4h6ows-Fwhi_zzuL7zO5ydR-MH7D5Yhq1ni6SvRogp3Utfj2R_4jTGy8jGRRowfjsXR-GuQ.w15ByyQnK2G1_qnmkQU8QA"
2159+
2160+
//when
2161+
test, _, err := Decode(token, PrivKey())
2162+
2163+
//then
2164+
c.Assert(err, IsNil)
2165+
c.Assert(test, Equals, `{"sub":"alice","aud":["https://app-one.com","https://app-two.com"],"nbf":1731426506,"iss":"https://openid.net","exp":1731427106,"iat":1731426506,"jti":"6278505b-6dcd-483c-8dd1-7c35b7d1a1e5"}`)
2166+
}
2167+
21442168
func (s *TestSuite) TestEncrypt_RSA_OAEP_256_A128GCM(c *C) {
21452169
//given
21462170
payload := `{"hello": "world"}`

rsa_oaep.go

+35-20
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,72 @@
11
package jose
22

33
import (
4-
"errors"
5-
"crypto/rsa"
64
"crypto/rand"
7-
"hash"
5+
"crypto/rsa"
86
"crypto/sha1"
97
"crypto/sha256"
8+
"crypto/sha512"
9+
"errors"
10+
"hash"
11+
1012
"github.com/dvsekhvalnov/jose2go/arrays"
1113
)
1214

1315
// RS-AES using OAEP key management algorithm implementation
1416
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})
1721
}
1822

19-
type RsaOaep struct{
23+
type RsaOaep struct {
2024
shaSizeBits int
21-
// func shaF() hash.Hash
2225
}
2326

2427
func (alg *RsaOaep) Name() string {
2528
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
2837
}
2938
}
3039

3140
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)
3544
return
3645
}
3746

38-
return nil,nil,err
47+
return nil, nil, err
3948
}
4049

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'")
4251
}
4352

4453
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)
4756
}
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'")
5059
}
5160

5261
func (alg *RsaOaep) sha() hash.Hash {
5362
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()
5671
}
5772
}

0 commit comments

Comments
 (0)