Alexandre Lision | 7fd5d3d | 2013-12-04 13:06:40 -0500 | [diff] [blame] | 1 | /* |
| 2 | * bn.c - the high-level bignum interface |
| 3 | * |
| 4 | * Copyright (c) 1995 Colin Plumb. All rights reserved. |
| 5 | * For licensing and other legal details, see the file legal.c. |
| 6 | */ |
| 7 | |
| 8 | #include <bn.h> |
| 9 | |
| 10 | /* Functions */ |
| 11 | void |
| 12 | bnBegin(struct BigNum *bn) |
| 13 | { |
| 14 | static int bninit = 0; |
| 15 | |
| 16 | if (!bninit) { |
| 17 | bnInit(); |
| 18 | bninit = 1; |
| 19 | } |
| 20 | |
| 21 | bn->ptr = 0; |
| 22 | bn->size = 0; |
| 23 | bn->allocated = 0; |
| 24 | } |
| 25 | |
| 26 | void |
| 27 | bnSwap(struct BigNum *a, struct BigNum *b) |
| 28 | { |
| 29 | void *p; |
| 30 | unsigned t; |
| 31 | |
| 32 | p = a->ptr; |
| 33 | a->ptr = b->ptr; |
| 34 | b->ptr = p; |
| 35 | |
| 36 | t = a->size; |
| 37 | a->size = b->size; |
| 38 | b->size = t; |
| 39 | |
| 40 | t = a->allocated; |
| 41 | a->allocated = b->allocated; |
| 42 | b->allocated = t; |
| 43 | } |
| 44 | |
| 45 | int (*bnYield)(void); |
| 46 | |
| 47 | void (*bnEnd)(struct BigNum *bn); |
| 48 | int (*bnPrealloc)(struct BigNum *bn, unsigned bits); |
| 49 | int (*bnCopy)(struct BigNum *dest, struct BigNum const *src); |
| 50 | void (*bnNorm)(struct BigNum *bn); |
| 51 | void (*bnExtractBigBytes)(struct BigNum const *bn, unsigned char *dest, |
| 52 | unsigned lsbyte, unsigned len); |
| 53 | int (*bnInsertBigBytes)(struct BigNum *bn, unsigned char const *src, |
| 54 | unsigned lsbyte, unsigned len); |
| 55 | void (*bnExtractLittleBytes)(struct BigNum const *bn, unsigned char *dest, |
| 56 | unsigned lsbyte, unsigned len); |
| 57 | int (*bnInsertLittleBytes)(struct BigNum *bn, unsigned char const *src, |
| 58 | unsigned lsbyte, unsigned len); |
| 59 | unsigned (*bnLSWord)(struct BigNum const *src); |
| 60 | int (*bnReadBit)(struct BigNum const *bn, unsigned bit); |
| 61 | unsigned (*bnBits)(struct BigNum const *src); |
| 62 | int (*bnAdd)(struct BigNum *dest, struct BigNum const *src); |
| 63 | int (*bnSub)(struct BigNum *dest, struct BigNum const *src); |
| 64 | int (*bnCmpQ)(struct BigNum const *a, unsigned b); |
| 65 | int (*bnSetQ)(struct BigNum *dest, unsigned src); |
| 66 | int (*bnAddQ)(struct BigNum *dest, unsigned src); |
| 67 | int (*bnSubQ)(struct BigNum *dest, unsigned src); |
| 68 | int (*bnCmp)(struct BigNum const *a, struct BigNum const *b); |
| 69 | int (*bnSquare)(struct BigNum *dest, struct BigNum const *src); |
| 70 | int (*bnMul)(struct BigNum *dest, struct BigNum const *a, |
| 71 | struct BigNum const *b); |
| 72 | int (*bnMulQ)(struct BigNum *dest, struct BigNum const *a, unsigned b); |
| 73 | int (*bnDivMod)(struct BigNum *q, struct BigNum *r, struct BigNum const *n, |
| 74 | struct BigNum const *d); |
| 75 | int (*bnMod)(struct BigNum *dest, struct BigNum const *src, |
| 76 | struct BigNum const *d); |
| 77 | unsigned (*bnModQ)(struct BigNum const *src, unsigned d); |
| 78 | int (*bnExpMod)(struct BigNum *result, struct BigNum const *n, |
| 79 | struct BigNum const *exp, struct BigNum const *mod); |
| 80 | int (*bnDoubleExpMod)(struct BigNum *dest, |
| 81 | struct BigNum const *n1, struct BigNum const *e1, |
| 82 | struct BigNum const *n2, struct BigNum const *e2, |
| 83 | struct BigNum const *mod); |
| 84 | int (*bnTwoExpMod)(struct BigNum *n, struct BigNum const *exp, |
| 85 | struct BigNum const *mod); |
| 86 | int (*bnGcd)(struct BigNum *dest, struct BigNum const *a, |
| 87 | struct BigNum const *b); |
| 88 | int (*bnInv)(struct BigNum *dest, struct BigNum const *src, |
| 89 | struct BigNum const *mod); |
| 90 | int (*bnLShift)(struct BigNum *dest, unsigned amt); |
| 91 | void (*bnRShift)(struct BigNum *dest, unsigned amt); |
| 92 | unsigned (*bnMakeOdd)(struct BigNum *n); |
| 93 | int (*bnBasePrecompBegin)(struct BnBasePrecomp *pre, struct BigNum const *base, |
| 94 | struct BigNum const *mod, unsigned maxebits); |
| 95 | int (*bnBasePrecompCopy)(struct BnBasePrecomp *dst, |
| 96 | struct BnBasePrecomp const *src); |
| 97 | void (*bnBasePrecompEnd)(struct BnBasePrecomp *pre); |
| 98 | int (*bnBasePrecompExpMod)(struct BigNum *dest, |
| 99 | struct BnBasePrecomp const *pre, struct BigNum const *exp, |
| 100 | struct BigNum const *mod); |
| 101 | int (*bnDoubleBasePrecompExpMod)(struct BigNum *dest, |
| 102 | struct BnBasePrecomp const *pre1, struct BigNum const *exp1, |
| 103 | struct BnBasePrecomp const *pre2, struct BigNum const *exp2, |
| 104 | struct BigNum const *mod); |