Ticket #65178: patch-bypass-sectrustevaluatewitherror.diff

File patch-bypass-sectrustevaluatewitherror.diff, 3.2 KB (added by aeiouaeiouaeiouaeiouaeiouaeiou, 17 months ago)
  • src/crypto/x509/internal/macos/security.go

    Backported from https://github.com/fancybits/go/compare/6432f144aef0...989d1b18ee4a
    import ( 
    1010        "errors"
    1111        "internal/abi"
    1212        "strconv"
     13        "strings"
     14        syscallpkg "syscall"
    1315        "unsafe"
    1416)
    1517
    var ErrNoTrustSettings = errors.New("no trust settings found") 
    8789
    8890const errSecNoTrustSettings = -25263
    8991
     92var missingSecTrustEvaluateWithError = false
     93
     94func init() {
     95        v, _ := syscallpkg.Sysctl("kern.osrelease")
     96        missingSecTrustEvaluateWithError = strings.HasPrefix(v, "11.") ||
     97                strings.HasPrefix(v, "12.") ||
     98                strings.HasPrefix(v, "13.") ||
     99                strings.HasPrefix(v, "14.") ||
     100                strings.HasPrefix(v, "15.") ||
     101                strings.HasPrefix(v, "16.")
     102}
     103
    90104//go:cgo_import_dynamic x509_SecTrustSettingsCopyCertificates SecTrustSettingsCopyCertificates "/System/Library/Frameworks/Security.framework/Versions/A/Security"
    91105
    92106func SecTrustSettingsCopyCertificates(domain SecTrustSettingsDomain) (certArray CFRef, err error) {
    func x509_SecTrustSetVerifyDate_trampoline() 
    174188
    175189//go:cgo_import_dynamic x509_SecTrustEvaluate SecTrustEvaluate "/System/Library/Frameworks/Security.framework/Versions/A/Security"
    176190
    177 func SecTrustEvaluate(trustObj CFRef) (CFRef, error) {
    178         var result CFRef
     191func SecTrustEvaluate(trustObj CFRef) (SecTrustResultType, error) {
     192        var result SecTrustResultType = SecTrustResultInvalid
    179193        ret := syscall(abi.FuncPCABI0(x509_SecTrustEvaluate_trampoline), uintptr(trustObj), uintptr(unsafe.Pointer(&result)), 0, 0, 0, 0)
    180194        if int32(ret) != 0 {
    181195                return 0, OSStatus{"SecTrustEvaluate", int32(ret)}
    182196        }
    183         return CFRef(result), nil
     197        return result, nil
    184198}
    185199func x509_SecTrustEvaluate_trampoline()
    186200
    func x509_SecTrustGetResult_trampoline() 
    200214//go:cgo_import_dynamic x509_SecTrustEvaluateWithError SecTrustEvaluateWithError "/System/Library/Frameworks/Security.framework/Versions/A/Security"
    201215
    202216func SecTrustEvaluateWithError(trustObj CFRef) (int, error) {
     217        if missingSecTrustEvaluateWithError {
     218                result, err := SecTrustEvaluate(trustObj)
     219                if err != nil {
     220                        return err
     221                }
     222                switch result {
     223                case SecTrustResultUnspecified, SecTrustResultProceed:
     224                        return nil
     225                case SecTrustResultRecoverableTrustFailure:
     226                        return errors.New("x509: macOS certificate verification result: recoverable trust failure")
     227                case SecTrustResultFatalTrustFailure:
     228                        return errors.New("x509: macOS certificate verification result: fatal trust failure")
     229                case SecTrustResultOtherError:
     230                        return errors.New("x509: macOS certificate verification result: other error")
     231                case SecTrustResultInvalid:
     232                        return errors.New("x509: macOS certificate verification result: invalid")
     233                case SecTrustResultDeny:
     234                        return errors.New("x509: macOS certificate verification result: denied")
     235                case SecTrustResultConfirm:
     236                        return errors.New("x509: macOS certificate verification result: confirmation required")
     237                default:
     238                        return errors.New("x509: macOS certificate verification result unknown")
     239                }
     240        }
    203241        var errRef CFRef
    204242        ret := syscall(abi.FuncPCABI0(x509_SecTrustEvaluateWithError_trampoline), uintptr(trustObj), uintptr(unsafe.Pointer(&errRef)), 0, 0, 0, 0)
    205243        if int32(ret) != 1 {