/* $Id$ */ /* * Copyright (C) 1998-2002 RSA Security Inc. All rights reserved. * * This work contains proprietary information of RSA Security. * Distribution is limited to authorized licensees of RSA * Security. Any unauthorized reproduction, distribution or * modification of this work is strictly prohibited. * */ /***************************************************************************** * Copyright (c). 2001 RSA Security Inc. All rights reserved. * This work contains proprietary information of RSA Security. * Distribution is limited to authorized licensees of RSA * Security. Any unauthorized reproduction, distribution or * modification of this work is strictly prohibited. ****************************************************************************/ /** * @file bn_thx.h * @brief header file created for used as interface defines for systems * containing hetergeneous environments where some bn operations * will be performed in isolation from the rest of the library */ #ifndef HEADER_COMMON_BN_THX_H #define HEADER_COMMON_BN_THX_H #ifdef __cplusplus extern "C" { #endif /* These defines are required on systems so that the mod_exp code * to be used in isolation from the bn operation with library will work, * if these are not available, the header files with equivalent functionality * should be added inside a CPU or Operating system define */ #ifndef NO_STDIO_H #include #endif #ifndef NO_STDLIB_H #include #endif #ifndef NO_STRING_H #include #endif /* Interface for ARM/DSP systems, this interface requires only * the standard defines and includes at the moment */ #ifdef CPU_TMS320 #define THX_RECIPIENT #define CPU_DSP #endif #ifdef THX_RECIPIENT #ifndef restrict #define restrict #endif #ifndef Malloc #define Malloc malloc #endif #ifndef Memcpy #define Memcpy memcpy #endif #ifndef Memmove #define Memmove memmove #endif #ifndef Memset #define Memset memset #endif #ifndef Free #define Free free #endif #endif /* THX_RECIPIENT */ #ifndef THX_RECIPIENT /* not the recipient, we must be the caller */ #include "bn_lcl.h" #endif /* ! THX_RECIPIENT */ /* The follow define protected inclusions are excerpts from the * header file bn.h, this has been done, so that code written for the * THX systems can be used in isolation from the library * This code may need to be updated in line with changes to the bn.h * header file. */ #ifndef HEADER_COMMON_BN_H #define HEADER_COMMON_BN_H #if !defined(CCONV) #define CCONV #endif #ifndef PRE_CCONV #define PRE_CCONV #endif /* convert from the new to the old option names */ #if defined(OPT_BN_LLONG) #define BN_LLONG /* comment to make sure Configure leaves this alone */ #endif #if defined(OPT_32_BIT_INT) || defined(OPT_32_BIT) #define THIRTY_TWO_BIT #endif #define BN_ILONG BN_ULONG #ifdef THIRTY_TWO_BIT #define BN_ULLONG unsigned long long #ifdef OPT_32_BIT_INT #define BN_ULONG unsigned int #define BN_LONG int #else #define BN_ULONG unsigned long #define BN_LONG long #endif #define BN_BITS 64 #define BN_BYTES 4 #define BN_BITS2 32 #define BN_BITS4 16 /* This is needed because the Watcom compiler pre-processor * under QNX is perverted and tries to parses the 'LL' * part even though it is never used. */ #ifdef BN_LLONG #define BN_MASK (0xffffffffffffffffL) #endif #define BN_MASK2 (0xffffffffL) #define BN_MASK2l (0xffff) #define BN_MASK2lh (0xffff) #define BN_MASK2h1 (0xffff8000L) #define BN_MASK2h (0xffff0000L) #define BN_TBIT (0x80000000L) #define BN_DEC_CONV (1000000000L) #define BN_DEC_FMT1 "%lu" #define BN_DEC_FMT2 "%09lu" #define BN_DEC_NUM 9 #define BN_HEX_FMT "%08lX" #endif #define BN_EXP_TABLE_SIZE 16 typedef struct bignum_st BIGNUM; struct bignum_st { BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit chunks. */ int top; /* Index of last used d +1. */ /* The next are internal book keeping for bn_expand. */ int max; /* Size of the d array. */ int neg; /* one if the number is negative */ int flags; }; PRE_CCONV BN_ULONG CCONV bn_mul_add_words(BN_ULONG *rp,BN_ULONG *ap, int num, BN_ULONG w); PRE_CCONV BN_ULONG CCONV bn_mul_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w); PRE_CCONV void CCONV bn_sqr_words(BN_ULONG *rp, BN_ULONG *ap, int num); BN_ULONG CCONV bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d); PRE_CCONV BN_ULONG CCONV bn_add_words(BN_ULONG *rp, BN_ULONG *ap, BN_ULONG *bp,int num); PRE_CCONV BN_ULONG CCONV bn_sub_words(BN_ULONG *rp, BN_ULONG *ap, BN_ULONG *bp,int num); #ifndef BN_ME_METH #define BN_ME_METH void #endif #endif /* ! HEADER_COMMON_BN_H */ /* The follow define protected inclusions are excerpts from the * header file r_error.h, this has been done, so that code written for the * THX systems can be used in isolation from the library * This code may need to be updated in line with changes to the r_error.h * header file. */ #ifndef HEADER_COMMON_R_ERROR_H #define HEADER_COMMON_R_ERROR_H /* The FATAL_INTERNAL_ERROR is a flag that is set with the following * error codes: * R_ERROR_INVALID_STATE * R_ERROR_INIT_NOT_CALLED * R_ERROR_SHOULD_NOT_HAVE_BEEN_CALLED */ #define R_ERROR_FATAL_INTERNAL_ERROR 64 /* The BAD_PARAMETER is a flag that is set with the following error * codes: * R_ERROR_NULL_ARG * R_ERROR_BUFFER_TOO_SMALL * R_ERROR_BAD_VALUE * R_ERROR_BAD_RANGE * R_ERROR_BAD_FORMAT * R_ERROR_BAD_TYPE * R_ERROR_BAD_DATA * R_ERROR_BAD_LENGTH */ #define R_ERROR_BAD_PARAMETER 32 /* Base value for all general errors used through all products */ #define R_ERROR_BASE 10000 #define R_ERROR_NONE 0 #define R_ERROR_FAILED (R_ERROR_BASE+1) #define R_ERROR_IO (R_ERROR_BASE+2) #define R_ERROR_PROTOCOL (R_ERROR_BASE+3) #define R_ERROR_EOF (R_ERROR_BASE+4) #define R_ERROR_ALLOC_FAILURE (R_ERROR_BASE+5) #define R_ERROR_EVAL_RESTRICTION (R_ERROR_BASE+6) #define R_ERROR_EVAL_EXPIRED (R_ERROR_BASE+7) #define R_ERROR_NOT_FOUND (R_ERROR_BASE+8) #define R_ERROR_NOT_AVAILABLE (R_ERROR_BASE+9) #define R_ERROR_NOT_IMPLEMENTED (R_ERROR_BASE+10) #define R_ERROR_NOT_SUPPORTED (R_ERROR_BASE+11) #define R_ERROR_INVALID_STATE \ ((R_ERROR_BASE+12) | R_ERROR_FATAL_INTERNAL_ERROR) #define R_ERROR_INIT_NOT_CALLED \ ((R_ERROR_BASE+13) | R_ERROR_FATAL_INTERNAL_ERROR) #define R_ERROR_SHOULD_NOT_HAVE_BEEN_CALLED \ ((R_ERROR_BASE+14) | R_ERROR_FATAL_INTERNAL_ERROR) #define R_ERROR_METHOD_UNDEFINED \ ((R_ERROR_BASE+15) | R_ERROR_FATAL_INTERNAL_ERROR) #define R_ERROR_BUFFER_TOO_SMALL \ ((R_ERROR_BASE+16) | R_ERROR_BAD_PARAMETER) #define R_ERROR_NULL_ARG ((R_ERROR_BASE+17) | R_ERROR_BAD_PARAMETER) #define R_ERROR_BAD_VALUE ((R_ERROR_BASE+18) | R_ERROR_BAD_PARAMETER) #define R_ERROR_BAD_RANGE ((R_ERROR_BASE+19) | R_ERROR_BAD_PARAMETER) #define R_ERROR_BAD_FORMAT ((R_ERROR_BASE+20) | R_ERROR_BAD_PARAMETER) #define R_ERROR_BAD_TYPE ((R_ERROR_BASE+21) | R_ERROR_BAD_PARAMETER) #define R_ERROR_BAD_DATA ((R_ERROR_BASE+22) | R_ERROR_BAD_PARAMETER) #define R_ERROR_BAD_LENGTH ((R_ERROR_BASE+23) | R_ERROR_BAD_PARAMETER) #define R_ERROR_RCOM_LIBRARY_NOT_SUPPORTED (R_ERROR_BASE+24) /* Resource Manager base for errors */ #define R_COM_ERR_LIB_CTX_BASE 10100 #endif /* HEADER_COMMON_R_ERROR_H */ const BN_ME_METH *BN_ME_METH_thxc(void); /** * @note THX code only needs to store rr, n0, str * */ typedef struct thxc_mont_ctx_st { BIGNUM *rr; unsigned char *str; unsigned int str_len; BN_ULONG n0; } THXC_MONT_CTX; int Rx_thxr_mod_exp_mont( BN_ULONG *result, BN_ULONG *ap, BN_ULONG *np, BN_ULONG *rrp, BN_ULONG n0, int top, int tmp_len, unsigned char *str); int Ri_thxr_mod_exp_mont( BN_ULONG *result, BN_ULONG *ap, BN_ULONG *np, BN_ULONG *rrp, BN_ULONG *dp, BN_ULONG *aap, BN_ULONG *rp, BN_ULONG *tmp, BN_ULONG n0, int top, unsigned char *str); void Ri_thxr_mul_normal(BN_ULONG *r,BN_ULONG *a,int na,BN_ULONG *b,int nb); void Ri_thxr_sqr_normal(BN_ULONG *r, BN_ULONG *a, int n, BN_ULONG *tmp); void Ri_thxr_from_montgomery_words(BN_ULONG *ret,BN_ULONG *ap,BN_ULONG *np, int w, BN_ULONG n0); BN_ULONG Ri_thxr_from_mont_words(BN_ULONG *ap,BN_ULONG *wap, BN_ULONG *np, int w, BN_ULONG n0); #ifdef CPU_TMS320 /* Method and functions required for the ARM/DSP interface */ const BN_ME_METH *BN_ME_METH_dspc(void); int Rx_dsp_mod_exp_mont( BN_ULONG *result, BN_ULONG *ap, BN_ULONG *np, BN_ULONG *rrp, BN_ULONG n0, int top, int tmp_len, unsigned char *str); int Ri_dsp_mod_exp_mont( BN_ULONG *result, BN_ULONG *ap, BN_ULONG *np, BN_ULONG *rrp, BN_ULONG *dp, BN_ULONG *aap, BN_ULONG *rp, BN_ULONG *tmp, BN_ULONG n0, int top, unsigned char *str); #endif #ifdef __cplusplus } #endif #endif /* HEADER_COMMON_BN_THX_H */