summaryrefslogtreecommitdiff
path: root/lib/str.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/str.c')
-rw-r--r--lib/str.c37
1 files changed, 37 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)