summaryrefslogtreecommitdiff
path: root/libgo/go/crypto/tls/root_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/crypto/tls/root_windows.go')
-rw-r--r--libgo/go/crypto/tls/root_windows.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/libgo/go/crypto/tls/root_windows.go b/libgo/go/crypto/tls/root_windows.go
new file mode 100644
index 00000000000..b8e27a9a5d2
--- /dev/null
+++ b/libgo/go/crypto/tls/root_windows.go
@@ -0,0 +1,54 @@
+// 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
+}