bn.h revision 1.1 1 1.1 nonaka /* $NetBSD: bn.h,v 1.1 2017/02/13 11:16:46 nonaka Exp $ */
2 1.1 nonaka
3 1.1 nonaka /*-
4 1.1 nonaka * Copyright (c) 2012 Alistair Crooks <agc (at) NetBSD.org>
5 1.1 nonaka * All rights reserved.
6 1.1 nonaka *
7 1.1 nonaka * Redistribution and use in source and binary forms, with or without
8 1.1 nonaka * modification, are permitted provided that the following conditions
9 1.1 nonaka * are met:
10 1.1 nonaka * 1. Redistributions of source code must retain the above copyright
11 1.1 nonaka * notice, this list of conditions and the following disclaimer.
12 1.1 nonaka * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 nonaka * notice, this list of conditions and the following disclaimer in the
14 1.1 nonaka * documentation and/or other materials provided with the distribution.
15 1.1 nonaka *
16 1.1 nonaka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 1.1 nonaka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 1.1 nonaka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 1.1 nonaka * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 1.1 nonaka * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 1.1 nonaka * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 1.1 nonaka * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 1.1 nonaka * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 1.1 nonaka * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 1.1 nonaka * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 1.1 nonaka */
27 1.1 nonaka
28 1.1 nonaka #ifndef FAUXBN_H_
29 1.1 nonaka #define FAUXBN_H_ 20100108
30 1.1 nonaka
31 1.1 nonaka #include <sys/types.h>
32 1.1 nonaka #include <inttypes.h>
33 1.1 nonaka #include <stdio.h>
34 1.1 nonaka
35 1.1 nonaka #ifndef __BEGIN_DECLS
36 1.1 nonaka # if defined(__cplusplus)
37 1.1 nonaka # define __BEGIN_DECLS extern "C" {
38 1.1 nonaka # define __END_DECLS }
39 1.1 nonaka # else
40 1.1 nonaka # define __BEGIN_DECLS
41 1.1 nonaka # define __END_DECLS
42 1.1 nonaka # endif
43 1.1 nonaka #endif
44 1.1 nonaka
45 1.1 nonaka __BEGIN_DECLS
46 1.1 nonaka
47 1.1 nonaka /* should be 32bit on ILP32, 64bit on LP64 */
48 1.1 nonaka typedef unsigned long mp_digit;
49 1.1 nonaka typedef uint64_t mp_word;
50 1.1 nonaka
51 1.1 nonaka /* multi-precision integer */
52 1.1 nonaka typedef struct mp_int {
53 1.1 nonaka mp_digit *dp; /* array of digits */
54 1.1 nonaka int used; /* # of digits used */
55 1.1 nonaka int alloc; /* # of digits allocated */
56 1.1 nonaka int sign; /* non-zero if negative */
57 1.1 nonaka } mp_int;
58 1.1 nonaka
59 1.1 nonaka #define BIGNUM mp_int
60 1.1 nonaka #define BN_ULONG mp_digit
61 1.1 nonaka
62 1.1 nonaka /* a "context" of mp integers - never really used */
63 1.1 nonaka typedef struct bn_ctx_t {
64 1.1 nonaka size_t count;
65 1.1 nonaka size_t arraysize;
66 1.1 nonaka BIGNUM **v;
67 1.1 nonaka } BN_CTX;
68 1.1 nonaka
69 1.1 nonaka #define MP_LT -1
70 1.1 nonaka #define MP_EQ 0
71 1.1 nonaka #define MP_GT 1
72 1.1 nonaka
73 1.1 nonaka #define MP_ZPOS 0
74 1.1 nonaka #define MP_NEG 1
75 1.1 nonaka
76 1.1 nonaka #define MP_OKAY 0
77 1.1 nonaka #define MP_MEM -2
78 1.1 nonaka #define MP_VAL -3
79 1.1 nonaka #define MP_RANGE MP_VAL
80 1.1 nonaka
81 1.1 nonaka /*********************************/
82 1.1 nonaka
83 1.1 nonaka #define BN_is_negative(x) ((x)->sign == MP_NEG)
84 1.1 nonaka #define BN_is_zero(a) (((a)->used == 0) ? 1 : 0)
85 1.1 nonaka #define BN_is_odd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? 1 : 0)
86 1.1 nonaka #define BN_is_even(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? 1 : 0)
87 1.1 nonaka
88 1.1 nonaka BIGNUM *BN_new(void);
89 1.1 nonaka BIGNUM *BN_dup(const BIGNUM */*a*/);
90 1.1 nonaka int BN_copy(BIGNUM */*b*/, const BIGNUM */*a*/);
91 1.1 nonaka
92 1.1 nonaka void BN_init(BIGNUM */*a*/);
93 1.1 nonaka void BN_free(BIGNUM */*a*/);
94 1.1 nonaka void BN_clear(BIGNUM */*a*/);
95 1.1 nonaka void BN_clear_free(BIGNUM */*a*/);
96 1.1 nonaka
97 1.1 nonaka int BN_cmp(BIGNUM */*a*/, BIGNUM */*b*/);
98 1.1 nonaka
99 1.1 nonaka BIGNUM *BN_bin2bn(const uint8_t */*buf*/, int /*size*/, BIGNUM */*bn*/);
100 1.1 nonaka int BN_bn2bin(const BIGNUM */*a*/, unsigned char */*b*/);
101 1.1 nonaka char *BN_bn2hex(const BIGNUM */*a*/);
102 1.1 nonaka char *BN_bn2dec(const BIGNUM */*a*/);
103 1.1 nonaka char *BN_bn2radix(const BIGNUM */*a*/, unsigned /*radix*/);
104 1.1 nonaka int BN_hex2bn(BIGNUM **/*a*/, const char */*str*/);
105 1.1 nonaka int BN_dec2bn(BIGNUM **/*a*/, const char */*str*/);
106 1.1 nonaka int BN_radix2bn(BIGNUM **/*a*/, const char */*str*/, unsigned /*radix*/);
107 1.1 nonaka int BN_print_fp(FILE */*fp*/, const BIGNUM */*a*/);
108 1.1 nonaka
109 1.1 nonaka int BN_add(BIGNUM */*r*/, const BIGNUM */*a*/, const BIGNUM */*b*/);
110 1.1 nonaka int BN_sub(BIGNUM */*r*/, const BIGNUM */*a*/, const BIGNUM */*b*/);
111 1.1 nonaka int BN_mul(BIGNUM */*r*/, const BIGNUM */*a*/, const BIGNUM */*b*/, BN_CTX */*ctx*/);
112 1.1 nonaka int BN_div(BIGNUM */*q*/, BIGNUM */*r*/, const BIGNUM */*a*/, const BIGNUM */*b*/, BN_CTX */*ctx*/);
113 1.1 nonaka void BN_swap(BIGNUM */*a*/, BIGNUM */*b*/);
114 1.1 nonaka int BN_bitop(BIGNUM */*r*/, const BIGNUM */*a*/, char /*op*/, const BIGNUM */*b*/);
115 1.1 nonaka int BN_lshift(BIGNUM */*r*/, const BIGNUM */*a*/, int /*n*/);
116 1.1 nonaka int BN_lshift1(BIGNUM */*r*/, BIGNUM */*a*/);
117 1.1 nonaka int BN_rshift(BIGNUM */*r*/, const BIGNUM */*a*/, int /*n*/);
118 1.1 nonaka int BN_rshift1(BIGNUM */*r*/, BIGNUM */*a*/);
119 1.1 nonaka int BN_set_word(BIGNUM */*a*/, BN_ULONG /*w*/);
120 1.1 nonaka void BN_set_negative(BIGNUM */*a*/, int /*n*/);
121 1.1 nonaka
122 1.1 nonaka int BN_num_bytes(const BIGNUM */*a*/);
123 1.1 nonaka int BN_num_bits(const BIGNUM */*a*/);
124 1.1 nonaka
125 1.1 nonaka int BN_mod_exp(BIGNUM */*r*/, BIGNUM */*a*/, BIGNUM */*p*/, BIGNUM */*m*/, BN_CTX */*ctx*/);
126 1.1 nonaka BIGNUM *BN_mod_inverse(BIGNUM */*ret*/, BIGNUM */*a*/, const BIGNUM */*n*/, BN_CTX */*ctx*/);
127 1.1 nonaka int BN_mod_mul(BIGNUM */*ret*/, BIGNUM */*a*/, BIGNUM */*b*/, const BIGNUM */*m*/, BN_CTX */*ctx*/);
128 1.1 nonaka int BN_mod_sub(BIGNUM */*r*/, BIGNUM */*a*/, BIGNUM */*b*/, const BIGNUM */*m*/, BN_CTX */*ctx*/);
129 1.1 nonaka
130 1.1 nonaka int BN_raise(BIGNUM */*res*/, BIGNUM */*a*/, BIGNUM */*b*/);
131 1.1 nonaka int BN_factorial(BIGNUM */*fact*/, BIGNUM */*f*/);
132 1.1 nonaka
133 1.1 nonaka BN_CTX *BN_CTX_new(void);
134 1.1 nonaka BIGNUM *BN_CTX_get(BN_CTX */*ctx*/);
135 1.1 nonaka void BN_CTX_start(BN_CTX */*ctx*/);
136 1.1 nonaka void BN_CTX_end(BN_CTX */*ctx*/);
137 1.1 nonaka void BN_CTX_init(BN_CTX */*c*/);
138 1.1 nonaka void BN_CTX_free(BN_CTX */*c*/);
139 1.1 nonaka
140 1.1 nonaka int BN_rand(BIGNUM */*rnd*/, int /*bits*/, int /*top*/, int /*bottom*/);
141 1.1 nonaka int BN_rand_range(BIGNUM */*rnd*/, BIGNUM */*range*/);
142 1.1 nonaka
143 1.1 nonaka int BN_is_prime(const BIGNUM */*a*/, int /*checks*/, void (*callback)(int, int, void *), BN_CTX */*ctx*/, void */*cb_arg*/);
144 1.1 nonaka
145 1.1 nonaka const BIGNUM *BN_value_one(void);
146 1.1 nonaka int BN_is_bit_set(const BIGNUM */*a*/, int /*n*/);
147 1.1 nonaka
148 1.1 nonaka int BN_gcd(BIGNUM */*r*/, BIGNUM */*a*/, BIGNUM */*b*/, BN_CTX */*ctx*/);
149 1.1 nonaka
150 1.1 nonaka /* utilities */
151 1.1 nonaka int humanize_bignum(char *, size_t, const BIGNUM *, const char *, int, int);
152 1.1 nonaka
153 1.1 nonaka __END_DECLS
154 1.1 nonaka
155 1.1 nonaka #endif
156