bgn_io.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #include "sec_osal_light.h"
  2. #include "sec_cust_struct.h"
  3. #include "bgn_internal.h"
  4. #define MOD "BGN"
  5. /**************************************************************************
  6. * INTERNAL DEFINITION
  7. **************************************************************************/
  8. #define ASCII_MASK 255
  9. #define ASCII_0 0x30
  10. #define ASCII_7 0x37
  11. #define ASCII_9 0x39
  12. #define ASCII_A 0x41
  13. #define ASCII_F 0x46
  14. #define ASCII_W 0x57
  15. #define ASCII_a 0x61
  16. #define ASCII_f 0x66
  17. /**************************************************************************
  18. * FUNCTIONS
  19. **************************************************************************/
  20. static int bgn_get_digit(ulong *d, int radix, char c)
  21. {
  22. *d = ASCII_MASK;
  23. if (c >= ASCII_0 && c <= ASCII_9)
  24. *d = c - ASCII_0;
  25. if (c >= ASCII_A && c <= ASCII_F)
  26. *d = c - ASCII_7;
  27. if (c >= ASCII_a && c <= ASCII_f)
  28. *d = c - ASCII_W;
  29. if (*d >= (ulong) radix)
  30. return E_BGN_INVALID_CHARACTER;
  31. return 0;
  32. }
  33. int bgn_read_str(bgn *X, int radix, const char *s, int length)
  34. {
  35. int ret, i, j, n, slen;
  36. ulong d;
  37. bgn T;
  38. if (radix < 2 || radix > 16)
  39. return E_BGN_BAD_INPUT_DATA;
  40. bgn_init(&T);
  41. slen = length;
  42. if (radix == 16) {
  43. n = B_T_L(slen << 2);
  44. ret = bgn_grow(X, n);
  45. if (0 != ret)
  46. goto _exit;
  47. ret = bgn_lset(X, 0);
  48. if (0 != ret)
  49. goto _exit;
  50. for (i = slen - 1, j = 0; i >= 0; i--, j++) {
  51. if (i == 0 && s[i] == '-') {
  52. X->s = -1;
  53. break;
  54. }
  55. ret = bgn_get_digit(&d, radix, s[i]);
  56. if (0 != ret)
  57. goto _exit;
  58. X->p[j / (2 * ciL)] |= d << ((j % (2 * ciL)) << 2);
  59. }
  60. } else {
  61. ret = bgn_lset(X, 0);
  62. if (0 != ret)
  63. goto _exit;
  64. for (i = 0; i < slen; i++) {
  65. if (i == 0 && s[i] == '-') {
  66. X->s = -1;
  67. continue;
  68. }
  69. ret = bgn_get_digit(&d, radix, s[i]);
  70. if (0 != ret)
  71. goto _exit;
  72. ret = bgn_mul_int(&T, X, radix);
  73. if (0 != ret)
  74. goto _exit;
  75. if (X->s == 1) {
  76. ret = bgn_add_int(X, &T, d);
  77. if (0 != ret)
  78. goto _exit;
  79. } else {
  80. ret = bgn_sub_int(X, &T, d);
  81. if (0 != ret)
  82. goto _exit;
  83. }
  84. }
  85. }
  86. _exit:
  87. bgn_free(&T);
  88. return ret;
  89. }
  90. int bgn_read_bin(bgn *X, const unsigned char *buf, int len)
  91. {
  92. int ret, i, j, n;
  93. for (n = 0; n < len; n++) {
  94. if (buf[n] != 0)
  95. break;
  96. }
  97. ret = bgn_grow(X, C_T_L(len - n));
  98. if (0 != ret)
  99. goto _exit;
  100. ret = bgn_lset(X, 0);
  101. if (0 != ret)
  102. goto _exit;
  103. for (i = len - 1, j = 0; i >= n; i--, j++)
  104. X->p[j / ciL] |= ((ulong) buf[i]) << ((j % ciL) << 3);
  105. _exit:
  106. return ret;
  107. }
  108. int bgn_write_bin(const bgn *X, unsigned char *buf, int len)
  109. {
  110. int i, j, n;
  111. n = bgn_size(X);
  112. if (len < n)
  113. return E_BGN_BUFFER_TOO_SMALL;
  114. memset(buf, 0, len);
  115. for (i = len - 1, j = 0; n > 0; i--, j++, n--)
  116. buf[i] = (unsigned char) (X->p[j / ciL] >> ((j % ciL) << 3));
  117. return 0;
  118. }