mirror of
https://github.com/golang/sys.git
synced 2026-02-09 04:06:04 +03:00
add CertFindCertificateInStore CertFindChainInStore CryptAcquireCertificatePrivateKey
This commit is contained in:
@@ -272,6 +272,9 @@ func NewCallbackCDecl(fn interface{}) uintptr {
|
||||
//sys CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext
|
||||
//sys CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext
|
||||
//sys CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy
|
||||
//sys CertFindCertificateInStore(store Handle, certEncodingType uint32, findFlags uint32, findType uint32, findPara unsafe.Pointer, prevCertContext *CertContext) (cert *CertContext, err error) [failretval==nil] = crypt32.CertFindCertificateInStore
|
||||
//sys CertFindChainInStore(store Handle, certEncodingType uint32, findFlags uint32, findType uint32, findPara unsafe.Pointer, prevChainContext *CertChainContext) (certchain *CertChainContext, err error) [failretval==nil] = crypt32.CertFindChainInStore
|
||||
//sys CryptAcquireCertificatePrivateKey(cert *CertContext, flags uint32, parameters unsafe.Pointer, cryptProvOrNCryptKey *Handle, keySpec *uint32, callerFreeProvOrNCryptKey *bool) (err error) = crypt32.CryptAcquireCertificatePrivateKey
|
||||
//sys RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW
|
||||
//sys RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey
|
||||
//sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW
|
||||
|
||||
@@ -412,6 +412,89 @@ const (
|
||||
CERT_TRUST_IS_CA_TRUSTED = 0x00004000
|
||||
CERT_TRUST_IS_COMPLEX_CHAIN = 0x00010000
|
||||
|
||||
/* Certificate Information Flags */
|
||||
CERT_INFO_VERSION_FLAG = 1
|
||||
CERT_INFO_SERIAL_NUMBER_FLAG = 2
|
||||
CERT_INFO_SIGNATURE_ALGORITHM_FLAG = 3
|
||||
CERT_INFO_ISSUER_FLAG = 4
|
||||
CERT_INFO_NOT_BEFORE_FLAG = 5
|
||||
CERT_INFO_NOT_AFTER_FLAG = 6
|
||||
CERT_INFO_SUBJECT_FLAG = 7
|
||||
CERT_INFO_SUBJECT_PUBLIC_KEY_INFO_FLAG = 8
|
||||
CERT_INFO_ISSUER_UNIQUE_ID_FLAG = 9
|
||||
CERT_INFO_SUBJECT_UNIQUE_ID_FLAG = 10
|
||||
CERT_INFO_EXTENSION_FLAG = 11
|
||||
|
||||
/* dwFindType for CertFindCertificateInStore */
|
||||
CERT_COMPARE_MASK = 0xFFFF
|
||||
CERT_COMPARE_SHIFT = 16
|
||||
CERT_COMPARE_ANY = 0
|
||||
CERT_COMPARE_SHA1_HASH = 1
|
||||
CERT_COMPARE_NAME = 2
|
||||
CERT_COMPARE_ATTR = 3
|
||||
CERT_COMPARE_MD5_HASH = 4
|
||||
CERT_COMPARE_PROPERTY = 5
|
||||
CERT_COMPARE_PUBLIC_KEY = 6
|
||||
CERT_COMPARE_HASH = CERT_COMPARE_SHA1_HASH
|
||||
CERT_COMPARE_NAME_STR_A = 7
|
||||
CERT_COMPARE_NAME_STR_W = 8
|
||||
CERT_COMPARE_KEY_SPEC = 9
|
||||
CERT_COMPARE_ENHKEY_USAGE = 10
|
||||
CERT_COMPARE_CTL_USAGE = CERT_COMPARE_ENHKEY_USAGE
|
||||
CERT_COMPARE_SUBJECT_CERT = 11
|
||||
CERT_COMPARE_ISSUER_OF = 12
|
||||
CERT_COMPARE_EXISTING = 13
|
||||
CERT_COMPARE_SIGNATURE_HASH = 14
|
||||
CERT_COMPARE_KEY_IDENTIFIER = 15
|
||||
CERT_COMPARE_CERT_ID = 16
|
||||
CERT_COMPARE_CROSS_CERT_DIST_POINTS = 17
|
||||
CERT_COMPARE_PUBKEY_MD5_HASH = 18
|
||||
CERT_COMPARE_SUBJECT_INFO_ACCESS = 19
|
||||
CERT_COMPARE_HASH_STR = 20
|
||||
CERT_COMPARE_HAS_PRIVATE_KEY = 21
|
||||
CERT_FIND_ANY = (CERT_COMPARE_ANY << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_SHA1_HASH = (CERT_COMPARE_SHA1_HASH << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_MD5_HASH = (CERT_COMPARE_MD5_HASH << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_SIGNATURE_HASH = (CERT_COMPARE_SIGNATURE_HASH << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_KEY_IDENTIFIER = (CERT_COMPARE_KEY_IDENTIFIER << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_HASH = CERT_FIND_SHA1_HASH
|
||||
CERT_FIND_PROPERTY = (CERT_COMPARE_PROPERTY << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_PUBLIC_KEY = (CERT_COMPARE_PUBLIC_KEY << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_SUBJECT_NAME = (CERT_COMPARE_NAME<<CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
|
||||
CERT_FIND_SUBJECT_ATTR = (CERT_COMPARE_ATTR<<CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
|
||||
CERT_FIND_ISSUER_NAME = (CERT_COMPARE_NAME<<CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)
|
||||
CERT_FIND_ISSUER_ATTR = (CERT_COMPARE_ATTR<<CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)
|
||||
CERT_FIND_SUBJECT_STR_A = (CERT_COMPARE_NAME_STR_A<<CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
|
||||
CERT_FIND_SUBJECT_STR_W = (CERT_COMPARE_NAME_STR_W<<CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
|
||||
CERT_FIND_SUBJECT_STR = CERT_FIND_SUBJECT_STR_W
|
||||
CERT_FIND_ISSUER_STR_A = (CERT_COMPARE_NAME_STR_A<<CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)
|
||||
CERT_FIND_ISSUER_STR_W = (CERT_COMPARE_NAME_STR_W<<CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)
|
||||
CERT_FIND_ISSUER_STR = CERT_FIND_ISSUER_STR_W
|
||||
CERT_FIND_KEY_SPEC = (CERT_COMPARE_KEY_SPEC << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_ENHKEY_USAGE = (CERT_COMPARE_ENHKEY_USAGE << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_CTL_USAGE = CERT_FIND_ENHKEY_USAGE
|
||||
CERT_FIND_SUBJECT_CERT = (CERT_COMPARE_SUBJECT_CERT << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_ISSUER_OF = (CERT_COMPARE_ISSUER_OF << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_EXISTING = (CERT_COMPARE_EXISTING << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_CERT_ID = (CERT_COMPARE_CERT_ID << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_CROSS_CERT_DIST_POINTS = (CERT_COMPARE_CROSS_CERT_DIST_POINTS << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_PUBKEY_MD5_HASH = (CERT_COMPARE_PUBKEY_MD5_HASH << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_SUBJECT_INFO_ACCESS = (CERT_COMPARE_SUBJECT_INFO_ACCESS << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_HASH_STR = (CERT_COMPARE_HASH_STR << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_HAS_PRIVATE_KEY = (CERT_COMPARE_HAS_PRIVATE_KEY << CERT_COMPARE_SHIFT)
|
||||
CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG = 0x1
|
||||
CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG = 0x2
|
||||
CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG = 0x4
|
||||
CERT_FIND_NO_ENHKEY_USAGE_FLAG = 0x8
|
||||
CERT_FIND_OR_ENHKEY_USAGE_FLAG = 0x10
|
||||
CERT_FIND_VALID_ENHKEY_USAGE_FLAG = 0x20
|
||||
CERT_FIND_OPTIONAL_CTL_USAGE_FLAG = CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG
|
||||
CERT_FIND_EXT_ONLY_CTL_USAGE_FLAG = CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG
|
||||
CERT_FIND_PROP_ONLY_CTL_USAGE_FLAG = CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG
|
||||
CERT_FIND_NO_CTL_USAGE_FLAG = CERT_FIND_NO_ENHKEY_USAGE_FLAG
|
||||
CERT_FIND_OR_CTL_USAGE_FLAG = CERT_FIND_OR_ENHKEY_USAGE_FLAG
|
||||
CERT_FIND_VALID_CTL_USAGE_FLAG = CERT_FIND_VALID_ENHKEY_USAGE_FLAG
|
||||
|
||||
/* policyOID values for CertVerifyCertificateChainPolicy function */
|
||||
CERT_CHAIN_POLICY_BASE = 1
|
||||
CERT_CHAIN_POLICY_AUTHENTICODE = 2
|
||||
@@ -423,6 +506,17 @@ const (
|
||||
CERT_CHAIN_POLICY_EV = 8
|
||||
CERT_CHAIN_POLICY_SSL_F12 = 9
|
||||
|
||||
/* flag for dwFindType CertFindChainInStore */
|
||||
CERT_CHAIN_FIND_BY_ISSUER = 1
|
||||
|
||||
/* dwFindFlags for CertFindChainInStore when dwFindType == CERT_CHAIN_FIND_BY_ISSUER */
|
||||
CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG = 0x0001
|
||||
CERT_CHAIN_FIND_BY_ISSUER_COMPLEX_CHAIN_FLAG = 0x0002
|
||||
CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG = 0x0004
|
||||
CERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAG = 0x0008
|
||||
CERT_CHAIN_FIND_BY_ISSUER_NO_KEY_FLAG = 0x4000
|
||||
CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG = 0x8000
|
||||
|
||||
/* Certificate Store close flags */
|
||||
CERT_CLOSE_STORE_FORCE_FLAG = 0x00000001
|
||||
CERT_CLOSE_STORE_CHECK_FLAG = 0x00000002
|
||||
|
||||
@@ -145,12 +145,15 @@ var (
|
||||
procCertDeleteCertificateFromStore = modcrypt32.NewProc("CertDeleteCertificateFromStore")
|
||||
procCertDuplicateCertificateContext = modcrypt32.NewProc("CertDuplicateCertificateContext")
|
||||
procCertEnumCertificatesInStore = modcrypt32.NewProc("CertEnumCertificatesInStore")
|
||||
procCertFindCertificateInStore = modcrypt32.NewProc("CertFindCertificateInStore")
|
||||
procCertFindChainInStore = modcrypt32.NewProc("CertFindChainInStore")
|
||||
procCertFreeCertificateChain = modcrypt32.NewProc("CertFreeCertificateChain")
|
||||
procCertFreeCertificateContext = modcrypt32.NewProc("CertFreeCertificateContext")
|
||||
procCertGetCertificateChain = modcrypt32.NewProc("CertGetCertificateChain")
|
||||
procCertOpenStore = modcrypt32.NewProc("CertOpenStore")
|
||||
procCertOpenSystemStoreW = modcrypt32.NewProc("CertOpenSystemStoreW")
|
||||
procCertVerifyCertificateChainPolicy = modcrypt32.NewProc("CertVerifyCertificateChainPolicy")
|
||||
procCryptAcquireCertificatePrivateKey = modcrypt32.NewProc("CryptAcquireCertificatePrivateKey")
|
||||
procPFXImportCertStore = modcrypt32.NewProc("PFXImportCertStore")
|
||||
procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W")
|
||||
procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W")
|
||||
@@ -1197,6 +1200,24 @@ func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (contex
|
||||
return
|
||||
}
|
||||
|
||||
func CertFindCertificateInStore(store Handle, certEncodingType uint32, findFlags uint32, findType uint32, findPara unsafe.Pointer, prevCertContext *CertContext) (cert *CertContext, err error) {
|
||||
r0, _, e1 := syscall.Syscall6(procCertFindCertificateInStore.Addr(), 6, uintptr(store), uintptr(certEncodingType), uintptr(findFlags), uintptr(findType), uintptr(findPara), uintptr(unsafe.Pointer(prevCertContext)))
|
||||
cert = (*CertContext)(unsafe.Pointer(r0))
|
||||
if cert == nil {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func CertFindChainInStore(store Handle, certEncodingType uint32, findFlags uint32, findType uint32, findPara unsafe.Pointer, prevChainContext *CertChainContext) (certchain *CertChainContext, err error) {
|
||||
r0, _, e1 := syscall.Syscall6(procCertFindChainInStore.Addr(), 6, uintptr(store), uintptr(certEncodingType), uintptr(findFlags), uintptr(findType), uintptr(findPara), uintptr(unsafe.Pointer(prevChainContext)))
|
||||
certchain = (*CertChainContext)(unsafe.Pointer(r0))
|
||||
if certchain == nil {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func CertFreeCertificateChain(ctx *CertChainContext) {
|
||||
syscall.Syscall(procCertFreeCertificateChain.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0)
|
||||
return
|
||||
@@ -1244,6 +1265,19 @@ func CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext
|
||||
return
|
||||
}
|
||||
|
||||
func CryptAcquireCertificatePrivateKey(cert *CertContext, flags uint32, parameters unsafe.Pointer, cryptProvOrNCryptKey *Handle, keySpec *uint32, callerFreeProvOrNCryptKey *bool) (err error) {
|
||||
var _p0 uint32
|
||||
if *callerFreeProvOrNCryptKey {
|
||||
_p0 = 1
|
||||
}
|
||||
r1, _, e1 := syscall.Syscall6(procCryptAcquireCertificatePrivateKey.Addr(), 6, uintptr(unsafe.Pointer(cert)), uintptr(flags), uintptr(parameters), uintptr(unsafe.Pointer(cryptProvOrNCryptKey)), uintptr(unsafe.Pointer(keySpec)), uintptr(unsafe.Pointer(&_p0)))
|
||||
*callerFreeProvOrNCryptKey = _p0 != 0
|
||||
if r1 == 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func PFXImportCertStore(pfx *CryptDataBlob, password *uint16, flags uint32) (store Handle, err error) {
|
||||
r0, _, e1 := syscall.Syscall(procPFXImportCertStore.Addr(), 3, uintptr(unsafe.Pointer(pfx)), uintptr(unsafe.Pointer(password)), uintptr(flags))
|
||||
store = Handle(r0)
|
||||
|
||||
Reference in New Issue
Block a user