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