github.com/gidoBOSSftw5731/go/src@v0.0.0-20210226122457-d24b0edbf019/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  	"strconv"
    13  	"unsafe"
    14  )
    15  
    16  // Security.framework linker flags for the external linker. See Issue 42459.
    17  //go:cgo_ldflag "-framework"
    18  //go:cgo_ldflag "Security"
    19  
    20  // Based on https://opensource.apple.com/source/Security/Security-59306.41.2/base/Security.h
    21  
    22  type SecTrustSettingsResult int32
    23  
    24  const (
    25  	SecTrustSettingsResultInvalid SecTrustSettingsResult = iota
    26  	SecTrustSettingsResultTrustRoot
    27  	SecTrustSettingsResultTrustAsRoot
    28  	SecTrustSettingsResultDeny
    29  	SecTrustSettingsResultUnspecified
    30  )
    31  
    32  type SecTrustSettingsDomain int32
    33  
    34  const (
    35  	SecTrustSettingsDomainUser SecTrustSettingsDomain = iota
    36  	SecTrustSettingsDomainAdmin
    37  	SecTrustSettingsDomainSystem
    38  )
    39  
    40  type OSStatus struct {
    41  	call   string
    42  	status int32
    43  }
    44  
    45  func (s OSStatus) Error() string {
    46  	return s.call + " error: " + strconv.Itoa(int(s.status))
    47  }
    48  
    49  // Dictionary keys are defined as build-time strings with CFSTR, but the Go
    50  // linker's internal linking mode can't handle CFSTR relocations. Create our
    51  // own dynamic strings instead and just never release them.
    52  //
    53  // Note that this might be the only thing that can break over time if
    54  // these values change, as the ABI arguably requires using the strings
    55  // pointed to by the symbols, not values that happen to be equal to them.
    56  
    57  var SecTrustSettingsResultKey = StringToCFString("kSecTrustSettingsResult")
    58  var SecTrustSettingsPolicy = StringToCFString("kSecTrustSettingsPolicy")
    59  var SecTrustSettingsPolicyString = StringToCFString("kSecTrustSettingsPolicyString")
    60  var SecPolicyOid = StringToCFString("SecPolicyOid")
    61  var SecPolicyAppleSSL = StringToCFString("1.2.840.113635.100.1.3") // defined by POLICYMACRO
    62  
    63  var ErrNoTrustSettings = errors.New("no trust settings found")
    64  
    65  const errSecNoTrustSettings = -25263
    66  
    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:cgo_import_dynamic x509_SecItemExport SecItemExport "/System/Library/Frameworks/Security.framework/Versions/A/Security"
    84  
    85  func SecItemExport(cert CFRef) (data CFRef, err error) {
    86  	ret := syscall(funcPC(x509_SecItemExport_trampoline), uintptr(cert), uintptr(kSecFormatX509Cert),
    87  		0 /* flags */, 0 /* keyParams */, uintptr(unsafe.Pointer(&data)), 0)
    88  	if ret != 0 {
    89  		return 0, OSStatus{"SecItemExport", int32(ret)}
    90  	}
    91  	return data, nil
    92  }
    93  func x509_SecItemExport_trampoline()
    94  
    95  const errSecItemNotFound = -25300
    96  
    97  //go:cgo_import_dynamic x509_SecTrustSettingsCopyTrustSettings SecTrustSettingsCopyTrustSettings "/System/Library/Frameworks/Security.framework/Versions/A/Security"
    98  
    99  func SecTrustSettingsCopyTrustSettings(cert CFRef, domain SecTrustSettingsDomain) (trustSettings CFRef, err error) {
   100  	ret := syscall(funcPC(x509_SecTrustSettingsCopyTrustSettings_trampoline), uintptr(cert), uintptr(domain),
   101  		uintptr(unsafe.Pointer(&trustSettings)), 0, 0, 0)
   102  	if int32(ret) == errSecItemNotFound {
   103  		return 0, ErrNoTrustSettings
   104  	} else if ret != 0 {
   105  		return 0, OSStatus{"SecTrustSettingsCopyTrustSettings", int32(ret)}
   106  	}
   107  	return trustSettings, nil
   108  }
   109  func x509_SecTrustSettingsCopyTrustSettings_trampoline()
   110  
   111  //go:cgo_import_dynamic x509_SecPolicyCopyProperties SecPolicyCopyProperties "/System/Library/Frameworks/Security.framework/Versions/A/Security"
   112  
   113  func SecPolicyCopyProperties(policy CFRef) CFRef {
   114  	ret := syscall(funcPC(x509_SecPolicyCopyProperties_trampoline), uintptr(policy), 0, 0, 0, 0, 0)
   115  	return CFRef(ret)
   116  }
   117  func x509_SecPolicyCopyProperties_trampoline()