-
Notifications
You must be signed in to change notification settings - Fork 39
Expand file tree
/
Copy pathpkijs.go
More file actions
135 lines (113 loc) · 3.37 KB
/
Copy pathpkijs.go
File metadata and controls
135 lines (113 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package impltests
import (
"encoding/base64"
"os"
"os/exec"
"path/filepath"
"strings"
"time"
test_executor "github.com/Netflix/bettertls/test-suites/test-executor"
)
type PkijsRunner struct {
tmpDir string
version string
}
func (p *PkijsRunner) Name() string {
return "pkijs"
}
func (p *PkijsRunner) Initialize() error {
tmpDir, err := os.MkdirTemp("", "")
if err != nil {
return err
}
scriptPath := filepath.Join(tmpDir, "pkijs_test.js")
err = os.WriteFile(scriptPath, []byte(`
const asn1js = require('asn1js');
const pkijs = require('pkijs');
const { Crypto } = require('@peculiar/webcrypto');
const webcrypto = new Crypto();
pkijs.setEngine("newEngine", webcrypto, new pkijs.CryptoEngine({ name: "", crypto: webcrypto, subtle: webcrypto.subtle }));
function b64StringToCert(b64string) {
let certificateBuffer = Buffer.from(b64string, 'base64');
const asn1 = asn1js.fromBER(new Uint8Array(certificateBuffer).buffer);
return new pkijs.Certificate({schema: asn1.result});
}
function verifyCertificate(trustRootAsB64String, certsAsArrayOfB64Strings) {
const certificates = certsAsArrayOfB64Strings.map(b64StringToCert).reverse();
const trustedCerts = [b64StringToCert(trustRootAsB64String)];
const certChainVerificationEngine = new pkijs.CertificateChainValidationEngine({
checkDate: new Date(),
trustedCerts: trustedCerts,
certs: certificates,
});
return certChainVerificationEngine.verify();
}
let trustRootAsB64String = process.argv[2];
let certsAsArrayOfB64Strings = process.argv[3].split(",");
let result = verifyCertificate(trustRootAsB64String, certsAsArrayOfB64Strings);
result.then(function(output) {
if (output.result) {
process.exit(0);
} else {
process.exit(1);
}
}).catch(function(err) {
console.log("Error: " + err);
process.exit(1);
})
`), 0644)
if err != nil {
return err
}
cmd := exec.Command("npm", "install", "pkijs", "@peculiar/webcrypto")
cmd.Dir = tmpDir
err = cmd.Run()
if err != nil {
return err
}
npmVersion, err := execAndCaptureInDir(tmpDir, "npm", "version")
if err != nil {
return err
}
modulesVersions, err := execAndCaptureInDir(tmpDir, "npm", "list")
if err != nil {
return err
}
p.version = npmVersion + "\n" + modulesVersions
p.tmpDir = tmpDir
return nil
}
func (p *PkijsRunner) Close() error {
if p.tmpDir != "" {
return os.RemoveAll(p.tmpDir)
}
return nil
}
func (p *PkijsRunner) GetVersion() string {
return p.version
}
func (p *PkijsRunner) RunTests(ctx *test_executor.ExecutionContext) (map[string]*test_executor.SuiteTestResults, error) {
suites, err := test_executor.BuildTestSuites()
if err != nil {
return nil, err
}
scriptPath := filepath.Join(p.tmpDir, "pkijs_test.js")
return test_executor.ExecuteAllTestsLocal(ctx, suites, func(hostname string, certificates [][]byte) (bool, error) {
certsB64 := make([]string, 0, len(certificates))
for _, cert := range certificates {
certsB64 = append(certsB64, base64.StdEncoding.EncodeToString(cert))
}
cmdParts := []string{"node", scriptPath,
base64.StdEncoding.EncodeToString(suites.GetRootCert().Raw),
strings.Join(certsB64, ",")}
cmd := exec.Command(cmdParts[0], cmdParts[1:]...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Start()
if err != nil {
return false, err
}
err = cmdWaitWithTimeout(cmd, 5*time.Second)
return err == nil, nil
})
}