| // Copyright 2011 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package tls |
| |
| import ( |
| "crypto/x509" |
| "reflect" |
| "syscall" |
| "unsafe" |
| ) |
| |
| func loadStore(roots *x509.CertPool, name string) { |
| store, errno := syscall.CertOpenSystemStore(syscall.InvalidHandle, syscall.StringToUTF16Ptr(name)) |
| if errno != 0 { |
| return |
| } |
| |
| var cert *syscall.CertContext |
| for { |
| cert = syscall.CertEnumCertificatesInStore(store, cert) |
| if cert == nil { |
| break |
| } |
| |
| var asn1Slice []byte |
| hdrp := (*reflect.SliceHeader)(unsafe.Pointer(&asn1Slice)) |
| hdrp.Data = cert.EncodedCert |
| hdrp.Len = int(cert.Length) |
| hdrp.Cap = int(cert.Length) |
| |
| buf := make([]byte, len(asn1Slice)) |
| copy(buf, asn1Slice) |
| |
| if cert, err := x509.ParseCertificate(buf); err == nil { |
| roots.AddCert(cert) |
| } |
| } |
| |
| syscall.CertCloseStore(store, 0) |
| } |
| |
| func initDefaultRoots() { |
| roots := x509.NewCertPool() |
| |
| // Roots |
| loadStore(roots, "ROOT") |
| |
| // Intermediates |
| loadStore(roots, "CA") |
| |
| varDefaultRoots = roots |
| } |