@@ -3,9 +3,12 @@ package signerverifier
3
3
import (
4
4
"context"
5
5
"crypto/rsa"
6
+ "encoding/json"
7
+ "os"
6
8
"path/filepath"
7
9
"testing"
8
10
11
+ "github.com/secure-systems-lab/go-securesystemslib/cjson"
9
12
"github.com/secure-systems-lab/go-securesystemslib/dsse"
10
13
"github.com/stretchr/testify/assert"
11
14
)
@@ -25,11 +28,40 @@ func TestNewRSAPSSSignerVerifierFromSSLibKey(t *testing.T) {
25
28
_ , expectedPublicKey , err := decodeAndParsePEM ([]byte (expectedPublicString ))
26
29
assert .Nil (t , err )
27
30
28
- assert .Equal (t , "966c5d84ba73ccded42eb473c939d77336e4def253ffaf6739f8e983ef73dad8 " , sv .keyID ) // FIXME: mismatch?
31
+ assert .Equal (t , "4e8d20af09fcaed6c388a186427f94a5f7ff5591ec295f4aab2cff49ffe39e9b " , sv .keyID )
29
32
assert .Equal (t , expectedPublicKey .(* rsa.PublicKey ), sv .public )
30
33
assert .Nil (t , sv .private )
31
34
}
32
35
36
+ func TestLoadRSAPSSKeyFromFile (t * testing.T ) {
37
+ t .Run ("RSA public key" , func (t * testing.T ) {
38
+ key , err := LoadRSAPSSKeyFromFile (filepath .Join ("test-data" , "rsa-test-key.pub" ))
39
+ assert .Nil (t , err )
40
+
41
+ assert .Equal (t , "4e8d20af09fcaed6c388a186427f94a5f7ff5591ec295f4aab2cff49ffe39e9b" , key .KeyID )
42
+ assert .Equal (t , "-----BEGIN PUBLIC KEY-----\n MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA04egZRic+dZMVtiQc56D\n ejU4FF1q3aOkUKnD+Q4lTbj1zp6ODKJTcktupmrad68jqtMiSGG8he6ELFs377q8\n bbgEUMWgAf+06Q8oFvUSfOXzZNFI7H5SMPOJY5aDWIMIEZ8DlcO7TfkA7D3iAEJX\n xxTOVS3UAIk5umO7Y7t7yXr8O/C4u78krGazCnoblcekMLJZV4O/5BloWNAe/B1c\n vZdaZUf3brD4ZZrxEtXw/tefhn1aHsSUajVW2wwjSpKhqj7Z0XS3bDS3T95/3xsN\n 6+hlS6A7rJfiWpKIRHj0vh2SXLDmmhQl1In8TD/aiycTUyWcBRHVPlYFgYPt6SaT\n VQSgMzSxC43/2fINb2fyt8SbUHJ3Ct+mzRzd/1AQikWhBdstJLxInewzjYE/sb+c\n 2CmCxMPQG2BwmAWXaaumeJcXVPBlMgAcjMatM8bPByTbXpKDnQslOE7g/gswDIwn\n Em53T13mZzYUvbLJ0q3aljZVLIC3IZn3ZwA2yCWchBkVAgMBAAE=\n -----END PUBLIC KEY-----" , key .KeyVal .Public )
43
+ assert .Equal (t , RSAKeyScheme , key .Scheme )
44
+ assert .Equal (t , RSAKeyType , key .KeyType )
45
+ })
46
+
47
+ t .Run ("RSA private key" , func (t * testing.T ) {
48
+ key , err := LoadRSAPSSKeyFromFile (filepath .Join ("test-data" , "rsa-test-key" ))
49
+ assert .Nil (t , err )
50
+
51
+ assert .Equal (t , "4e8d20af09fcaed6c388a186427f94a5f7ff5591ec295f4aab2cff49ffe39e9b" , key .KeyID )
52
+ assert .Equal (t , "-----BEGIN PUBLIC KEY-----\n MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA04egZRic+dZMVtiQc56D\n ejU4FF1q3aOkUKnD+Q4lTbj1zp6ODKJTcktupmrad68jqtMiSGG8he6ELFs377q8\n bbgEUMWgAf+06Q8oFvUSfOXzZNFI7H5SMPOJY5aDWIMIEZ8DlcO7TfkA7D3iAEJX\n xxTOVS3UAIk5umO7Y7t7yXr8O/C4u78krGazCnoblcekMLJZV4O/5BloWNAe/B1c\n vZdaZUf3brD4ZZrxEtXw/tefhn1aHsSUajVW2wwjSpKhqj7Z0XS3bDS3T95/3xsN\n 6+hlS6A7rJfiWpKIRHj0vh2SXLDmmhQl1In8TD/aiycTUyWcBRHVPlYFgYPt6SaT\n VQSgMzSxC43/2fINb2fyt8SbUHJ3Ct+mzRzd/1AQikWhBdstJLxInewzjYE/sb+c\n 2CmCxMPQG2BwmAWXaaumeJcXVPBlMgAcjMatM8bPByTbXpKDnQslOE7g/gswDIwn\n Em53T13mZzYUvbLJ0q3aljZVLIC3IZn3ZwA2yCWchBkVAgMBAAE=\n -----END PUBLIC KEY-----" , key .KeyVal .Public )
53
+ expectedPrivateKey := "-----BEGIN RSA PRIVATE KEY-----\n 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\n -----END RSA PRIVATE KEY-----"
54
+ assert .Equal (t , expectedPrivateKey , key .KeyVal .Private )
55
+ assert .Equal (t , RSAKeyScheme , key .Scheme )
56
+ assert .Equal (t , RSAKeyType , key .KeyType )
57
+ })
58
+
59
+ t .Run ("invalid path" , func (t * testing.T ) {
60
+ _ , err := LoadRSAPSSKeyFromFile (filepath .Join ("test-data" , "invalid" ))
61
+ assert .ErrorContains (t , err , "unable to load RSA key from file" )
62
+ })
63
+ }
64
+
33
65
func TestRSAPSSSignerVerifierSignAndVerify (t * testing.T ) {
34
66
t .Run ("using valid key" , func (t * testing.T ) {
35
67
key , err := LoadRSAPSSKeyFromFile (filepath .Join ("test-data" , "rsa-test-key" ))
@@ -93,7 +125,7 @@ func TestRSAPSSSignerVerifierWithDSSEEnvelope(t *testing.T) {
93
125
t .Error (err )
94
126
}
95
127
96
- assert .Equal (t , "966c5d84ba73ccded42eb473c939d77336e4def253ffaf6739f8e983ef73dad8 " , env .Signatures [0 ].KeyID )
128
+ assert .Equal (t , "4e8d20af09fcaed6c388a186427f94a5f7ff5591ec295f4aab2cff49ffe39e9b " , env .Signatures [0 ].KeyID )
97
129
envPayload , err := env .DecodeB64Payload ()
98
130
assert .Equal (t , payload , envPayload )
99
131
assert .Nil (t , err )
@@ -115,5 +147,47 @@ func TestRSAPSSSignerVerifierWithDSSEEnvelope(t *testing.T) {
115
147
116
148
acceptedKeys , err := ev .Verify (context .Background (), env )
117
149
assert .Nil (t , err )
118
- assert .Equal (t , "966c5d84ba73ccded42eb473c939d77336e4def253ffaf6739f8e983ef73dad8" , acceptedKeys [0 ].KeyID )
150
+ assert .Equal (t , "4e8d20af09fcaed6c388a186427f94a5f7ff5591ec295f4aab2cff49ffe39e9b" , acceptedKeys [0 ].KeyID )
151
+ }
152
+
153
+ func TestRSAPSSSignerVerifierWithMetablockFile (t * testing.T ) {
154
+ key , err := LoadRSAPSSKeyFromFile (filepath .Join ("test-data" , "rsa-test-key.pub" ))
155
+ if err != nil {
156
+ t .Fatal (err )
157
+ }
158
+
159
+ sv , err := NewRSAPSSSignerVerifierFromSSLibKey (key )
160
+ if err != nil {
161
+ t .Fatal (err )
162
+ }
163
+
164
+ metadataBytes , err := os .ReadFile (filepath .Join ("test-data" , "test-rsa.4e8d20af.link" ))
165
+ if err != nil {
166
+ t .Fatal (err )
167
+ }
168
+
169
+ mb := struct {
170
+ Signatures []struct {
171
+ KeyID string `json:"keyid"`
172
+ Sig string `json:"sig"`
173
+ } `json:"signatures"`
174
+ Signed any `json:"signed"`
175
+ }{}
176
+
177
+ if err := json .Unmarshal (metadataBytes , & mb ); err != nil {
178
+ t .Fatal (err )
179
+ }
180
+
181
+ assert .Equal (t , "8958e5be66ee4352880a531bd097d1727adcc78e66b4faeb4a2cd6ad073dcb84f9a34e8156af39a7144cb5cd925325a18ccd4f0b2f981d6ff82655a7d63210d36655c50a0bf24e4839c10430a040dd6189d04fabec90eae4314c75ae2d585da17a56aaf6755e613a3a6a471ad2eddbb24504848e34f9ac163660f8ab80d7701bfa1189578a59597b3809ee62a70a7cc9545cfa65e23018fa442a45279b9fcf9d80bc92df711bfcfe16e3eae1bcf61b3286c1f0bdda17bc28bfab5b736bdcac4a38e31db1d0e0f56a2853b1b451650305f040a3425c3be47125700e92ef82c5a91a040b5e70ab7f6ebbe037ae1a6835044b5699748037e2e39a55a420c41cd9fa6e16868776367e3620e7d28eb9d8a3d710bdc98d488df1a9947d2ec8400f3c6209e8ca587cbffa30ceb3be98105e03182aab1bbb3c4e2560d99f0b09c012df2271f273ac70a6abb185abe11d559b118dca616417fa9205e74ab58e89ffd8b965da304ae9dc9cf6ffac4838b7c5375d6c2057a61cb286f06ad3b02a49c3af6178" , mb .Signatures [0 ].Sig )
182
+ assert .Equal (t , sv .keyID , mb .Signatures [0 ].KeyID )
183
+
184
+ encodedBytes , err := cjson .EncodeCanonical (mb .Signed )
185
+ if err != nil {
186
+ t .Fatal (err )
187
+ }
188
+
189
+ decodedSig := hexDecode (t , mb .Signatures [0 ].Sig )
190
+
191
+ err = sv .Verify (context .Background (), encodedBytes , decodedSig )
192
+ assert .Nil (t , err )
119
193
}
0 commit comments