in pkg/internal/crypto/crypto_windows.go [129:166]
func hasPrivateKey(cert *CertContext) bool {
var ncryptKeyHandle uintptr
var dwKeySpec uint32
var fCallerFreeProvOrNCryptKey uint32
ret, _, err := syscall.Syscall6(
procCryptAcquireCertificatePrivateKey.Addr(),
6,
uintptr(unsafe.Pointer(cert)),
uintptr(0),
uintptr(0),
uintptr(unsafe.Pointer(&ncryptKeyHandle)),
uintptr(unsafe.Pointer(&dwKeySpec)),
uintptr(unsafe.Pointer(&fCallerFreeProvOrNCryptKey)))
if ret == 0 {
if err > 0 {
// If for some reason we can't retrieve the private key, move on
return false
}
}
// Figure out if we need to release the handle
if fCallerFreeProvOrNCryptKey != 0 {
if dwKeySpec == certNCryptKeySpec {
// We received an CERT_NCRYPT_KEY_SPEC
syscall.Syscall(
procNCryptFreeObject.Addr(),
1,
uintptr(ncryptKeyHandle),
0,
0)
} else {
handle := syscall.Handle(ncryptKeyHandle)
syscall.CryptReleaseContext(handle, 0)
}
}
return true
}