summaryrefslogtreecommitdiffstats
path: root/libtommath/bn_mp_to_ubin.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2019-10-07 11:37:36 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2019-10-07 11:37:36 (GMT)
commit1e29c4f4ad0ec8903b99967d45b6ea0ea76c6111 (patch)
tree2312b71d74326ff86bcbd4acecb0f10a1c0ad63c /libtommath/bn_mp_to_ubin.c
parent1cb1fee6edc063cb49beb0188c2a3db4771846fa (diff)
downloadtcl-1e29c4f4ad0ec8903b99967d45b6ea0ea76c6111.zip
tcl-1e29c4f4ad0ec8903b99967d45b6ea0ea76c6111.tar.gz
tcl-1e29c4f4ad0ec8903b99967d45b6ea0ea76c6111.tar.bz2
Update to latest "develop" branch
Diffstat (limited to 'libtommath/bn_mp_to_ubin.c')
-rw-r--r--libtommath/bn_mp_to_ubin.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/libtommath/bn_mp_to_ubin.c b/libtommath/bn_mp_to_ubin.c
new file mode 100644
index 0000000..d359986
--- /dev/null
+++ b/libtommath/bn_mp_to_ubin.c
@@ -0,0 +1,50 @@
+#include "tommath_private.h"
+#ifdef BN_MP_TO_UBIN_C
+/* LibTomMath, multiple-precision integer library -- Tom St Denis */
+/* SPDX-License-Identifier: Unlicense */
+
+/* store in unsigned [big endian] format */
+mp_err mp_to_ubin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *written)
+{
+ size_t x;
+ mp_err err;
+ mp_int t;
+
+ if (buf == NULL) {
+ return MP_MEM;
+ }
+
+ if (maxlen == 0u) {
+ return MP_VAL;
+ }
+
+ if ((err = mp_init_copy(&t, a)) != MP_OKAY) {
+ return err;
+ }
+
+ x = 0u;
+ while (!MP_IS_ZERO(&t)) {
+ if (maxlen == 0u) {
+ err = MP_VAL;
+ goto LBL_ERR;
+ }
+ maxlen--;
+#ifndef MP_8BIT
+ buf[x++] = (unsigned char)(t.dp[0] & 255u);
+#else
+ buf[x++] = (unsigned char)(t.dp[0] | ((t.dp[1] & 1u) << 7));
+#endif
+ if ((err = mp_div_2d(&t, 8, &t, NULL)) != MP_OKAY) {
+ goto LBL_ERR;
+ }
+ }
+ s_mp_reverse(buf, x);
+
+ if (written != NULL) {
+ *written = x;
+ }
+LBL_ERR:
+ mp_clear(&t);
+ return err;
+}
+#endif