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