#include "inner.h"
-/*
- * This file contains some additional functions for "i15" big integers.
- * These functions are needed to support ECDSA.
- */
-
-/* see inner.h */
-void
-br_i15_rshift(uint16_t *x, int count)
-{
- size_t u, len;
- unsigned r;
-
- len = (x[0] + 15) >> 4;
- if (len == 0) {
- return;
- }
- r = x[1] >> count;
- for (u = 2; u <= len; u ++) {
- unsigned w;
-
- w = x[u];
- x[u - 1] = ((w << (15 - count)) | r) & 0x7FFF;
- r = w >> count;
- }
- x[len] = r;
-}
-
-/* see inner.h */
-uint32_t
-br_i15_bit_length(uint16_t *x, size_t xlen)
-{
- uint32_t tw, twk;
-
- tw = 0;
- twk = 0;
- while (xlen -- > 0) {
- uint32_t w, c;
-
- c = EQ(tw, 0);
- w = x[xlen];
- tw = MUX(c, w, tw);
- twk = MUX(c, (uint32_t)xlen, twk);
- }
- return (twk << 4) + BIT_LENGTH(tw);
-}
-
-/* see inner.h */
-void
-br_i15_decode(uint16_t *x, const void *src, size_t len)
-{
- const unsigned char *buf;
- size_t v;
- uint32_t acc;
- int acc_len;
-
- buf = src;
- v = 1;
- acc = 0;
- acc_len = 0;
- while (len -- > 0) {
- uint32_t b;
-
- b = buf[len];
- acc |= (b << acc_len);
- acc_len += 8;
- if (acc_len >= 15) {
- x[v ++] = acc & 0x7FFF;
- acc_len -= 15;
- acc >>= 15;
- }
- }
- if (acc_len != 0) {
- x[v ++] = acc;
- }
- x[0] = br_i15_bit_length(x + 1, v - 1);
-}
-
/* see inner.h */
void
br_i15_from_monty(uint16_t *x, const uint16_t *m, uint16_t m0i)