mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
Improve ApiSetMap resolve to match ntdll behavior + add sizekey option to encryption_demo genkey option
This commit is contained in:
@@ -893,6 +893,45 @@ typedef enum tag_WBEMSTATUS {
|
||||
WBEMMOF_E_INVALID_DELETECLASS_SYNTAX = 0x80044031
|
||||
} WBEMSTATUS;
|
||||
|
||||
|
||||
typedef enum tag_WBEM_CHANGE_FLAG_TYPE {
|
||||
WBEM_FLAG_CREATE_OR_UPDATE = 0,
|
||||
WBEM_FLAG_UPDATE_ONLY = 0x1,
|
||||
WBEM_FLAG_CREATE_ONLY = 0x2,
|
||||
WBEM_FLAG_UPDATE_COMPATIBLE = 0,
|
||||
WBEM_FLAG_UPDATE_SAFE_MODE = 0x20,
|
||||
WBEM_FLAG_UPDATE_FORCE_MODE = 0x40,
|
||||
WBEM_MASK_UPDATE_MODE = 0x60,
|
||||
WBEM_FLAG_ADVISORY = 0x10000
|
||||
} WBEM_CHANGE_FLAG_TYPE;
|
||||
|
||||
|
||||
typedef enum tag_WBEM_TIMEOUT_TYPE
|
||||
{
|
||||
WBEM_NO_WAIT = 0,
|
||||
WBEM_INFINITE = 0xffffffff
|
||||
} WBEM_TIMEOUT_TYPE;
|
||||
|
||||
typedef enum tag_WBEM_GENERIC_FLAG_TYPE {
|
||||
WBEM_FLAG_RETURN_IMMEDIATELY = 0x10,
|
||||
WBEM_FLAG_RETURN_WBEM_COMPLETE = 0,
|
||||
WBEM_FLAG_BIDIRECTIONAL = 0,
|
||||
WBEM_FLAG_FORWARD_ONLY = 0x20,
|
||||
WBEM_FLAG_NO_ERROR_OBJECT = 0x40,
|
||||
WBEM_FLAG_RETURN_ERROR_OBJECT = 0,
|
||||
WBEM_FLAG_SEND_STATUS = 0x80,
|
||||
WBEM_FLAG_DONT_SEND_STATUS = 0,
|
||||
WBEM_FLAG_ENSURE_LOCATABLE = 0x100,
|
||||
WBEM_FLAG_DIRECT_READ = 0x200,
|
||||
WBEM_FLAG_SEND_ONLY_SELECTED = 0,
|
||||
WBEM_RETURN_WHEN_COMPLETE = 0,
|
||||
WBEM_RETURN_IMMEDIATELY = 0x10,
|
||||
WBEM_MASK_RESERVED_FLAGS = 0x1f000,
|
||||
WBEM_FLAG_USE_AMENDED_QUALIFIERS = 0x20000,
|
||||
WBEM_FLAG_STRONG_VALIDATION = 0x100000
|
||||
} WBEM_GENERIC_FLAG_TYPE;
|
||||
|
||||
|
||||
typedef enum tagCLSCTX {
|
||||
CLSCTX_INPROC_SERVER = 0x1,
|
||||
CLSCTX_INPROC_HANDLER = 0x2,
|
||||
|
||||
@@ -14541,6 +14541,108 @@ tag_WBEMSTATUS
|
||||
|
||||
.. attribute:: WBEMMOF_E_INVALID_DELETECLASS_SYNTAX(2147762225)
|
||||
|
||||
tag_WBEM_CHANGE_FLAG_TYPE
|
||||
'''''''''''''''''''''''''
|
||||
.. class:: WBEM_CHANGE_FLAG_TYPE
|
||||
|
||||
Alias for :class:`tag_WBEM_CHANGE_FLAG_TYPE`
|
||||
|
||||
.. class:: tag_WBEM_CHANGE_FLAG_TYPE
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_CREATE_OR_UPDATE(0)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_UPDATE_ONLY(1)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_CREATE_ONLY(2)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_UPDATE_COMPATIBLE(0)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_UPDATE_SAFE_MODE(32)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_UPDATE_FORCE_MODE(64)
|
||||
|
||||
|
||||
.. attribute:: WBEM_MASK_UPDATE_MODE(96)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_ADVISORY(65536)
|
||||
|
||||
tag_WBEM_TIMEOUT_TYPE
|
||||
'''''''''''''''''''''
|
||||
.. class:: WBEM_TIMEOUT_TYPE
|
||||
|
||||
Alias for :class:`tag_WBEM_TIMEOUT_TYPE`
|
||||
|
||||
.. class:: tag_WBEM_TIMEOUT_TYPE
|
||||
|
||||
|
||||
.. attribute:: WBEM_NO_WAIT(0)
|
||||
|
||||
|
||||
.. attribute:: WBEM_INFINITE(4294967295)
|
||||
|
||||
tag_WBEM_GENERIC_FLAG_TYPE
|
||||
''''''''''''''''''''''''''
|
||||
.. class:: WBEM_GENERIC_FLAG_TYPE
|
||||
|
||||
Alias for :class:`tag_WBEM_GENERIC_FLAG_TYPE`
|
||||
|
||||
.. class:: tag_WBEM_GENERIC_FLAG_TYPE
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_RETURN_IMMEDIATELY(16)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_RETURN_WBEM_COMPLETE(0)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_BIDIRECTIONAL(0)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_FORWARD_ONLY(32)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_NO_ERROR_OBJECT(64)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_RETURN_ERROR_OBJECT(0)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_SEND_STATUS(128)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_DONT_SEND_STATUS(0)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_ENSURE_LOCATABLE(256)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_DIRECT_READ(512)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_SEND_ONLY_SELECTED(0)
|
||||
|
||||
|
||||
.. attribute:: WBEM_RETURN_WHEN_COMPLETE(0)
|
||||
|
||||
|
||||
.. attribute:: WBEM_RETURN_IMMEDIATELY(16)
|
||||
|
||||
|
||||
.. attribute:: WBEM_MASK_RESERVED_FLAGS(126976)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_USE_AMENDED_QUALIFIERS(131072)
|
||||
|
||||
|
||||
.. attribute:: WBEM_FLAG_STRONG_VALIDATION(1048576)
|
||||
|
||||
tagCLSCTX
|
||||
'''''''''
|
||||
.. class:: CLSCTX
|
||||
|
||||
@@ -20,26 +20,31 @@ def crypt(src, dst, certs, **kwargs):
|
||||
dst.close()
|
||||
src.close()
|
||||
|
||||
def decrypt(src, pfxfile, password, **kwargs):
|
||||
def decrypt(src, pfxfile, password, outfile=None, **kwargs):
|
||||
"""Decrypt the content of 'src' with the private key in 'pfxfile'. the 'pfxfile' is open using the 'password'"""
|
||||
# Open the 'pfx' with the given password
|
||||
pfx = crypto.import_pfx(pfxfile.read(), password)
|
||||
# Decrypt the content of the file
|
||||
decrypted = crypto.decrypt(pfx, src.read())
|
||||
print(u"Result = <{0}>".format(decrypted))
|
||||
if outfile is None:
|
||||
print(u"Result = <{0}>".format(decrypted))
|
||||
else:
|
||||
with open(outfile, "wb") as f:
|
||||
f.write(decrypted)
|
||||
return decrypted
|
||||
|
||||
PFW_TMP_KEY_CONTAINER = "PythonForWindowsTMPContainer"
|
||||
|
||||
def genkeys(common_name, pfxpassword, outname, **kwargs):
|
||||
def genkeys(common_name, pfxpassword, outname, keysize=2048, **kwargs):
|
||||
"""Generate a SHA256/RSA key pair. A self-signed certificate with 'common_name' is stored as 'outname'.cer.
|
||||
The private key is stored in 'outname'.pfx protected with 'pfxpassword'"""
|
||||
cert_store = crypto.EHCERTSTORE.new_in_memory()
|
||||
# Create a TMP context that will hold our newly generated key-pair
|
||||
with crypto.CryptContext(PFW_TMP_KEY_CONTAINER, None, PROV_RSA_FULL, 0, retrycreate=True) as ctx:
|
||||
key = HCRYPTKEY()
|
||||
keysize_flags = keysize << 16
|
||||
# Generate a key-pair that is exportable
|
||||
winproxy.CryptGenKey(ctx, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, key)
|
||||
winproxy.CryptGenKey(ctx, AT_KEYEXCHANGE, CRYPT_EXPORTABLE | keysize_flags, key)
|
||||
# It does NOT destroy the key-pair from the container,
|
||||
# It only release the key handle
|
||||
# https://msdn.microsoft.com/en-us/library/windows/desktop/aa379918(v=vs.85).aspx
|
||||
@@ -80,6 +85,18 @@ def genkeys(common_name, pfxpassword, outname, **kwargs):
|
||||
prov = HCRYPTPROV()
|
||||
winproxy.CryptAcquireContextW(prov, PFW_TMP_KEY_CONTAINER, None, PROV_RSA_FULL, CRYPT_DELETEKEYSET)
|
||||
|
||||
# Openssl commands to check ce certif/pfx
|
||||
|
||||
## Read certificate info (.cer)
|
||||
### openssl x509 -inform der -in {certif} -text -noout
|
||||
|
||||
## Read pfx info (ask to another password to encrypt Private key before print/export)
|
||||
### openssl pkcs12 -info -in {pfx} -nokeys
|
||||
## Read pfx info !!!! PRINT PRIVATE KEY !!!!
|
||||
### openssl pkcs12 -info -in {pfx} -nodes
|
||||
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser(prog=__file__)
|
||||
subparsers = parser.add_subparsers(description='valid subcommands',)
|
||||
|
||||
@@ -96,12 +113,14 @@ decryptparse.set_defaults(func=decrypt)
|
||||
decryptparse.add_argument('src', type=argparse.FileType('rb'), help='File to decrypt')
|
||||
decryptparse.add_argument('pfxfile', type=argparse.FileType('rb'), help='PFX file to use')
|
||||
decryptparse.add_argument('password', help='Password of the PFX')
|
||||
decryptparse.add_argument('--outfile', default=None, help='The outputfile default is print')
|
||||
|
||||
genkeysparse = subparsers.add_parser('genkey')
|
||||
genkeysparse.set_defaults(func=genkeys)
|
||||
genkeysparse.add_argument('common_name', nargs='?', metavar='CommonName', default='DEFAULT', help='the common name of the certificate')
|
||||
genkeysparse.add_argument('outname', nargs='?',help='The filename base for the generated files')
|
||||
genkeysparse.add_argument('--pfxpassword', nargs='?', help='Password to protect the PFX')
|
||||
genkeysparse.add_argument('--keysize', nargs='?', type=lambda x: int(x, 0), default=2048, help='The size of the RSA key')
|
||||
|
||||
res = parser.parse_args()
|
||||
res.func(**res.__dict__)
|
||||
@@ -15,7 +15,7 @@ def read_apisetmap():
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser(prog=__file__)
|
||||
parser.add_argument('filename', default="apisetmap.dmp", help='The filename in which the ApiSetMap is dumped')
|
||||
parser.add_argument('--filename', default="apisetmap.dmp", help='The filename in which the ApiSetMap is dumped')
|
||||
res = parser.parse_args()
|
||||
|
||||
with open(res.filename, "wb") as f:
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -873,6 +873,50 @@ class tag_WBEMSTATUS(EnumType):
|
||||
WBEMSTATUS = tag_WBEMSTATUS
|
||||
|
||||
|
||||
WBEM_FLAG_CREATE_OR_UPDATE = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_CREATE_OR_UPDATE", 0x0)
|
||||
WBEM_FLAG_UPDATE_ONLY = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_UPDATE_ONLY", 0x1)
|
||||
WBEM_FLAG_CREATE_ONLY = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_CREATE_ONLY", 0x2)
|
||||
WBEM_FLAG_UPDATE_COMPATIBLE = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_UPDATE_COMPATIBLE", 0x0)
|
||||
WBEM_FLAG_UPDATE_SAFE_MODE = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_UPDATE_SAFE_MODE", 0x20)
|
||||
WBEM_FLAG_UPDATE_FORCE_MODE = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_UPDATE_FORCE_MODE", 0x40)
|
||||
WBEM_MASK_UPDATE_MODE = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_MASK_UPDATE_MODE", 0x60)
|
||||
WBEM_FLAG_ADVISORY = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_ADVISORY", 0x10000)
|
||||
class tag_WBEM_CHANGE_FLAG_TYPE(EnumType):
|
||||
values = [WBEM_FLAG_CREATE_OR_UPDATE, WBEM_FLAG_UPDATE_ONLY, WBEM_FLAG_CREATE_ONLY, WBEM_FLAG_UPDATE_COMPATIBLE, WBEM_FLAG_UPDATE_SAFE_MODE, WBEM_FLAG_UPDATE_FORCE_MODE, WBEM_MASK_UPDATE_MODE, WBEM_FLAG_ADVISORY]
|
||||
mapper = {x:x for x in values}
|
||||
WBEM_CHANGE_FLAG_TYPE = tag_WBEM_CHANGE_FLAG_TYPE
|
||||
|
||||
|
||||
WBEM_NO_WAIT = EnumValue("tag_WBEM_TIMEOUT_TYPE", "WBEM_NO_WAIT", 0x0)
|
||||
WBEM_INFINITE = EnumValue("tag_WBEM_TIMEOUT_TYPE", "WBEM_INFINITE", 0xffffffff)
|
||||
class tag_WBEM_TIMEOUT_TYPE(EnumType):
|
||||
values = [WBEM_NO_WAIT, WBEM_INFINITE]
|
||||
mapper = {x:x for x in values}
|
||||
WBEM_TIMEOUT_TYPE = tag_WBEM_TIMEOUT_TYPE
|
||||
|
||||
|
||||
WBEM_FLAG_RETURN_IMMEDIATELY = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_RETURN_IMMEDIATELY", 0x10)
|
||||
WBEM_FLAG_RETURN_WBEM_COMPLETE = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_RETURN_WBEM_COMPLETE", 0x0)
|
||||
WBEM_FLAG_BIDIRECTIONAL = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_BIDIRECTIONAL", 0x0)
|
||||
WBEM_FLAG_FORWARD_ONLY = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_FORWARD_ONLY", 0x20)
|
||||
WBEM_FLAG_NO_ERROR_OBJECT = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_NO_ERROR_OBJECT", 0x40)
|
||||
WBEM_FLAG_RETURN_ERROR_OBJECT = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_RETURN_ERROR_OBJECT", 0x0)
|
||||
WBEM_FLAG_SEND_STATUS = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_SEND_STATUS", 0x80)
|
||||
WBEM_FLAG_DONT_SEND_STATUS = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_DONT_SEND_STATUS", 0x0)
|
||||
WBEM_FLAG_ENSURE_LOCATABLE = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_ENSURE_LOCATABLE", 0x100)
|
||||
WBEM_FLAG_DIRECT_READ = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_DIRECT_READ", 0x200)
|
||||
WBEM_FLAG_SEND_ONLY_SELECTED = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_SEND_ONLY_SELECTED", 0x0)
|
||||
WBEM_RETURN_WHEN_COMPLETE = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_RETURN_WHEN_COMPLETE", 0x0)
|
||||
WBEM_RETURN_IMMEDIATELY = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_RETURN_IMMEDIATELY", 0x10)
|
||||
WBEM_MASK_RESERVED_FLAGS = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_MASK_RESERVED_FLAGS", 0x1f000)
|
||||
WBEM_FLAG_USE_AMENDED_QUALIFIERS = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_USE_AMENDED_QUALIFIERS", 0x20000)
|
||||
WBEM_FLAG_STRONG_VALIDATION = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_STRONG_VALIDATION", 0x100000)
|
||||
class tag_WBEM_GENERIC_FLAG_TYPE(EnumType):
|
||||
values = [WBEM_FLAG_RETURN_IMMEDIATELY, WBEM_FLAG_RETURN_WBEM_COMPLETE, WBEM_FLAG_BIDIRECTIONAL, WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_NO_ERROR_OBJECT, WBEM_FLAG_RETURN_ERROR_OBJECT, WBEM_FLAG_SEND_STATUS, WBEM_FLAG_DONT_SEND_STATUS, WBEM_FLAG_ENSURE_LOCATABLE, WBEM_FLAG_DIRECT_READ, WBEM_FLAG_SEND_ONLY_SELECTED, WBEM_RETURN_WHEN_COMPLETE, WBEM_RETURN_IMMEDIATELY, WBEM_MASK_RESERVED_FLAGS, WBEM_FLAG_USE_AMENDED_QUALIFIERS, WBEM_FLAG_STRONG_VALIDATION]
|
||||
mapper = {x:x for x in values}
|
||||
WBEM_GENERIC_FLAG_TYPE = tag_WBEM_GENERIC_FLAG_TYPE
|
||||
|
||||
|
||||
CLSCTX_INPROC_SERVER = EnumValue("tagCLSCTX", "CLSCTX_INPROC_SERVER", 0x1)
|
||||
CLSCTX_INPROC_HANDLER = EnumValue("tagCLSCTX", "CLSCTX_INPROC_HANDLER", 0x2)
|
||||
CLSCTX_LOCAL_SERVER = EnumValue("tagCLSCTX", "CLSCTX_LOCAL_SERVER", 0x4)
|
||||
|
||||
@@ -35,7 +35,7 @@ class ApiSetMap(object):
|
||||
raise NotImplementedError("Should be implemented by subclasses")
|
||||
|
||||
@utils.fixedpropety
|
||||
def resolution_dict(self):
|
||||
def apisetmap_dict(self):
|
||||
res = {}
|
||||
for entry in self.entries_array():
|
||||
values = self.values_for_entry(entry)
|
||||
@@ -46,8 +46,27 @@ class ApiSetMap(object):
|
||||
res[self.get_entry_name(entry)] = final_value
|
||||
return res
|
||||
|
||||
@utils.fixedpropety
|
||||
def resolution_dict(self):
|
||||
res = {}
|
||||
for name, resolved_name in self.apisetmap_dict.items():
|
||||
# ApiSetResolveToHost does not care about last version + extension
|
||||
# It remove everything after the last '-'
|
||||
|
||||
# Possible to have no '-' ?
|
||||
try:
|
||||
cutname = name[:name.rindex("-") + 1]
|
||||
except ValueError as e:
|
||||
cutname = name
|
||||
res[cutname] = resolved_name
|
||||
return res
|
||||
|
||||
def resolve(self, dllname):
|
||||
return self.resolution_dict[dllname]
|
||||
try:
|
||||
cutname = dllname[:dllname.rindex("-") + 1]
|
||||
except ValueError as e:
|
||||
return None
|
||||
return self.resolution_dict[cutname]
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user