]> Cypherpunks repositories - gostls13.git/commitdiff
crypto/tls: cleanup certificate load on windows
authorAlex Brainman <alex.brainman@gmail.com>
Thu, 1 Dec 2011 17:38:00 +0000 (12:38 -0500)
committerAdam Langley <agl@golang.org>
Thu, 1 Dec 2011 17:38:00 +0000 (12:38 -0500)
- correct syscall.CertEnumCertificatesInStore so it returns error
- remove "reflect" dependency

R=hectorchu, agl, rsc
CC=golang-dev, krautz
https://golang.org/cl/5441052

src/pkg/crypto/tls/root_windows.go
src/pkg/syscall/syscall_windows.go
src/pkg/syscall/zsyscall_windows_386.go
src/pkg/syscall/zsyscall_windows_amd64.go
src/pkg/syscall/ztypes_windows.go

index 13073dcee78c453f4788acae5ac99d808929c3aa..319309ae6e7eb5a9ea74bdb1167f3377047cf6d4 100644 (file)
@@ -6,7 +6,6 @@ package tls
 
 import (
        "crypto/x509"
-       "reflect"
        "syscall"
        "unsafe"
 )
@@ -16,29 +15,23 @@ func loadStore(roots *x509.CertPool, name string) {
        if err != nil {
                return
        }
+       defer syscall.CertCloseStore(store, 0)
 
        var cert *syscall.CertContext
        for {
-               cert = syscall.CertEnumCertificatesInStore(store, cert)
-               if cert == nil {
-                       break
+               cert, err = syscall.CertEnumCertificatesInStore(store, cert)
+               if err != nil {
+                       return
                }
 
-               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)
+               buf := (*[1 << 20]byte)(unsafe.Pointer(cert.EncodedCert))[:]
+               // ParseCertificate requires its own copy of certificate data to keep.
+               buf2 := make([]byte, cert.Length)
+               copy(buf2, buf)
+               if c, err := x509.ParseCertificate(buf2); err == nil {
+                       roots.AddCert(c)
                }
        }
-
-       syscall.CertCloseStore(store, 0)
 }
 
 func initDefaultRoots() {
index 5c43f0757b42a589adc59c54988e9e2ca4d254ff..305e7a4b4a945aea4c3389c0ba6ff701fd92eccb 100644 (file)
@@ -152,7 +152,7 @@ func NewCallback(fn interface{}) uintptr
 //sys  TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile
 //sys  ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW
 //sys  CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW
-//sys  CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext) = crypt32.CertEnumCertificatesInStore
+//sys  CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore
 //sys  CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore
 //sys  RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno uintptr) = advapi32.RegOpenKeyExW
 //sys  RegCloseKey(key Handle) (regerrno uintptr) = advapi32.RegCloseKey
index 0e202db69c623e33c2eb3c657c9c05918dde1cc4..25fa9c48b520f7bab4f35d1963d7e4a784acfce7 100644 (file)
@@ -969,9 +969,16 @@ func CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) {
        return
 }
 
-func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext) {
-       r0, _, _ := Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0)
+func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) {
+       r0, _, e1 := Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0)
        context = (*CertContext)(unsafe.Pointer(r0))
+       if context == nil {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = EINVAL
+               }
+       }
        return
 }
 
index afe8ba41b2fb02da7614f95eeefe26afc13e72f5..bba74623bdeebc84e1e0be4828e367638ddee6d1 100644 (file)
@@ -969,9 +969,16 @@ func CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) {
        return
 }
 
-func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext) {
-       r0, _, _ := Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0)
+func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) {
+       r0, _, e1 := Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0)
        context = (*CertContext)(unsafe.Pointer(r0))
+       if context == nil {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = EINVAL
+               }
+       }
        return
 }
 
index 5731a0a831b49ac7d4d1e37556e71f9b36185f02..cfc180f70123b9d1abf0d231eacadc61189c51b8 100644 (file)
@@ -659,7 +659,7 @@ type MibIfRow struct {
 
 type CertContext struct {
        EncodingType uint32
-       EncodedCert  uintptr
+       EncodedCert  *byte
        Length       uint32
        CertInfo     uintptr
        Store        Handle