@@ -3,12 +3,17 @@ package cli
3
3
import (
4
4
"crypto/x509"
5
5
"fmt"
6
+ "io"
6
7
"os"
8
+ "strings"
7
9
8
10
cms "github.com/github/smimesign/ietf-cms"
9
11
"github.com/spf13/cobra"
10
12
"golang.org/x/xerrors"
11
13
14
+ "cdr.dev/slog"
15
+ "github.com/coder/code-marketplace/storage/easyzip"
16
+
12
17
"github.com/coder/code-marketplace/extensionsign"
13
18
"github.com/coder/code-marketplace/extensionsign/verify"
14
19
)
@@ -20,15 +25,22 @@ func signature() *cobra.Command {
20
25
Hidden : true , // Debugging tools
21
26
Aliases : []string {"sig" , "sigs" , "signatures" },
22
27
}
28
+
23
29
cmd .AddCommand (compareSignatureSigZips (), verifyCmd (), decodeSigCmd ())
24
30
return cmd
25
31
}
26
32
27
33
func decodeSigCmd () * cobra.Command {
28
34
cmd := & cobra.Command {
29
- Use : "decode" ,
30
- Args : cobra .ExactArgs (1 ),
35
+
36
+ Use : "decode" ,
37
+ Short : "Decode a signature archive." ,
38
+ Args : cobra .ExactArgs (1 ),
31
39
RunE : func (cmd * cobra.Command , args []string ) error {
40
+ logger := cmdLogger (cmd )
41
+ ctx := cmd .Context ()
42
+ logger .Info (ctx , fmt .Sprintf ("Decoding %q" , args [0 ]))
43
+
32
44
data , err := os .ReadFile (args [0 ])
33
45
if err != nil {
34
46
return xerrors .Errorf ("read %q: %w" , args [0 ], err )
@@ -39,6 +51,15 @@ func decodeSigCmd() *cobra.Command {
39
51
return xerrors .Errorf ("extract p7s: %w" , err )
40
52
}
41
53
54
+ detachedDataR , err := easyzip .GetZipFileReader (data , ".signature.manifest" )
55
+ if err != nil {
56
+ return xerrors .Errorf ("get manifest: %w" , err )
57
+ }
58
+ detachedData , err := io .ReadAll (detachedDataR )
59
+ if err != nil {
60
+ return xerrors .Errorf ("read manifest: %w" , err )
61
+ }
62
+
42
63
sd , err := cms .ParseSignedData (signed )
43
64
if err != nil {
44
65
return xerrors .Errorf ("new signed data: %w" , err )
@@ -57,18 +78,51 @@ func decodeSigCmd() *cobra.Command {
57
78
}
58
79
fmt .Println ("Data:" , len (sdData ))
59
80
60
- vcerts , err := sd .Verify (x509.VerifyOptions {})
81
+ var verifyErr error
82
+ var vcerts [][][]* x509.Certificate
83
+
84
+ sys , err := x509 .SystemCertPool ()
61
85
if err != nil {
62
- return xerrors .Errorf ("verify: %w" , err )
86
+ return xerrors .Errorf ("system cert pool: %w" , err )
87
+ }
88
+ opts := x509.VerifyOptions {
89
+ Intermediates : sys ,
90
+ Roots : sys ,
91
+ }
92
+
93
+ if sd .IsDetached () {
94
+ vcerts , verifyErr = sd .VerifyDetached (detachedData , opts )
95
+ } else {
96
+ vcerts , verifyErr = sd .Verify (opts )
97
+ }
98
+ if verifyErr != nil {
99
+ logger .Fatal (ctx , "verify" , slog .Error (verifyErr ))
63
100
}
64
- var _ = vcerts
101
+
102
+ certChain := dimensions (vcerts )
103
+ fmt .Println ("Verified!" )
104
+ fmt .Println (certChain )
65
105
66
106
return nil
67
107
},
68
108
}
69
109
return cmd
70
110
}
71
111
112
+ func dimensions (chain [][][]* x509.Certificate ) string {
113
+ var str strings.Builder
114
+ for _ , top := range chain {
115
+ str .WriteString (fmt .Sprintf ("Chain, len=%d\n " , len (top )))
116
+ for _ , second := range top {
117
+ str .WriteString (fmt .Sprintf (" Certs len=%d\n " , len (second )))
118
+ for _ , cert := range second {
119
+ str .WriteString (fmt .Sprintf (" Cert: %s\n " , cert .Subject ))
120
+ }
121
+ }
122
+ }
123
+ return str .String ()
124
+ }
125
+
72
126
func verifyCmd () * cobra.Command {
73
127
cmd := & cobra.Command {
74
128
Use : "verify" ,
0 commit comments