github.com/geraldss/go/src@v0.0.0-20210511222824-ac7d0ebfc235/crypto/x509/internal/macos/security.go (about) 1 // Copyright 2020 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build darwin,!ios 6 7 package macOS 8 9 import ( 10 "errors" 11 "strconv" 12 "unsafe" 13 ) 14 15 // Security.framework linker flags for the external linker. See Issue 42459. 16 //go:cgo_ldflag "-framework" 17 //go:cgo_ldflag "Security" 18 19 // Based on https://opensource.apple.com/source/Security/Security-59306.41.2/base/Security.h 20 21 type SecTrustSettingsResult int32 22 23 const ( 24 SecTrustSettingsResultInvalid SecTrustSettingsResult = iota 25 SecTrustSettingsResultTrustRoot 26 SecTrustSettingsResultTrustAsRoot 27 SecTrustSettingsResultDeny 28 SecTrustSettingsResultUnspecified 29 ) 30 31 type SecTrustSettingsDomain int32 32 33 const ( 34 SecTrustSettingsDomainUser SecTrustSettingsDomain = iota 35 SecTrustSettingsDomainAdmin 36 SecTrustSettingsDomainSystem 37 ) 38 39 type OSStatus struct { 40 call string 41 status int32 42 } 43 44 func (s OSStatus) Error() string { 45 return s.call + " error: " + strconv.Itoa(int(s.status)) 46 } 47 48 // Dictionary keys are defined as build-time strings with CFSTR, but the Go 49 // linker's internal linking mode can't handle CFSTR relocations. Create our 50 // own dynamic strings instead and just never release them. 51 // 52 // Note that this might be the only thing that can break over time if 53 // these values change, as the ABI arguably requires using the strings 54 // pointed to by the symbols, not values that happen to be equal to them. 55 56 var SecTrustSettingsResultKey = StringToCFString("kSecTrustSettingsResult") 57 var SecTrustSettingsPolicy = StringToCFString("kSecTrustSettingsPolicy") 58 var SecTrustSettingsPolicyString = StringToCFString("kSecTrustSettingsPolicyString") 59 var SecPolicyOid = StringToCFString("SecPolicyOid") 60 var SecPolicyAppleSSL = StringToCFString("1.2.840.113635.100.1.3") // defined by POLICYMACRO 61 62 var ErrNoTrustSettings = errors.New("no trust settings found") 63 64 const errSecNoTrustSettings = -25263 65 66 //go:linkname x509_SecTrustSettingsCopyCertificates x509_SecTrustSettingsCopyCertificates 67 //go:cgo_import_dynamic x509_SecTrustSettingsCopyCertificates SecTrustSettingsCopyCertificates "/System/Library/Frameworks/Security.framework/Versions/A/Security" 68 69 func SecTrustSettingsCopyCertificates(domain SecTrustSettingsDomain) (certArray CFRef, err error) { 70 ret := syscall(funcPC(x509_SecTrustSettingsCopyCertificates_trampoline), uintptr(domain), 71 uintptr(unsafe.Pointer(&certArray)), 0, 0, 0, 0) 72 if int32(ret) == errSecNoTrustSettings { 73 return 0, ErrNoTrustSettings 74 } else if ret != 0 { 75 return 0, OSStatus{"SecTrustSettingsCopyCertificates", int32(ret)} 76 } 77 return certArray, nil 78 } 79 func x509_SecTrustSettingsCopyCertificates_trampoline() 80 81 const kSecFormatX509Cert int32 = 9 82 83 //go:linkname x509_SecItemExport x509_SecItemExport 84 //go:cgo_import_dynamic x509_SecItemExport SecItemExport "/System/Library/Frameworks/Security.framework/Versions/A/Security" 85 86 func SecItemExport(cert CFRef) (data CFRef, err error) { 87 ret := syscall(funcPC(x509_SecItemExport_trampoline), uintptr(cert), uintptr(kSecFormatX509Cert), 88 0 /* flags */, 0 /* keyParams */, uintptr(unsafe.Pointer(&data)), 0) 89 if ret != 0 { 90 return 0, OSStatus{"SecItemExport", int32(ret)} 91 } 92 return data, nil 93 } 94 func x509_SecItemExport_trampoline() 95 96 const errSecItemNotFound = -25300 97 98 //go:linkname x509_SecTrustSettingsCopyTrustSettings x509_SecTrustSettingsCopyTrustSettings 99 //go:cgo_import_dynamic x509_SecTrustSettingsCopyTrustSettings SecTrustSettingsCopyTrustSettings "/System/Library/Frameworks/Security.framework/Versions/A/Security" 100 101 func SecTrustSettingsCopyTrustSettings(cert CFRef, domain SecTrustSettingsDomain) (trustSettings CFRef, err error) { 102 ret := syscall(funcPC(x509_SecTrustSettingsCopyTrustSettings_trampoline), uintptr(cert), uintptr(domain), 103 uintptr(unsafe.Pointer(&trustSettings)), 0, 0, 0) 104 if int32(ret) == errSecItemNotFound { 105 return 0, ErrNoTrustSettings 106 } else if ret != 0 { 107 return 0, OSStatus{"SecTrustSettingsCopyTrustSettings", int32(ret)} 108 } 109 return trustSettings, nil 110 } 111 func x509_SecTrustSettingsCopyTrustSettings_trampoline() 112 113 //go:linkname x509_SecPolicyCopyProperties x509_SecPolicyCopyProperties 114 //go:cgo_import_dynamic x509_SecPolicyCopyProperties SecPolicyCopyProperties "/System/Library/Frameworks/Security.framework/Versions/A/Security" 115 116 func SecPolicyCopyProperties(policy CFRef) CFRef { 117 ret := syscall(funcPC(x509_SecPolicyCopyProperties_trampoline), uintptr(policy), 0, 0, 0, 0, 0) 118 return CFRef(ret) 119 } 120 func x509_SecPolicyCopyProperties_trampoline()