package x509
import (
macOS
)
var debugDarwinRoots = strings.Contains(os.Getenv("GODEBUG"), "x509roots=1")
func ( *Certificate) ( *VerifyOptions) ( [][]*Certificate, error) {
return nil, nil
}
func () (*CertPool, error) {
var []*Certificate
:= make(map[string]bool)
for , := range []macOS.SecTrustSettingsDomain{
macOS.SecTrustSettingsDomainUser,
macOS.SecTrustSettingsDomainAdmin,
macOS.SecTrustSettingsDomainSystem,
} {
, := macOS.SecTrustSettingsCopyCertificates()
if == macOS.ErrNoTrustSettings {
continue
} else if != nil {
return nil,
}
defer macOS.CFRelease()
for := 0; < macOS.CFArrayGetCount(); ++ {
:= macOS.CFArrayGetValueAtIndex(, )
, := exportCertificate()
if != nil {
if debugDarwinRoots {
fmt.Fprintf(os.Stderr, "crypto/x509: domain %d, certificate #%d: %v\n", , , )
}
continue
}
var macOS.SecTrustSettingsResult
if == macOS.SecTrustSettingsDomainSystem {
= macOS.SecTrustSettingsResultTrustRoot
} else {
, = sslTrustSettingsResult()
if != nil {
if debugDarwinRoots {
fmt.Fprintf(os.Stderr, "crypto/x509: trust settings for %v: %v\n", .Subject, )
}
continue
}
if debugDarwinRoots {
fmt.Fprintf(os.Stderr, "crypto/x509: trust settings for %v: %d\n", .Subject, )
}
}
switch {
case macOS.SecTrustSettingsResultTrustRoot:
if isRootCertificate() {
= append(, )
}
case macOS.SecTrustSettingsResultTrustAsRoot:
if !isRootCertificate() {
= append(, )
}
case macOS.SecTrustSettingsResultDeny:
[string(.Raw)] = true
case macOS.SecTrustSettingsResultUnspecified:
default:
if debugDarwinRoots {
fmt.Fprintf(os.Stderr, "crypto/x509: unknown trust setting for %v: %d\n", .Subject, )
}
}
}
}
:= NewCertPool()
for , := range {
if ![string(.Raw)] {
.AddCert()
}
}
return , nil
}
func ( macOS.CFRef) (*Certificate, error) {
, := macOS.SecItemExport()
if != nil {
return nil,
}
defer macOS.CFRelease()
:= macOS.CFDataToSlice()
return ParseCertificate()
}
func ( *Certificate) bool {
return bytes.Equal(.RawSubject, .RawIssuer)
}
func ( macOS.CFRef) (macOS.SecTrustSettingsResult, error) {
, := macOS.SecTrustSettingsCopyTrustSettings(, macOS.SecTrustSettingsDomainUser)
if != nil || == 0 {
if debugDarwinRoots && != macOS.ErrNoTrustSettings {
fmt.Fprintf(os.Stderr, "crypto/x509: SecTrustSettingsCopyTrustSettings for SecTrustSettingsDomainUser failed: %s\n", )
}
, = macOS.SecTrustSettingsCopyTrustSettings(, macOS.SecTrustSettingsDomainAdmin)
}
if != nil || == 0 {
if debugDarwinRoots && != macOS.ErrNoTrustSettings {
fmt.Fprintf(os.Stderr, "crypto/x509: SecTrustSettingsCopyTrustSettings for SecTrustSettingsDomainAdmin failed: %s\n", )
}
return macOS.SecTrustSettingsResultUnspecified, nil
}
defer macOS.CFRelease()
if macOS.CFArrayGetCount() == 0 {
return macOS.SecTrustSettingsResultTrustRoot, nil
}
:= func( macOS.CFRef) bool {
:= macOS.SecPolicyCopyProperties()
defer macOS.CFRelease()
if , := macOS.CFDictionaryGetValueIfPresent(, macOS.SecPolicyOid); {
return macOS.CFEqual(, macOS.CFRef(macOS.SecPolicyAppleSSL))
}
return false
}
for := 0; < macOS.CFArrayGetCount(); ++ {
:= macOS.CFArrayGetValueAtIndex(, )
if , := macOS.CFDictionaryGetValueIfPresent(, macOS.SecTrustSettingsPolicy); {
if !() {
continue
}
}
if , := macOS.CFDictionaryGetValueIfPresent(, macOS.SecTrustSettingsPolicyString); {
continue
}
, := macOS.CFDictionaryGetValueIfPresent(, macOS.SecTrustSettingsResultKey)
if ! {
return macOS.SecTrustSettingsResultTrustRoot, nil
}
, := macOS.CFNumberGetValue()
if != nil {
return 0,
}
switch := macOS.SecTrustSettingsResult(); {
case macOS.SecTrustSettingsResultTrustRoot,
macOS.SecTrustSettingsResultTrustAsRoot,
macOS.SecTrustSettingsResultDeny:
return , nil
}
}
return macOS.SecTrustSettingsResultUnspecified, nil
}