summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2017-07-14 09:10:11 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2017-08-22 15:41:46 +0200
commita67d911d4abca595d34774105fb055ac8a711533 (patch)
treee52b11790bee21e28fbbc096670fe523e95a0c8e
parentd289b970c16d6fca32301abefdd5a9ced7b41463 (diff)
downloadgnutls-a67d911d4abca595d34774105fb055ac8a711533.tar.gz
str: added function to append fixed-size MPI
This is used in TLS 1.3 which introduces a new MPI over-the-wire format. Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
-rw-r--r--lib/str.c37
-rw-r--r--lib/str.h4
2 files changed, 41 insertions, 0 deletions
diff --git a/lib/str.c b/lib/str.c
index e10ecd4802..1c87a277ab 100644
--- a/lib/str.c
+++ b/lib/str.c
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2002-2012 Free Software Foundation, Inc.
+ * Copyright (C) 2016-2017 Red Hat, Inc.
*
* Author: Nikos Mavrogiannopoulos
*
@@ -869,6 +870,42 @@ int _gnutls_buffer_append_mpi(gnutls_buffer_st * buf, int pfx_size,
return ret;
}
+/* Appends an MPI of fixed-size in bytes left-padded with zeros if necessary */
+int _gnutls_buffer_append_fixed_mpi(gnutls_buffer_st * buf,
+ bigint_t mpi, unsigned size)
+{
+ gnutls_datum_t dd;
+ unsigned pad, i;
+ int ret;
+
+ ret = _gnutls_mpi_dprint(mpi, &dd);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
+ if (size < dd.size) {
+ ret = gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+ goto cleanup;
+ }
+
+ pad = size - dd.size;
+ for (i=0;i<pad;i++) {
+ ret =
+ _gnutls_buffer_append_data(buf, "\x00", 1);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+ }
+
+ /* append the rest */
+ ret =
+ _gnutls_buffer_append_data(buf, dd.data, dd.size);
+
+ cleanup:
+ _gnutls_free_datum(&dd);
+ return ret;
+}
+
void
_gnutls_buffer_hexprint(gnutls_buffer_st * str,
const void *_data, size_t len)
diff --git a/lib/str.h b/lib/str.h
index 134d5df89f..a51f6d7d6f 100644
--- a/lib/str.h
+++ b/lib/str.h
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2000-2012 Free Software Foundation, Inc.
+ * Copyright (C) 2016-2017 Red Hat, Inc.
*
* Author: Nikos Mavrogiannopoulos
*
@@ -109,6 +110,9 @@ int _gnutls_buffer_append_prefix(gnutls_buffer_st * buf, int pfx_size,
int _gnutls_buffer_append_mpi(gnutls_buffer_st * buf, int pfx_size,
bigint_t, int lz);
+int _gnutls_buffer_append_fixed_mpi(gnutls_buffer_st * buf,
+ bigint_t mpi, unsigned size);
+
int _gnutls_buffer_append_data_prefix(gnutls_buffer_st * buf, int pfx_size,
const void *data, size_t data_size);
void _gnutls_buffer_pop_data(gnutls_buffer_st *, void *, size_t * size);