1
16
17 package jose
18
19
20
21
22
23 type OpaqueSigner interface {
24
25 Public() *JSONWebKey
26
27 Algs() []SignatureAlgorithm
28
29
30 SignPayload(payload []byte, alg SignatureAlgorithm) ([]byte, error)
31 }
32
33 type opaqueSigner struct {
34 signer OpaqueSigner
35 }
36
37 func newOpaqueSigner(alg SignatureAlgorithm, signer OpaqueSigner) (recipientSigInfo, error) {
38 var algSupported bool
39 for _, salg := range signer.Algs() {
40 if alg == salg {
41 algSupported = true
42 break
43 }
44 }
45 if !algSupported {
46 return recipientSigInfo{}, ErrUnsupportedAlgorithm
47 }
48
49 return recipientSigInfo{
50 sigAlg: alg,
51 publicKey: signer.Public,
52 signer: &opaqueSigner{
53 signer: signer,
54 },
55 }, nil
56 }
57
58 func (o *opaqueSigner) signPayload(payload []byte, alg SignatureAlgorithm) (Signature, error) {
59 out, err := o.signer.SignPayload(payload, alg)
60 if err != nil {
61 return Signature{}, err
62 }
63
64 return Signature{
65 Signature: out,
66 protected: &rawHeader{},
67 }, nil
68 }
69
70
71
72
73 type OpaqueVerifier interface {
74 VerifyPayload(payload []byte, signature []byte, alg SignatureAlgorithm) error
75 }
76
77 type opaqueVerifier struct {
78 verifier OpaqueVerifier
79 }
80
81 func (o *opaqueVerifier) verifyPayload(payload []byte, signature []byte, alg SignatureAlgorithm) error {
82 return o.verifier.VerifyPayload(payload, signature, alg)
83 }
84
85
86 type OpaqueKeyEncrypter interface {
87
88 KeyID() string
89
90 Algs() []KeyAlgorithm
91
92 encryptKey(cek []byte, alg KeyAlgorithm) (recipientInfo, error)
93 }
94
95 type opaqueKeyEncrypter struct {
96 encrypter OpaqueKeyEncrypter
97 }
98
99 func newOpaqueKeyEncrypter(alg KeyAlgorithm, encrypter OpaqueKeyEncrypter) (recipientKeyInfo, error) {
100 var algSupported bool
101 for _, salg := range encrypter.Algs() {
102 if alg == salg {
103 algSupported = true
104 break
105 }
106 }
107 if !algSupported {
108 return recipientKeyInfo{}, ErrUnsupportedAlgorithm
109 }
110
111 return recipientKeyInfo{
112 keyID: encrypter.KeyID(),
113 keyAlg: alg,
114 keyEncrypter: &opaqueKeyEncrypter{
115 encrypter: encrypter,
116 },
117 }, nil
118 }
119
120 func (oke *opaqueKeyEncrypter) encryptKey(cek []byte, alg KeyAlgorithm) (recipientInfo, error) {
121 return oke.encrypter.encryptKey(cek, alg)
122 }
123
124
125 type OpaqueKeyDecrypter interface {
126 DecryptKey(encryptedKey []byte, header Header) ([]byte, error)
127 }
128
129 type opaqueKeyDecrypter struct {
130 decrypter OpaqueKeyDecrypter
131 }
132
133 func (okd *opaqueKeyDecrypter) decryptKey(headers rawHeader, recipient *recipientInfo, generator keyGenerator) ([]byte, error) {
134 mergedHeaders := rawHeader{}
135 mergedHeaders.merge(&headers)
136 mergedHeaders.merge(recipient.header)
137
138 header, err := mergedHeaders.sanitized()
139 if err != nil {
140 return nil, err
141 }
142
143 return okd.decrypter.DecryptKey(recipient.encryptedKey, header)
144 }
145
View as plain text