Module Name:    src
Committed By:   christos
Date:           Sun Oct  4 19:32:48 UTC 2020

Modified Files:
        src/crypto/external/bsd/openssl/dist/crypto/bn: bn_print.c
        src/crypto/external/bsd/openssl/dist/include/openssl: bn.h
        src/crypto/external/bsd/openssl/lib/libcrypto: crypto.map

Log Message:
Add BN_oct2bn(3) for factor(6)


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.10 -r1.2 \
    src/crypto/external/bsd/openssl/dist/crypto/bn/bn_print.c
cvs rdiff -u -r1.1.1.3 -r1.2 \
    src/crypto/external/bsd/openssl/dist/include/openssl/bn.h
cvs rdiff -u -r1.8 -r1.9 \
    src/crypto/external/bsd/openssl/lib/libcrypto/crypto.map

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/crypto/external/bsd/openssl/dist/crypto/bn/bn_print.c
diff -u src/crypto/external/bsd/openssl/dist/crypto/bn/bn_print.c:1.1.1.10 src/crypto/external/bsd/openssl/dist/crypto/bn/bn_print.c:1.2
--- src/crypto/external/bsd/openssl/dist/crypto/bn/bn_print.c:1.1.1.10	Sat Mar 21 20:49:05 2020
+++ src/crypto/external/bsd/openssl/dist/crypto/bn/bn_print.c	Sun Oct  4 15:32:48 2020
@@ -266,6 +266,87 @@ int BN_dec2bn(BIGNUM **bn, const char *a
     return 0;
 }
 
+int BN_oct2bn(BIGNUM **bn, const char *a)
+{
+    BIGNUM *ret = NULL;
+    BN_ULONG l = 0;
+    int neg = 0, h, m, i, j, b, k, c, r;
+    int num;
+
+    if (a == NULL || *a == '\0')
+        return 0;
+
+    if (*a == '-') {
+        neg = 1;
+        a++;
+    }
+
+    for (i = 0; i <= INT_MAX / 4 && ossl_isdigit(a[i]) && a[i] < '8'; i++)
+        continue;
+
+    if (i == 0 || i > INT_MAX / 4)
+        goto err;
+
+    num = i + neg;
+    if (bn == NULL)
+        return num;
+
+    /* a is the start of the hex digits, and it is 'i' long */
+    if (*bn == NULL) {
+        if ((ret = BN_new()) == NULL)
+            return 0;
+    } else {
+        ret = *bn;
+        BN_zero(ret);
+    }
+
+    /* i is the number of hex digits */
+    if (bn_expand(ret, i * 4) == NULL)
+        goto err;
+
+    j = i;                      /* least significant 'oct' */
+    h = 0;
+    b = 0;
+#define M (BN_BYTES * 8 / 3)
+    while (j > 0) {
+        m = (M <= j) ? M : j;
+	while (m > 0) {
+	    k = a[j - m] - '0';
+	    l = (l << 3) | k;
+	    b += 3;
+	    m--;
+	}
+        j -= M;
+	if (j <= 0) {
+	    ret->d[h++] = l;
+	    break;
+	}
+	b = BN_BYTES * 8 - b;
+	r = 3 - b;
+	k = a[j--] - '0';
+	l = (l << r) | (k >> b);
+	ret->d[h++] = l;
+	l = k & ((2 << r) - 1);
+	if (j == 0) {
+	    ret->d[h++] = l;
+	    break;
+	}
+    }
+    ret->top = h;
+    bn_correct_top(ret);
+
+    *bn = ret;
+    bn_check_top(ret);
+    /* Don't set the negative flag if it's zero. */
+    if (ret->top != 0)
+        ret->neg = neg;
+    return num;
+ err:
+    if (*bn == NULL)
+        BN_free(ret);
+    return 0;
+}
+
 int BN_asc2bn(BIGNUM **bn, const char *a)
 {
     const char *p = a;
@@ -273,9 +354,14 @@ int BN_asc2bn(BIGNUM **bn, const char *a
     if (*p == '-')
         p++;
 
-    if (p[0] == '0' && (p[1] == 'X' || p[1] == 'x')) {
-        if (!BN_hex2bn(bn, p + 2))
-            return 0;
+    if (p[0] == '0') {
+	if (p[1] == 'X' || p[1] == 'x') {
+	    if (!BN_hex2bn(bn, p + 2))
+		return 0;
+	} else {
+	    if (!BN_oct2bn(bn, p + 1))
+		return 0;
+	}
     } else {
         if (!BN_dec2bn(bn, p))
             return 0;

Index: src/crypto/external/bsd/openssl/dist/include/openssl/bn.h
diff -u src/crypto/external/bsd/openssl/dist/include/openssl/bn.h:1.1.1.3 src/crypto/external/bsd/openssl/dist/include/openssl/bn.h:1.2
--- src/crypto/external/bsd/openssl/dist/include/openssl/bn.h:1.1.1.3	Sun Sep 23 09:17:50 2018
+++ src/crypto/external/bsd/openssl/dist/include/openssl/bn.h	Sun Oct  4 15:32:48 2020
@@ -310,6 +310,7 @@ char *BN_bn2hex(const BIGNUM *a);
 char *BN_bn2dec(const BIGNUM *a);
 int BN_hex2bn(BIGNUM **a, const char *str);
 int BN_dec2bn(BIGNUM **a, const char *str);
+int BN_oct2bn(BIGNUM **a, const char *str);
 int BN_asc2bn(BIGNUM **a, const char *str);
 int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
 int BN_kronecker(const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); /* returns

Index: src/crypto/external/bsd/openssl/lib/libcrypto/crypto.map
diff -u src/crypto/external/bsd/openssl/lib/libcrypto/crypto.map:1.8 src/crypto/external/bsd/openssl/lib/libcrypto/crypto.map:1.9
--- src/crypto/external/bsd/openssl/lib/libcrypto/crypto.map:1.8	Sat Mar 21 20:53:11 2020
+++ src/crypto/external/bsd/openssl/lib/libcrypto/crypto.map	Sun Oct  4 15:32:48 2020
@@ -552,6 +552,7 @@ OPENSSL_1_1_0 {
         BN_nnmod;
         BN_num_bits;
         BN_num_bits_word;
+	BN_oct2bn;
         BN_options;
         BN_print;
         BN_print_fp;

Reply via email to