Esempio n. 1
0
def _build_ekey_from_string(key):
	bio = _string_to_bio(key)
	ekey = evp.PEM_read_bio_PUBKEY(bio, None, None, None)
	if not ekey:
		raise EnvelopeError("Could not create encryption key from string")
	evp.BIO_free(bio)
	return ekey
Esempio n. 2
0
def _build_dkey_from_string(key):
	bio = _string_to_bio(key)
	dkey = evp.PEM_read_bio_PrivateKey(bio, None, None, None)
	if not dkey:
		raise EnvelopeError("Could not build decryption key from string")
	evp.BIO_free(bio)
	return dkey
Esempio n. 3
0
def _build_skey_from_string(key):
    buf = ctypes.create_string_buffer(key)
    bio = evp.BIO_new_mem_buf(buf, len(buf.value))
    skey = evp.PEM_read_bio_PrivateKey(bio, None, None, None, None)
    if not skey:
        raise SignatureError(
            "Could not construct signing key from the given string")
    evp.BIO_free(bio)
    return skey
Esempio n. 4
0
def keygen(bitlength=1024, e=65537, pem=True):
    key = evp.RSA_generate_key(bitlength, e, None, None)
    if not key:
        raise EnvelopeError("Could not generate key")
    if pem:
        private_bio = evp.BIO_new(evp.BIO_s_mem())
        if not private_bio:
            raise KeygenError("Could not create temporary storage")
        public_bio = evp.BIO_new(evp.BIO_s_mem())
        if not public_bio:
            raise KeygenError("Could not create temporary storage")
        private_buf = ctypes.create_string_buffer('', 65537)
        if not private_buf:
            raise MemoryError("Could not allocate key storage")
        public_buf = ctypes.create_string_buffer('', 65537)
        if not public_buf:
            raise MemoryError("Could not allocate key storage")
        if not evp.PEM_write_bio_RSAPrivateKey(private_bio, key, None, None, 0,
                                               0, None):
            raise KeygenError("Could not write private key")
        if not evp.PEM_write_bio_RSA_PUBKEY(public_bio, key):
            raise KeygenError("Could not write public key")
        public_len = evp.BIO_read(public_bio, public_buf, 65537)
        private_len = evp.BIO_read(private_bio, private_buf, 65537)
        evp.BIO_free(public_bio)
        evp.BIO_free(private_bio)
        return public_buf.value, private_buf.value
    else:
        # we go through this rigamarole because if there's an engine
        # in place it won't populate the RSA key's values properly.
        key_bio = evp.BIO_new(evp.BIO_s_mem())
        if not key_bio:
            raise KeygenError("Could not create temporary storage")
        if not evp.RSA_print(key_bio, key, 0):
            raise KeygenError("Could not stringify key")
        key_buf = ctypes.create_string_buffer('', 65537)
        if not key_buf:
            raise MemoryError("Could not allocate key storage")
        evp.BIO_read(key_bio, key_buf, 65537)
        evp.BIO_free(key_bio)
        key_string = key_buf.value
        return key, _parse_printed_key(key_string)