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
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
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
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)