Skip to content

Commit c650c2d

Browse files
committed
crypto/x509: keep iOS certs compressed in memory, lazily uncompress as needed
This is the Go 1.15 re-do of: 51e4cb9 ed719f7 bb0583b
1 parent 03e02b0 commit c650c2d

File tree

7 files changed

+386
-221
lines changed

7 files changed

+386
-221
lines changed

src/crypto/x509/cert_pool.go

+11-8
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,9 @@ func (s *CertPool) AddCert(cert *Certificate) {
143143
if cert == nil {
144144
panic("adding nil Certificate to CertPool")
145145
}
146-
err := s.addCertFunc(sha256.Sum224(cert.Raw), string(cert.RawSubject), string(cert.SubjectKeyId), func() (*Certificate, error) {
146+
s.addCertFunc(sha256.Sum224(cert.Raw), string(cert.RawSubject), string(cert.SubjectKeyId), func() (*Certificate, error) {
147147
return cert, nil
148148
})
149-
if err != nil {
150-
panic(err.Error())
151-
}
152149
}
153150

154151
// addCertFunc adds metadata about a certificate to a pool, along with
@@ -157,25 +154,31 @@ func (s *CertPool) AddCert(cert *Certificate) {
157154
// The rawSubject is Certificate.RawSubject and must be non-empty.
158155
// The subjectKeyID is Certificate.SubjectKeyId and may be empty.
159156
// The getCert func may be called 0 or more times.
160-
func (s *CertPool) addCertFunc(rawSum224 sum224, rawSubject, subjectKeyID string, getCert func() (*Certificate, error)) error {
157+
func (s *CertPool) addCertFunc(rawSum224 sum224, rawSubject, subjectKeyID string, getCert func() (*Certificate, error)) {
161158
if getCert == nil {
162159
panic("getCert can't be nil")
163160
}
164161

165162
// Check that the certificate isn't being added twice.
166163
if s.haveSum[rawSum224] {
167-
return nil
164+
return
168165
}
169-
n := len(s.getCert)
170166
s.haveSum[rawSum224] = true
167+
s.addCertFuncNotDup(rawSubject, subjectKeyID, getCert)
168+
}
169+
170+
func (s *CertPool) addCertFuncNotDup(rawSubject, subjectKeyID string, getCert func() (*Certificate, error)) {
171+
if getCert == nil {
172+
panic("getCert can't be nil")
173+
}
174+
n := len(s.getCert)
171175
s.getCert = append(s.getCert, getCert)
172176

173177
if subjectKeyID != "" {
174178
s.bySubjectKeyId[subjectKeyID] = append(s.bySubjectKeyId[subjectKeyID], n)
175179
}
176180
s.byName[rawSubject] = append(s.byName[rawSubject], n)
177181
s.rawSubjects = append(s.rawSubjects, []byte(rawSubject))
178-
return nil
179182
}
180183

181184
// AppendCertsFromPEM attempts to parse a series of PEM encoded certificates.

src/crypto/x509/root_darwin_arm64.go renamed to src/crypto/x509/certs.pem

-23
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,3 @@
1-
// Code generated by root_darwin_arm64_gen.go; DO NOT EDIT.
2-
3-
//go:generate go run root_darwin_arm64_gen.go -output root_darwin_arm64.go
4-
5-
// +build !x509omitbundledroots
6-
7-
package x509
8-
9-
func (c *Certificate) systemVerify(opts *VerifyOptions) (chains [][]*Certificate, err error) {
10-
return nil, nil
11-
}
12-
13-
// loadSystemRootsWithCgo is not available on iOS.
14-
var loadSystemRootsWithCgo func() (*CertPool, error)
15-
16-
func loadSystemRoots() (*CertPool, error) {
17-
p := NewCertPool()
18-
p.AppendCertsFromPEM([]byte(systemRootsPEM))
19-
return p, nil
20-
}
21-
22-
const systemRootsPEM = `
231
-----BEGIN CERTIFICATE-----
242
MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
253
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
@@ -4313,4 +4291,3 @@ IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
43134291
i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
43144292
O+7ETPTsJ3xCwnR8gooJybQDJbw=
43154293
-----END CERTIFICATE-----
4316-
`

src/crypto/x509/root_darwin_arm64_gen.go

-188
This file was deleted.

src/crypto/x509/root_darwin_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ func TestSystemRoots(t *testing.T) {
4848
c := sysRoots.mustCert(i)
4949
sysPool[string(c.Raw)] = c
5050
}
51-
for i := 0; i < execRoots.len(); i++ {
52-
c := execRoots.mustCert(i)
51+
for i := 0; i < cgoRoots.len(); i++ {
52+
c := cgoRoots.mustCert(i)
5353
if _, ok := sysPool[string(c.Raw)]; ok {
5454
delete(sysPool, string(c.Raw))
5555
} else {

0 commit comments

Comments
 (0)