mirror of
https://github.com/theupdateframework/python-tuf
synced 2026-05-24 10:08:28 +00:00
318 lines
10 KiB
Python
Executable file
318 lines
10 KiB
Python
Executable file
#! /usr/bin/env python
|
|
|
|
import ctypes
|
|
import ctypes.util
|
|
import platform
|
|
from os import linesep
|
|
|
|
def handle_errors():
|
|
ERR_load_crypto_strings()
|
|
errno = ERR_get_error()
|
|
errbuf = ctypes.create_string_buffer(1024)
|
|
ERR_error_string_n(errno, errbuf, 1024)
|
|
return errbuf.value.decode("ascii")
|
|
|
|
class SSLError(Exception):
|
|
def __init__(self, msg):
|
|
sslerr = handle_errors()
|
|
Exception.__init__(self, msg + linesep + sslerr)
|
|
|
|
libraries = {}
|
|
|
|
libraries["c"] = ctypes.CDLL(ctypes.util.find_library("c"))
|
|
|
|
if platform.system() != "Windows":
|
|
libraries["ssl"] = ctypes.CDLL(ctypes.util.find_library("ssl"))
|
|
else:
|
|
libraries["ssl"] = ctypes.CDLL(ctypes.util.find_library("libeay32"))
|
|
|
|
|
|
class RSA(ctypes.Structure):
|
|
_fields_ = [ ("n", ctypes.c_void_p),
|
|
("e", ctypes.c_void_p),
|
|
("d", ctypes.c_void_p),
|
|
("p", ctypes.c_void_p),
|
|
("q", ctypes.c_void_p),
|
|
("dmp1", ctypes.c_void_p),
|
|
("iqmp", ctypes.c_void_p)]
|
|
|
|
def handle_errors():
|
|
ERR_load_crypto_strings()
|
|
errno = ERR_get_error()
|
|
errbuf = ctypes.create_string_buffer(1024)
|
|
ERR_error_string_n(errno, errbuf, 1024)
|
|
return errbuf.value.decode("ascii")
|
|
|
|
|
|
fopen = libraries['c'].fopen
|
|
fopen.restype = ctypes.c_void_p
|
|
fopen.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
|
|
|
|
|
|
fclose = libraries['c'].fclose
|
|
fclose.restype = ctypes.c_int
|
|
fclose.argtypes = [ctypes.c_void_p]
|
|
|
|
|
|
ERR_load_crypto_strings = libraries['ssl'].ERR_load_crypto_strings
|
|
ERR_load_crypto_strings.restype = ctypes.c_int
|
|
ERR_load_crypto_strings.argtypes = []
|
|
|
|
|
|
ERR_print_errors_fp = libraries['ssl'].ERR_print_errors_fp
|
|
ERR_print_errors_fp.restype = ctypes.c_int
|
|
ERR_print_errors_fp.argtypes = [ctypes.c_void_p]
|
|
|
|
|
|
OpenSSL_add_all_digests = libraries['ssl'].OpenSSL_add_all_digests
|
|
OpenSSL_add_all_digests.restype = ctypes.c_int
|
|
OpenSSL_add_all_digests.argtypes = []
|
|
|
|
|
|
EVP_MD_CTX_create = libraries['ssl'].EVP_MD_CTX_create
|
|
EVP_MD_CTX_create.restype = ctypes.c_void_p
|
|
EVP_MD_CTX_create.argtypes = []
|
|
|
|
|
|
PEM_read_PrivateKey = libraries['ssl'].PEM_read_PrivateKey
|
|
PEM_read_PrivateKey.restype = ctypes.c_void_p
|
|
PEM_read_PrivateKey.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
|
|
|
|
|
|
PEM_read_X509 = libraries['ssl'].PEM_read_X509
|
|
PEM_read_X509.restype = ctypes.c_void_p
|
|
PEM_read_X509.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
|
|
|
|
|
|
PEM_read_PUBKEY = libraries['ssl'].PEM_read_PUBKEY
|
|
PEM_read_PUBKEY.restype = ctypes.c_void_p
|
|
PEM_read_PUBKEY.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
|
|
|
|
|
|
PEM_read_bio_PUBKEY = libraries['ssl'].PEM_read_bio_PUBKEY
|
|
PEM_read_bio_PUBKEY.restype = ctypes.c_void_p
|
|
PEM_read_bio_PUBKEY.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
|
|
|
|
|
|
BIO_free = libraries['ssl'].BIO_free
|
|
BIO_free.restype = ctypes.c_int
|
|
BIO_free.argtypes = [ctypes.c_void_p]
|
|
|
|
|
|
PEM_read_bio_PrivateKey = libraries['ssl'].PEM_read_bio_PrivateKey
|
|
PEM_read_bio_PrivateKey.restype = ctypes.c_void_p
|
|
PEM_read_bio_PrivateKey.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
|
|
|
|
|
|
EVP_get_digestbyname = libraries['ssl'].EVP_get_digestbyname
|
|
EVP_get_digestbyname.restype = ctypes.c_void_p
|
|
EVP_get_digestbyname.argtypes = [ctypes.c_char_p]
|
|
|
|
|
|
EVP_DigestInit = libraries['ssl'].EVP_DigestInit
|
|
EVP_DigestInit.restype = ctypes.c_int
|
|
EVP_DigestInit.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
|
|
|
|
|
|
EVP_DigestUpdate = libraries['ssl'].EVP_DigestUpdate
|
|
EVP_DigestUpdate.restype = ctypes.c_int
|
|
EVP_DigestUpdate.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int]
|
|
|
|
|
|
EVP_SignFinal = libraries['ssl'].EVP_SignFinal
|
|
EVP_SignFinal.restype = ctypes.c_int
|
|
EVP_SignFinal.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.POINTER(ctypes.c_int), ctypes.c_void_p]
|
|
|
|
|
|
EVP_VerifyFinal = libraries['ssl'].EVP_VerifyFinal
|
|
EVP_VerifyFinal.restype = ctypes.c_int
|
|
EVP_VerifyFinal.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int, ctypes.c_void_p]
|
|
|
|
|
|
EVP_PKEY_free = libraries['ssl'].EVP_PKEY_free
|
|
EVP_PKEY_free.restype = ctypes.c_int
|
|
EVP_PKEY_free.argtypes = [ctypes.c_void_p]
|
|
|
|
|
|
EVP_MD_CTX_cleanup = libraries['ssl'].EVP_MD_CTX_cleanup
|
|
EVP_MD_CTX_cleanup.restype = ctypes.c_int
|
|
EVP_MD_CTX_cleanup.argtypes = [ctypes.c_void_p]
|
|
|
|
|
|
EVP_MD_CTX_destroy = libraries['ssl'].EVP_MD_CTX_destroy
|
|
EVP_MD_CTX_destroy.restype = ctypes.c_int
|
|
EVP_MD_CTX_destroy.argtypes = [ctypes.c_void_p]
|
|
|
|
|
|
EVP_CIPHER_CTX_new = libraries['ssl'].EVP_CIPHER_CTX_new
|
|
EVP_CIPHER_CTX_new.restype = ctypes.c_void_p
|
|
EVP_CIPHER_CTX_new.argtypes = []
|
|
|
|
|
|
EVP_CIPHER_CTX_init = libraries['ssl'].EVP_CIPHER_CTX_init
|
|
EVP_CIPHER_CTX_init.restype = ctypes.c_int
|
|
EVP_CIPHER_CTX_init.argtypes = [ctypes.c_void_p]
|
|
|
|
try:
|
|
EVP_CIPHER_CTX_iv_length = libraries['ssl'].EVP_CIPHER_CTX_iv_length
|
|
EVP_CIPHER_CTX_iv_length.restype = ctypes.c_int
|
|
EVP_CIPHER_CTX_iv_length.argtypes = [ctypes.c_void_p]
|
|
except:
|
|
EVP_CIPHER_CTX_iv_length = lambda(x): 16
|
|
|
|
|
|
EVP_aes_192_cbc = libraries['ssl'].EVP_aes_192_cbc
|
|
EVP_aes_192_cbc.restype = ctypes.c_void_p
|
|
EVP_aes_192_cbc.argtypes = []
|
|
|
|
|
|
EVP_PKEY_size = libraries['ssl'].EVP_PKEY_size
|
|
EVP_PKEY_size.restype = ctypes.c_int
|
|
EVP_PKEY_size.argtypes = [ctypes.c_void_p]
|
|
|
|
|
|
EVP_SealInit = libraries['ssl'].EVP_SealInit
|
|
EVP_SealInit.restype = ctypes.c_int
|
|
EVP_SealInit.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_char_p, ctypes.POINTER(ctypes.c_int), ctypes.c_char_p, ctypes.c_void_p, ctypes.c_int]
|
|
|
|
|
|
EVP_EncryptInit_ex = libraries['ssl'].EVP_EncryptInit_ex
|
|
EVP_EncryptInit_ex.restype = ctypes.c_int
|
|
EVP_EncryptInit_ex.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_char_p, ctypes.c_char_p]
|
|
|
|
|
|
EVP_EncryptUpdate = libraries['ssl'].EVP_EncryptUpdate
|
|
EVP_EncryptUpdate.restype = ctypes.c_int
|
|
EVP_EncryptUpdate.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.POINTER(ctypes.c_int), ctypes.c_char_p, ctypes.c_int]
|
|
|
|
|
|
EVP_DecryptUpdate = libraries['ssl'].EVP_DecryptUpdate
|
|
EVP_DecryptUpdate.restype = ctypes.c_int
|
|
EVP_DecryptUpdate.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.POINTER(ctypes.c_int), ctypes.c_char_p, ctypes.c_int]
|
|
|
|
|
|
EVP_EncryptFinal_ex = libraries['ssl'].EVP_EncryptFinal_ex
|
|
EVP_EncryptFinal_ex.restype = ctypes.c_int
|
|
EVP_EncryptFinal_ex.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.POINTER(ctypes.c_int)]
|
|
|
|
|
|
EVP_SealFinal = libraries['ssl'].EVP_SealFinal
|
|
EVP_SealFinal.restype = ctypes.c_int
|
|
EVP_SealFinal.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.POINTER(ctypes.c_int)]
|
|
|
|
|
|
EVP_DecryptFinal_ex = libraries['ssl'].EVP_DecryptFinal_ex
|
|
EVP_DecryptFinal_ex.restype = ctypes.c_int
|
|
EVP_DecryptFinal_ex.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.POINTER(ctypes.c_int)]
|
|
|
|
|
|
RAND_bytes = libraries['ssl'].RAND_bytes
|
|
RAND_bytes.restype = ctypes.c_int
|
|
RAND_bytes.argtypes = [ctypes.c_char_p, ctypes.c_int]
|
|
|
|
|
|
BIO_new_mem_buf = libraries['ssl'].BIO_new_mem_buf
|
|
BIO_new_mem_buf.restype = ctypes.c_void_p
|
|
BIO_new_mem_buf.argtypes = [ctypes.c_char_p, ctypes.c_int]
|
|
|
|
|
|
EVP_CIPHER_CTX_rand_key = libraries['ssl'].EVP_CIPHER_CTX_rand_key
|
|
EVP_CIPHER_CTX_rand_key.restype = ctypes.c_int
|
|
EVP_CIPHER_CTX_rand_key.argtypes = [ctypes.c_void_p, ctypes.c_char_p]
|
|
|
|
|
|
try:
|
|
EVP_CIPHER_key_length = libraries['ssl'].EVP_CIPHER_key_length
|
|
EVP_CIPHER_key_length.restype = ctypes.c_int
|
|
EVP_CIPHER_key_length.argtypes = [ctypes.c_void_p]
|
|
except:
|
|
EVP_CIPHER_key_length = lambda(x): 24
|
|
|
|
|
|
EVP_PKEY_encrypt = libraries['ssl'].EVP_PKEY_encrypt
|
|
EVP_PKEY_encrypt.restype = ctypes.c_int
|
|
EVP_PKEY_encrypt.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int, ctypes.c_void_p]
|
|
|
|
|
|
EVP_OpenInit = libraries['ssl'].EVP_OpenInit
|
|
EVP_OpenInit.restype = ctypes.c_int
|
|
EVP_OpenInit.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int, ctypes.c_char_p, ctypes.c_void_p]
|
|
|
|
|
|
EVP_PKEY_size = libraries['ssl'].EVP_PKEY_size
|
|
EVP_PKEY_size.restype = ctypes.c_int
|
|
EVP_PKEY_size.argtypes = [ctypes.c_void_p]
|
|
|
|
|
|
RSA_public_encrypt = libraries['ssl'].RSA_public_encrypt
|
|
RSA_public_encrypt.restype = ctypes.c_int
|
|
RSA_public_encrypt.argtypes = [ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_void_p, ctypes.c_int]
|
|
|
|
|
|
EVP_PKEY_get1_RSA = libraries['ssl'].EVP_PKEY_get1_RSA
|
|
EVP_PKEY_get1_RSA.restype = ctypes.c_void_p
|
|
EVP_PKEY_get1_RSA.argtypes = [ctypes.c_void_p]
|
|
|
|
|
|
EVP_DecryptInit_ex = libraries['ssl'].EVP_DecryptInit_ex
|
|
EVP_DecryptInit_ex.restype = ctypes.c_int
|
|
EVP_DecryptInit_ex.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_char_p, ctypes.c_char_p]
|
|
|
|
|
|
EVP_CIPHER_CTX_set_key_length = libraries['ssl'].EVP_CIPHER_CTX_set_key_length
|
|
EVP_CIPHER_CTX_set_key_length.restype = ctypes.c_int
|
|
EVP_CIPHER_CTX_set_key_length.argtypes = [ctypes.c_void_p, ctypes.c_int]
|
|
|
|
|
|
EVP_BytesToKey = libraries['ssl'].EVP_BytesToKey
|
|
EVP_BytesToKey.restype = ctypes.c_int
|
|
EVP_BytesToKey.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int, ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p]
|
|
|
|
|
|
ERR_get_error = libraries['ssl'].ERR_get_error
|
|
ERR_get_error.restype = ctypes.c_long
|
|
ERR_get_error.argtypes = []
|
|
|
|
|
|
ERR_error_string_n = libraries['ssl'].ERR_error_string_n
|
|
ERR_error_string_n.restype = ctypes.c_void_p
|
|
ERR_error_string_n.argtypes = [ctypes.c_long, ctypes.c_char_p, ctypes.c_int]
|
|
|
|
RSA_size = libraries['ssl'].RSA_size
|
|
RSA_size.restype = ctypes.c_int
|
|
RSA_size.argtypes = [ctypes.c_void_p]
|
|
|
|
RSA_new = libraries['ssl'].RSA_new
|
|
RSA_new.restype = ctypes.POINTER(RSA)
|
|
|
|
RSA_generate_key = libraries['ssl'].RSA_generate_key
|
|
RSA_generate_key.restype = ctypes.POINTER(RSA)
|
|
RSA_generate_key.argtypes = [ctypes.c_int, ctypes.c_ulong, ctypes.c_void_p, ctypes.c_void_p]
|
|
|
|
RSA_print = libraries['ssl'].RSA_print
|
|
RSA_print.restype = ctypes.c_int
|
|
RSA_print.argtypes = [ctypes.c_void_p, ctypes.POINTER(RSA), ctypes.c_int]
|
|
|
|
PEM_write_bio_RSA_PUBKEY = libraries['ssl'].PEM_write_bio_RSA_PUBKEY
|
|
|
|
PEM_write_bio_RSAPrivateKey = libraries['ssl'].PEM_write_bio_RSAPrivateKey
|
|
PEM_write_bio_RSAPrivateKey.restype = ctypes.c_int
|
|
PEM_write_bio_RSAPrivateKey.argtypes = [ctypes.c_void_p, ctypes.POINTER(RSA), ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int, ctypes.c_void_p, ctypes.c_void_p]
|
|
|
|
PEM_write_RSAPrivateKey = libraries['ssl'].PEM_write_RSAPrivateKey
|
|
PEM_write_RSAPrivateKey.restype = ctypes.c_int
|
|
PEM_write_RSAPrivateKey.argtypes = [ctypes.c_void_p, ctypes.POINTER(RSA), ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int, ctypes.c_void_p, ctypes.c_void_p]
|
|
|
|
i2d_RSAPrivateKey = libraries['ssl'].i2d_RSAPrivateKey
|
|
|
|
BIO_read = libraries['ssl'].BIO_read
|
|
|
|
BIO_s_mem = libraries['ssl'].BIO_s_mem
|
|
BIO_s_mem.restype = ctypes.c_void_p
|
|
|
|
BIO_new = libraries['ssl'].BIO_new
|
|
BIO_new.restype = ctypes.c_void_p
|
|
BIO_new.argtypes = [ctypes.c_void_p]
|
|
|
|
RAND_seed = libraries['ssl'].RAND_seed
|
|
RAND_seed.argtypes = [ctypes.c_void_p, ctypes.c_int]
|