Annotation of embedaddon/axTLS/crypto/bigint_impl.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (c) 2007, Cameron Rich
                      3:  * 
                      4:  * All rights reserved.
                      5:  * 
                      6:  * Redistribution and use in source and binary forms, with or without 
                      7:  * modification, are permitted provided that the following conditions are met:
                      8:  *
                      9:  * * Redistributions of source code must retain the above copyright notice, 
                     10:  *   this list of conditions and the following disclaimer.
                     11:  * * Redistributions in binary form must reproduce the above copyright notice, 
                     12:  *   this list of conditions and the following disclaimer in the documentation 
                     13:  *   and/or other materials provided with the distribution.
                     14:  * * Neither the name of the axTLS project nor the names of its contributors 
                     15:  *   may be used to endorse or promote products derived from this software 
                     16:  *   without specific prior written permission.
                     17:  *
                     18:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
                     19:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
                     20:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
                     21:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
                     22:  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
                     23:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
                     24:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
                     25:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
                     26:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
                     27:  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
                     28:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     29:  */
                     30: 
                     31: #ifndef BIGINT_IMPL_HEADER
                     32: #define BIGINT_IMPL_HEADER
                     33: 
                     34: /* Maintain a number of precomputed variables when doing reduction */
                     35: #define BIGINT_M_OFFSET     0    /**< Normal modulo offset. */
                     36: #ifdef CONFIG_BIGINT_CRT
                     37: #define BIGINT_P_OFFSET     1    /**< p modulo offset. */
                     38: #define BIGINT_Q_OFFSET     2    /**< q module offset. */
                     39: #define BIGINT_NUM_MODS     3    /**< The number of modulus constants used. */
                     40: #else
                     41: #define BIGINT_NUM_MODS     1    
                     42: #endif
                     43: 
                     44: /* Architecture specific functions for big ints */
                     45: #if defined(CONFIG_INTEGER_8BIT)
                     46: #define COMP_RADIX          256U       /**< Max component + 1 */
                     47: #define COMP_MAX            0xFFFFU/**< (Max dbl comp -1) */
                     48: #define COMP_BIT_SIZE       8   /**< Number of bits in a component. */
                     49: #define COMP_BYTE_SIZE      1   /**< Number of bytes in a component. */
                     50: #define COMP_NUM_NIBBLES    2   /**< Used For diagnostics only. */
                     51: typedef uint8_t comp;          /**< A single precision component. */
                     52: typedef uint16_t long_comp;     /**< A double precision component. */
                     53: typedef int16_t slong_comp;     /**< A signed double precision component. */
                     54: #elif defined(CONFIG_INTEGER_16BIT)
                     55: #define COMP_RADIX          65536U       /**< Max component + 1 */
                     56: #define COMP_MAX            0xFFFFFFFFU/**< (Max dbl comp -1) */
                     57: #define COMP_BIT_SIZE       16  /**< Number of bits in a component. */
                     58: #define COMP_BYTE_SIZE      2   /**< Number of bytes in a component. */
                     59: #define COMP_NUM_NIBBLES    4   /**< Used For diagnostics only. */
                     60: typedef uint16_t comp;         /**< A single precision component. */
                     61: typedef uint32_t long_comp;     /**< A double precision component. */
                     62: typedef int32_t slong_comp;     /**< A signed double precision component. */
                     63: #else /* regular 32 bit */
                     64: #ifdef WIN32
                     65: #define COMP_RADIX          4294967296i64         
                     66: #define COMP_MAX            0xFFFFFFFFFFFFFFFFui64
                     67: #else
                     68: #define COMP_RADIX          4294967296ULL         /**< Max component + 1 */
                     69: #define COMP_MAX            0xFFFFFFFFFFFFFFFFULL/**< (Max dbl comp -1) */
                     70: #endif
                     71: #define COMP_BIT_SIZE       32  /**< Number of bits in a component. */
                     72: #define COMP_BYTE_SIZE      4   /**< Number of bytes in a component. */
                     73: #define COMP_NUM_NIBBLES    8   /**< Used For diagnostics only. */
                     74: typedef uint32_t comp;         /**< A single precision component. */
                     75: typedef uint64_t long_comp;     /**< A double precision component. */
                     76: typedef int64_t slong_comp;     /**< A signed double precision component. */
                     77: #endif
                     78: 
                     79: /**
                     80:  * @struct  _bigint
                     81:  * @brief A big integer basic object
                     82:  */
                     83: struct _bigint
                     84: {
                     85:     struct _bigint* next;       /**< The next bigint in the cache. */
                     86:     short size;                 /**< The number of components in this bigint. */
                     87:     short max_comps;            /**< The heapsize allocated for this bigint */
                     88:     int refs;                   /**< An internal reference count. */
                     89:     comp* comps;                /**< A ptr to the actual component data */
                     90: };
                     91: 
                     92: typedef struct _bigint bigint;  /**< An alias for _bigint */
                     93: 
                     94: /**
                     95:  * Maintains the state of the cache, and a number of variables used in 
                     96:  * reduction.
                     97:  */
                     98: typedef struct /**< A big integer "session" context. */
                     99: {
                    100:     bigint *active_list;                    /**< Bigints currently used. */
                    101:     bigint *free_list;                      /**< Bigints not used. */
                    102:     bigint *bi_radix;                       /**< The radix used. */
                    103:     bigint *bi_mod[BIGINT_NUM_MODS];        /**< modulus */
                    104: 
                    105: #if defined(CONFIG_BIGINT_MONTGOMERY)
                    106:     bigint *bi_RR_mod_m[BIGINT_NUM_MODS];   /**< R^2 mod m */
                    107:     bigint *bi_R_mod_m[BIGINT_NUM_MODS];    /**< R mod m */
                    108:     comp N0_dash[BIGINT_NUM_MODS];
                    109: #elif defined(CONFIG_BIGINT_BARRETT)
                    110:     bigint *bi_mu[BIGINT_NUM_MODS];         /**< Storage for mu */
                    111: #endif
                    112:     bigint *bi_normalised_mod[BIGINT_NUM_MODS]; /**< Normalised mod storage. */
                    113:     bigint **g;                 /**< Used by sliding-window. */
                    114:     int window;                 /**< The size of the sliding window */
                    115:     int active_count;           /**< Number of active bigints. */
                    116:     int free_count;             /**< Number of free bigints. */
                    117: 
                    118: #ifdef CONFIG_BIGINT_MONTGOMERY
                    119:     uint8_t use_classical;      /**< Use classical reduction. */
                    120: #endif
                    121:     uint8_t mod_offset;         /**< The mod offset we are using */
                    122: } BI_CTX;
                    123: 
                    124: #ifndef WIN32
                    125: #define max(a,b) ((a)>(b)?(a):(b))  /**< Find the maximum of 2 numbers. */
                    126: #define min(a,b) ((a)<(b)?(a):(b))  /**< Find the minimum of 2 numbers. */
                    127: #endif
                    128: 
                    129: #define PERMANENT           0x7FFF55AA  /**< A magic number for permanents. */
                    130: 
                    131: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>