summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2017-07-14 09:10:11 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2017-09-11 16:57:05 +0200
commit61c645e3e515ffb2c1d130728be5dc87ad3900fc (patch)
tree81a032359fc8af0649e16d0e4d4e384363983841
parentd298788b3d65152ec4c146f3a4410b4b83ab85d9 (diff)
downloadgnutls-61c645e3e515ffb2c1d130728be5dc87ad3900fc.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);