| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- #include "sec_osal_light.h"
- #include "sec_cust_struct.h"
- #include "bgn_internal.h"
- #define MOD "BGN"
- /**************************************************************************
- * INTERNAL DEFINITION
- **************************************************************************/
- #define ASCII_MASK 255
- #define ASCII_0 0x30
- #define ASCII_7 0x37
- #define ASCII_9 0x39
- #define ASCII_A 0x41
- #define ASCII_F 0x46
- #define ASCII_W 0x57
- #define ASCII_a 0x61
- #define ASCII_f 0x66
- /**************************************************************************
- * FUNCTIONS
- **************************************************************************/
- static int bgn_get_digit(ulong *d, int radix, char c)
- {
- *d = ASCII_MASK;
- if (c >= ASCII_0 && c <= ASCII_9)
- *d = c - ASCII_0;
- if (c >= ASCII_A && c <= ASCII_F)
- *d = c - ASCII_7;
- if (c >= ASCII_a && c <= ASCII_f)
- *d = c - ASCII_W;
- if (*d >= (ulong) radix)
- return E_BGN_INVALID_CHARACTER;
- return 0;
- }
- int bgn_read_str(bgn *X, int radix, const char *s, int length)
- {
- int ret, i, j, n, slen;
- ulong d;
- bgn T;
- if (radix < 2 || radix > 16)
- return E_BGN_BAD_INPUT_DATA;
- bgn_init(&T);
- slen = length;
- if (radix == 16) {
- n = B_T_L(slen << 2);
- ret = bgn_grow(X, n);
- if (0 != ret)
- goto _exit;
- ret = bgn_lset(X, 0);
- if (0 != ret)
- goto _exit;
- for (i = slen - 1, j = 0; i >= 0; i--, j++) {
- if (i == 0 && s[i] == '-') {
- X->s = -1;
- break;
- }
- ret = bgn_get_digit(&d, radix, s[i]);
- if (0 != ret)
- goto _exit;
- X->p[j / (2 * ciL)] |= d << ((j % (2 * ciL)) << 2);
- }
- } else {
- ret = bgn_lset(X, 0);
- if (0 != ret)
- goto _exit;
- for (i = 0; i < slen; i++) {
- if (i == 0 && s[i] == '-') {
- X->s = -1;
- continue;
- }
- ret = bgn_get_digit(&d, radix, s[i]);
- if (0 != ret)
- goto _exit;
- ret = bgn_mul_int(&T, X, radix);
- if (0 != ret)
- goto _exit;
- if (X->s == 1) {
- ret = bgn_add_int(X, &T, d);
- if (0 != ret)
- goto _exit;
- } else {
- ret = bgn_sub_int(X, &T, d);
- if (0 != ret)
- goto _exit;
- }
- }
- }
- _exit:
- bgn_free(&T);
- return ret;
- }
- int bgn_read_bin(bgn *X, const unsigned char *buf, int len)
- {
- int ret, i, j, n;
- for (n = 0; n < len; n++) {
- if (buf[n] != 0)
- break;
- }
- ret = bgn_grow(X, C_T_L(len - n));
- if (0 != ret)
- goto _exit;
- ret = bgn_lset(X, 0);
- if (0 != ret)
- goto _exit;
- for (i = len - 1, j = 0; i >= n; i--, j++)
- X->p[j / ciL] |= ((ulong) buf[i]) << ((j % ciL) << 3);
- _exit:
- return ret;
- }
- int bgn_write_bin(const bgn *X, unsigned char *buf, int len)
- {
- int i, j, n;
- n = bgn_size(X);
- if (len < n)
- return E_BGN_BUFFER_TOO_SMALL;
- memset(buf, 0, len);
- for (i = len - 1, j = 0; n > 0; i--, j++, n--)
- buf[i] = (unsigned char) (X->p[j / ciL] >> ((j % ciL) << 3));
- return 0;
- }
|