Skip to content

Commit 6027b21

Browse files
crypto/x509/internal/macos: use APIs available on ios
Use SecCertificateCopyData instead of SecItemExport, which is only available on macOS. Updates #49616 Change-Id: Ieda33894930d23c6dab6112ee18120f8a440083b Reviewed-on: https://go-review.googlesource.com/c/go/+/364554 Trust: Roland Shoemaker <roland@golang.org> Run-TryBot: Roland Shoemaker <roland@golang.org> Reviewed-by: Bryan C. Mills <bcmills@google.com> Reviewed-by: Filippo Valsorda <filippo@golang.org>
1 parent ba9f0f6 commit 6027b21

File tree

3 files changed

+17
-21
lines changed

3 files changed

+17
-21
lines changed

src/crypto/x509/internal/macos/security.go

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -92,20 +92,6 @@ func SecTrustSettingsCopyCertificates(domain SecTrustSettingsDomain) (certArray
9292
}
9393
func x509_SecTrustSettingsCopyCertificates_trampoline()
9494

95-
const kSecFormatX509Cert int32 = 9
96-
97-
//go:cgo_import_dynamic x509_SecItemExport SecItemExport "/System/Library/Frameworks/Security.framework/Versions/A/Security"
98-
99-
func SecItemExport(cert CFRef) (data CFRef, err error) {
100-
ret := syscall(abi.FuncPCABI0(x509_SecItemExport_trampoline), uintptr(cert), uintptr(kSecFormatX509Cert),
101-
0 /* flags */, 0 /* keyParams */, uintptr(unsafe.Pointer(&data)), 0)
102-
if ret != 0 {
103-
return 0, OSStatus{"SecItemExport", int32(ret)}
104-
}
105-
return data, nil
106-
}
107-
func x509_SecItemExport_trampoline()
108-
10995
const errSecItemNotFound = -25300
11096

11197
//go:cgo_import_dynamic x509_SecTrustSettingsCopyTrustSettings SecTrustSettingsCopyTrustSettings "/System/Library/Frameworks/Security.framework/Versions/A/Security"
@@ -233,3 +219,16 @@ func SecTrustGetCertificateAtIndex(trustObj CFRef, i int) CFRef {
233219
return CFRef(ret)
234220
}
235221
func x509_SecTrustGetCertificateAtIndex_trampoline()
222+
223+
//go:cgo_import_dynamic x509_SecCertificateCopyData SecCertificateCopyData "/System/Library/Frameworks/Security.framework/Versions/A/Security"
224+
225+
func SecCertificateCopyData(cert CFRef) ([]byte, error) {
226+
ret := syscall(abi.FuncPCABI0(x509_SecCertificateCopyData_trampoline), uintptr(cert), 0, 0, 0, 0, 0)
227+
if ret == 0 {
228+
return nil, errors.New("x509: invalid certificate object")
229+
}
230+
b := CFDataToSlice(CFRef(ret))
231+
CFRelease(CFRef(ret))
232+
return b, nil
233+
}
234+
func x509_SecCertificateCopyData_trampoline()

src/crypto/x509/internal/macos/security.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111

1212
TEXT ·x509_SecTrustSettingsCopyCertificates_trampoline(SB),NOSPLIT,$0-0
1313
JMP x509_SecTrustSettingsCopyCertificates(SB)
14-
TEXT ·x509_SecItemExport_trampoline(SB),NOSPLIT,$0-0
15-
JMP x509_SecItemExport(SB)
1614
TEXT ·x509_SecTrustSettingsCopyTrustSettings_trampoline(SB),NOSPLIT,$0-0
1715
JMP x509_SecTrustSettingsCopyTrustSettings(SB)
1816
TEXT ·x509_SecPolicyCopyProperties_trampoline(SB),NOSPLIT,$0-0
@@ -35,3 +33,5 @@ TEXT ·x509_SecTrustGetCertificateCount_trampoline(SB),NOSPLIT,$0-0
3533
JMP x509_SecTrustGetCertificateCount(SB)
3634
TEXT ·x509_SecTrustGetCertificateAtIndex_trampoline(SB),NOSPLIT,$0-0
3735
JMP x509_SecTrustGetCertificateAtIndex(SB)
36+
TEXT ·x509_SecCertificateCopyData_trampoline(SB),NOSPLIT,$0-0
37+
JMP x509_SecCertificateCopyData(SB)

src/crypto/x509/root_darwin.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,11 @@ func (c *Certificate) systemVerify(opts *VerifyOptions) (chains [][]*Certificate
9696

9797
// exportCertificate returns a *Certificate for a SecCertificateRef.
9898
func exportCertificate(cert macOS.CFRef) (*Certificate, error) {
99-
data, err := macOS.SecItemExport(cert)
99+
data, err := macOS.SecCertificateCopyData(cert)
100100
if err != nil {
101101
return nil, err
102102
}
103-
defer macOS.CFRelease(data)
104-
der := macOS.CFDataToSlice(data)
105-
106-
return ParseCertificate(der)
103+
return ParseCertificate(data)
107104
}
108105

109106
func loadSystemRoots() (*CertPool, error) {

0 commit comments

Comments
 (0)