Hi,
On 14-01-19 16:48, Arne Schwabe wrote:
> From: Arne Schwabe
>
> This allows the method to be resued for generating other types of keys
> that should also not be reused as tls-crypt/tls-auth keys.
> ---
> src/openvpn/crypto.c| 34 ++
> src/openvpn/crypto.h| 10 ++
> src/openvpn/tls_crypt.c | 30 +-
> 3 files changed, 45 insertions(+), 29 deletions(-)
>
> diff --git a/src/openvpn/crypto.c b/src/openvpn/crypto.c
> index df6f36ca..19136799 100644
> --- a/src/openvpn/crypto.c
> +++ b/src/openvpn/crypto.c
> @@ -1848,3 +1848,37 @@ translate_cipher_name_to_openvpn(const char
> *cipher_name)
>
> return pair->openvpn_name;
> }
> +
> +void
> +write_pem_key_file(const char *filename, const char *pem_name)
> +{
> +struct gc_arena gc = gc_new();
> +struct key server_key = { 0 };
> +struct buffer server_key_buf = clear_buf();
> +struct buffer server_key_pem = clear_buf();
> +
> +if (!rand_bytes((void *)_key, sizeof(server_key)))
> +{
> +msg(M_NONFATAL, "ERROR: could not generate random key");
> +goto cleanup;
> +}
> +buf_set_read(_key_buf, (void *)_key, sizeof(server_key));
> +if (!crypto_pem_encode(pem_name, _key_pem,
> + _key_buf, ))
> +{
> +msg(M_WARN, "ERROR: could not PEM-encode key");
> +goto cleanup;
> +}
> +
> +if (!buffer_write_file(filename, _key_pem))
> +{
> +msg(M_ERR, "ERROR: could not write key file");
> +goto cleanup;
> +}
> +
> +cleanup:
> +secure_memzero(_key, sizeof(server_key));
> +buf_clear(_key_pem);
> +gc_free();
> +return;
> +}
> diff --git a/src/openvpn/crypto.h b/src/openvpn/crypto.h
> index 1edde2e3..c0574ff6 100644
> --- a/src/openvpn/crypto.h
> +++ b/src/openvpn/crypto.h
> @@ -420,6 +420,16 @@ void crypto_adjust_frame_parameters(struct frame *frame,
> /** Return the worst-case OpenVPN crypto overhead (in bytes) */
> unsigned int crypto_max_overhead(void);
>
> +/**
> + * Generate a server key with enough randomness to fill a key struct
> + * and write to file.
> + *
> + * @param filename Filename of the server key file to create.
> + * @param pem_name The name to use in the PEM header/footer.
> + */
> +void
> +write_pem_key_file(const char *filename, const char *pem_name);
> +
> /* Minimum length of the nonce used by the PRNG */
> #define NONCE_SECRET_LEN_MIN 16
>
> diff --git a/src/openvpn/tls_crypt.c b/src/openvpn/tls_crypt.c
> index 6bc2b7f8..eeac794b 100644
> --- a/src/openvpn/tls_crypt.c
> +++ b/src/openvpn/tls_crypt.c
> @@ -670,35 +670,7 @@ tls_crypt_v2_extract_client_key(struct buffer *buf,
> void
> tls_crypt_v2_write_server_key_file(const char *filename)
> {
> -struct gc_arena gc = gc_new();
> -struct key server_key = { 0 };
> -struct buffer server_key_buf = clear_buf();
> -struct buffer server_key_pem = clear_buf();
> -
> -if (!rand_bytes((void *)_key, sizeof(server_key)))
> -{
> -msg(M_NONFATAL, "ERROR: could not generate random key");
> -goto cleanup;
> -}
> -buf_set_read(_key_buf, (void *)_key, sizeof(server_key));
> -if (!crypto_pem_encode(tls_crypt_v2_srv_pem_name, _key_pem,
> - _key_buf, ))
> -{
> -msg(M_WARN, "ERROR: could not PEM-encode server key");
> -goto cleanup;
> -}
> -
> -if (!buffer_write_file(filename, _key_pem))
> -{
> -msg(M_ERR, "ERROR: could not write server key file");
> -goto cleanup;
> -}
> -
> -cleanup:
> -secure_memzero(_key, sizeof(server_key));
> -buf_clear(_key_pem);
> -gc_free();
> -return;
> +write_pem_key_file(filename, tls_crypt_v2_srv_pem_name);
> }
>
> void
>
Makes sense, and does what it says on the tin.
Acked-by: Steffan Karger
-Steffan
___
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel