mirror of
https://github.com/isc-projects/bind9.git
synced 2026-04-15 22:09:31 -04:00
Remove dnssafe, cylink, and the broken dst random generator.
This commit is contained in:
parent
7b1ab9e210
commit
9bd186cd9a
206 changed files with 10 additions and 34542 deletions
|
|
@ -3,18 +3,8 @@ BSDOBJS= daemon.o putenv.o strcasecmp.o strsep.o ftruncate.o \
|
|||
strerror.o utimes.o mktemp.o setitimer.o strpbrk.o \
|
||||
writev.o
|
||||
|
||||
SUBDIRS = bsd cylink dnssafe dst include inet irs isc nameser resolv
|
||||
|
||||
OBJS= prand_conf.@O@
|
||||
|
||||
SRCS= prand_conf.c
|
||||
SUBDIRS = bsd dst include inet irs isc nameser resolv
|
||||
|
||||
@BIND9_MAKE_RULES@
|
||||
|
||||
all depend: prand_conf.h
|
||||
|
||||
prand_conf.h: prand_conf
|
||||
./prand_conf > $@
|
||||
|
||||
prand_conf: ${OBJS}
|
||||
${CC} -o $@ ${OBJS}
|
||||
all depend:
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl
|
|||
esyscmd([sed "s/^/# /" COPYRIGHT])dnl
|
||||
AC_DIVERT_POP()dnl
|
||||
|
||||
AC_REVISION($Revision: 1.6 $)
|
||||
AC_REVISION($Revision: 1.7 $)
|
||||
|
||||
AC_INIT(resolv/herror.c)
|
||||
AC_PREREQ(2.13)
|
||||
|
|
@ -304,97 +304,6 @@ AC_SUBST(WANT_IRS_NIS_OBJS)
|
|||
AC_SUBST(WANT_IRS_NISGR_OBJS)
|
||||
AC_SUBST(WANT_IRS_NISPW_OBJS)
|
||||
|
||||
#
|
||||
# was --with-openssl specified?
|
||||
#
|
||||
AC_MSG_CHECKING(for compatible OpenSSL library)
|
||||
AC_ARG_WITH(openssl,
|
||||
[ --with-openssl=PATH Specify path for system-supplied openssl
|
||||
(rather than using bind-9 internal openssl)],
|
||||
use_openssl="$withval", use_openssl="no")
|
||||
|
||||
#
|
||||
# If the user didn't specify where openssl is, and we didn't find or it
|
||||
# is incompatible with our code, use our internal one.
|
||||
#
|
||||
# XXX This appears to assume that the user specified path is correct,
|
||||
# and does no checking.
|
||||
#
|
||||
|
||||
case "$use_openssl" in
|
||||
no)
|
||||
DST_PRIVATEOPENSSL='-DDST_USE_PRIVATE_OPENSSL'
|
||||
dst_privateopenssl='openssl'
|
||||
DST_OPENSSL_INC='-I${srcdir}/../openssl/include'
|
||||
DST_OPENSSL_LIB=''
|
||||
DST_OPENSSL_OBJS='${OPENSSLOBJS}'
|
||||
AC_MSG_RESULT(using private library)
|
||||
openssl_makefiles="lib/dns/sec/openssl/Makefile \
|
||||
lib/dns/sec/openssl/include/Makefile \
|
||||
lib/dns/sec/openssl/include/openssl/Makefile"
|
||||
|
||||
;;
|
||||
yes)
|
||||
AC_MSG_ERROR([--with-openssl must specify a path])
|
||||
;;
|
||||
*)
|
||||
DST_PRIVATEOPENSSL=''
|
||||
dst_privateopenssl=''
|
||||
DST_OPENSSL_INC="-I$use_openssl/include"
|
||||
DNS_OPENSSL_LIBS="-L$use_openssl/lib -lcrypto"
|
||||
DST_OPENSSL_LIB=''
|
||||
AC_MSG_RESULT(using openssl from $use_openssl/lib and $use_openssl/include)
|
||||
openssl_makefiles=""
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(DST_PRIVATEOPENSSL)
|
||||
AC_SUBST(dst_privateopenssl)
|
||||
AC_SUBST(DST_OPENSSL_INC)
|
||||
AC_SUBST(DST_OPENSSL_LIB)
|
||||
AC_SUBST(DST_OPENSSL_OBJS)
|
||||
|
||||
#
|
||||
# This would include the system openssl path (and linker options to use
|
||||
# it as needed) if it is found.
|
||||
#
|
||||
|
||||
AC_SUBST(DNS_OPENSSL_LIBS)
|
||||
|
||||
#
|
||||
# was --with-gssapi specified?
|
||||
#
|
||||
#AC_MSG_CHECKING(for GSSAPI library)
|
||||
#AC_ARG_WITH(gssapi,
|
||||
#[ --with-gssapi=PATH Specify path for system-supplied GSSAPI],
|
||||
# use_gssapi="$withval", use_gssapi="no")
|
||||
#
|
||||
#case "$use_gssapi" in
|
||||
# no)
|
||||
# USE_GSSAPI=''
|
||||
# DST_GSSAPI_INC=''
|
||||
# DNS_GSSAPI_LIBS=''
|
||||
# AC_MSG_RESULT(not specified)
|
||||
# ;;
|
||||
# yes)
|
||||
# AC_MSG_ERROR([--with-gssapi must specify a path])
|
||||
# ;;
|
||||
# *)
|
||||
# USE_GSSAPI='-DGSSAPI'
|
||||
# DST_GSSAPI_INC="-I$use_gssapi/include"
|
||||
# DNS_GSSAPI_LIBS="-L$use_gssapi/lib -lgssapi_krb5"
|
||||
# AC_MSG_RESULT(using gssapi from $use_gssapi/lib and $use_gssapi/include)
|
||||
# ;;
|
||||
#esac
|
||||
|
||||
USE_GSSAPI=''
|
||||
DST_GSSAPI_INC=''
|
||||
DNS_GSSAPI_LIBS=''
|
||||
|
||||
AC_SUBST(USE_GSSAPI)
|
||||
AC_SUBST(DST_GSSAPI_INC)
|
||||
AC_SUBST(DNS_GSSAPI_LIBS)
|
||||
|
||||
#
|
||||
# was --with-randomdev specified?
|
||||
#
|
||||
|
|
@ -1822,8 +1731,6 @@ AC_OUTPUT(
|
|||
make/includes
|
||||
Makefile
|
||||
bsd/Makefile
|
||||
cylink/Makefile
|
||||
dnssafe/Makefile
|
||||
dst/Makefile
|
||||
include/Makefile
|
||||
inet/Makefile
|
||||
|
|
|
|||
|
|
@ -1,12 +0,0 @@
|
|||
OBJS= bn.@O@ bn00.@O@ lbn00.@O@ lbnmem.@O@ legal.@O@ \
|
||||
bits.@O@ dss.@O@ math.@O@ ctk_prime.@O@ rand.@O@ sha.@O@ swap.@O@
|
||||
|
||||
SRCS= bn.c bn00.c lbn00.c lbnmem.c legal.c \
|
||||
bits.c dss.c math.c ctk_prime.c rand.c sha.c swap.c
|
||||
|
||||
TARGETS= ${OBJS}
|
||||
|
||||
CINCLUDES= -I.. -I../include
|
||||
CWARNINGS= -Werror
|
||||
|
||||
@BIND9_MAKE_RULES@
|
||||
|
|
@ -1,359 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* FILENAME: bit.c PRODUCT NAME: CRYPTOGRAPHIC TOOLKIT
|
||||
*
|
||||
* FILE STATUS:
|
||||
*
|
||||
* DESCRIPTION: Bit Utility Functions
|
||||
*
|
||||
* PUBLIC FUNCTIONS:
|
||||
*
|
||||
*
|
||||
* PRIVATE FUNCTIONS:
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* INCLUDE FILES
|
||||
****************************************************************************/
|
||||
/* bn files */
|
||||
#include "port_before.h"
|
||||
#include <sys/types.h>
|
||||
#include "bn.h"
|
||||
/* system files */
|
||||
#ifdef VXD
|
||||
#include <vtoolsc.h>
|
||||
#else
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#endif
|
||||
/* program files */
|
||||
#include "cylink.h"
|
||||
#include "ctk_endian.h"
|
||||
#include "c_asm.h"
|
||||
#include "port_after.h"
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: void RShiftL( ord *X,
|
||||
* u_int32_t len_X,
|
||||
* u_int32_t n_bit )
|
||||
*
|
||||
* DESCRIPTION: Shift array to the right by n_bit.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* ord *X Pointer to array
|
||||
* u_int32_t len_X Length of array
|
||||
* u_int32_t n_bit Number of bits
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* ord *X Pointer to array
|
||||
*
|
||||
* RETURN:
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void RShiftL_big( ord *X,
|
||||
u_int32_t len_X,
|
||||
u_int32_t n_bit )
|
||||
{
|
||||
|
||||
struct BigNum dest;
|
||||
bnInit();
|
||||
bnBegin(&dest);
|
||||
|
||||
dest.ptr = X;
|
||||
dest.size = len_X;
|
||||
dest.allocated = len_X;
|
||||
|
||||
bnRShift(&dest,n_bit);
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: void LShiftL( ord *X,
|
||||
* u_int32_t len_X,
|
||||
* u_int32_t n_bit )
|
||||
*
|
||||
* DESCRIPTION: Shifts array to the left by n_bit.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* ord *X Pointer to array
|
||||
* u_int32_t len_X Length of array
|
||||
* u_int32_t n_bit Number of bits
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* ord *X Pointer to array
|
||||
*
|
||||
* RETURN:
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void LShiftL_big( ord *X,
|
||||
u_int32_t len_X,
|
||||
u_int32_t n_bit )
|
||||
{
|
||||
struct BigNum dest;
|
||||
bnInit();
|
||||
bnBegin(&dest);
|
||||
|
||||
dest.ptr = X;
|
||||
dest.size = len_X;
|
||||
dest.allocated = len_X;
|
||||
|
||||
bnLShift(&dest,n_bit);
|
||||
}
|
||||
|
||||
/************9****************************************************************
|
||||
* NAME: int RShiftMostBit( ord *a,
|
||||
* u_int32_t len )
|
||||
*
|
||||
* DESCRIPTION: Find a least significant non zero bit
|
||||
* and sfift array to the right
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* ord *a Pointer to array
|
||||
* u_int32_t len Number of elements in number
|
||||
* OUTPUT:
|
||||
*
|
||||
* RETURN:
|
||||
* Number of shifted bits
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int RShiftMostBit( ord *a,
|
||||
u_int32_t len )
|
||||
{
|
||||
|
||||
struct BigNum n;
|
||||
bnInit();
|
||||
bnBegin(&n);
|
||||
|
||||
n.size = len;
|
||||
n.ptr = a;
|
||||
n.allocated = len;
|
||||
|
||||
return (bnMakeOdd(&n));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: void ByteLong (uchar *X, u_int32_t X_bytes,
|
||||
* u_int32_t *Y )
|
||||
*
|
||||
*
|
||||
* DESCRIPTION: Transfer bytes to u_int32_t.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* uchar *X Pointer to byte array
|
||||
* u_int32_t X_bytes Number of bytes in array
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* u_int32_t *Y Pointer to long arrray
|
||||
*
|
||||
* RETURN:
|
||||
*
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void ByteLong( uchar *X,
|
||||
u_int32_t X_bytes,
|
||||
u_int32_t *Y )
|
||||
{
|
||||
u_int32_t i, j; /* counters */
|
||||
for ( i = 0, j = 0; j < X_bytes; i++, j += 4)
|
||||
{
|
||||
Y[i] = ( (u_int32_t)X[j] ) | ( ((u_int32_t)X[j+1]) << 8 ) |
|
||||
( ((u_int32_t)X[j+2]) << 16 ) | ( ((u_int32_t)X[j+3]) << 24 );
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: void ByteOrd (uchar *X, u_int32_t X_bytes,
|
||||
* ord *Y )
|
||||
*
|
||||
*
|
||||
* DESCRIPTION: Transfer bytes to ord.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* uchar *X Pointer to byte array
|
||||
* u_int32_t X_bytes Number of bytes in array
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* ord *Y Pointer to long array
|
||||
*
|
||||
* RETURN:
|
||||
*
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void ByteOrd( uchar *X,
|
||||
u_int32_t X_bytes,
|
||||
ord *Y )
|
||||
{
|
||||
u_int32_t i, j; /* counters */
|
||||
for ( i = 0, j = 0; j < X_bytes; i++, j += sizeof(ord))
|
||||
{
|
||||
Y[i] = ( (ord)X[j] ) | ( ((ord)X[j+1]) << 8 )
|
||||
#ifdef ORD_32
|
||||
| ( ((ord)X[j+2]) << 16 ) | ( ((ord)X[j+3]) << 24 )
|
||||
#endif
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: void OrdByte (ord *X, u_int32_t X_bytes,
|
||||
* uchar *Y )
|
||||
*
|
||||
*
|
||||
* DESCRIPTION: Transfer ord to bytes.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* ord *X Pointer to ord array
|
||||
* u_int32_t X_bytes Number of bytes in array
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* uchar *Y Pointer to byte array
|
||||
*
|
||||
* RETURN:
|
||||
*
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void OrdByte( ord *X,
|
||||
u_int32_t X_bytes,
|
||||
uchar *Y )
|
||||
{
|
||||
u_int32_t i, j; /* counters */
|
||||
for ( i=0, j=0; j < X_bytes; i++, j += sizeof(ord))
|
||||
{
|
||||
Y[j] = (uchar ) ( X[i] & 0xff );
|
||||
Y[j+1] = (uchar)( (X[i] >> 8) & 0xff );
|
||||
#ifdef ORD_32
|
||||
Y[j+2] = (uchar)( (X[i] >> 16) & 0xff );
|
||||
Y[j+3] = (uchar)( (X[i] >> 24) & 0xff );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: void LongByte( u_int32_t *X,
|
||||
* u_int32_t X_bytes,
|
||||
* uchar *Y )
|
||||
*
|
||||
* DESCRIPTION: Transfer u_int32_t to bytes.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* u_int32_t *X Pointer to long array
|
||||
* u_int32_t X_bytes Number of longs in array
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* uchar *Y Pointer to bytes array
|
||||
*
|
||||
* RETURN:
|
||||
*
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void LongByte( u_int32_t *X,
|
||||
u_int32_t X_bytes,
|
||||
uchar *Y )
|
||||
{
|
||||
u_int32_t i, j; /* counters */
|
||||
for ( i=0, j=0; j < X_bytes; i++, j += 4)
|
||||
{
|
||||
Y[j] = (uchar ) ( X[i] & 0xff );
|
||||
Y[j+1] = (uchar)( (X[i] >> 8) & 0xff );
|
||||
Y[j+2] = (uchar)( (X[i] >> 16) & 0xff );
|
||||
Y[j+3] = (uchar)( (X[i] >> 24) & 0xff );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1,131 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bn.c - the high-level bignum interface
|
||||
*
|
||||
* Copyright (c) 1995 Colin Plumb. All rights reserved.
|
||||
* For licensing and other legal details, see the file legal.c.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "bn.h"
|
||||
#include "port_after.h"
|
||||
|
||||
/* Functions */
|
||||
void
|
||||
bnBegin(struct BigNum *bn)
|
||||
{
|
||||
static int bninit = 0;
|
||||
|
||||
if (!bninit) {
|
||||
bnInit();
|
||||
bninit = 1;
|
||||
}
|
||||
|
||||
bn->ptr = 0;
|
||||
bn->size = 0;
|
||||
bn->allocated = 0;
|
||||
}
|
||||
|
||||
void
|
||||
bnSwap(struct BigNum *a, struct BigNum *b)
|
||||
{
|
||||
void *p;
|
||||
unsigned t;
|
||||
|
||||
p = a->ptr;
|
||||
a->ptr = b->ptr;
|
||||
b->ptr = p;
|
||||
|
||||
t = a->size;
|
||||
a->size = b->size;
|
||||
b->size = t;
|
||||
|
||||
t = a->allocated;
|
||||
a->allocated = b->allocated;
|
||||
b->allocated = t;
|
||||
}
|
||||
|
||||
void (*bnEnd)(struct BigNum *bn);
|
||||
int (*bnPrealloc)(struct BigNum *bn, unsigned bits);
|
||||
int (*bnCopy)(struct BigNum *dest, struct BigNum const *src);
|
||||
void (*bnNorm)(struct BigNum *bn);
|
||||
void (*bnExtractBigBytes)(struct BigNum const *bn, unsigned char *dest,
|
||||
unsigned lsbyte, unsigned len);
|
||||
int (*bnInsertBigBytes)(struct BigNum *bn, unsigned char const *src,
|
||||
unsigned lsbyte, unsigned len);
|
||||
void (*bnExtractLittleBytes)(struct BigNum const *bn, unsigned char *dest,
|
||||
unsigned lsbyte, unsigned len);
|
||||
int (*bnInsertLittleBytes)(struct BigNum *bn, unsigned char const *src,
|
||||
unsigned lsbyte, unsigned len);
|
||||
unsigned (*bnLSWord)(struct BigNum const *src);
|
||||
unsigned (*bnBits)(struct BigNum const *src);
|
||||
int (*bnAdd)(struct BigNum *dest, struct BigNum const *src);
|
||||
int (*bnSub)(struct BigNum *dest, struct BigNum const *src);
|
||||
int (*bnCmpQ)(struct BigNum const *a, unsigned b);
|
||||
int (*bnSetQ)(struct BigNum *dest, unsigned src);
|
||||
int (*bnAddQ)(struct BigNum *dest, unsigned src);
|
||||
int (*bnSubQ)(struct BigNum *dest, unsigned src);
|
||||
int (*bnCmp)(struct BigNum const *a, struct BigNum const *b);
|
||||
int (*bnSquare)(struct BigNum *dest, struct BigNum const *src);
|
||||
int (*bnMul)(struct BigNum *dest, struct BigNum const *a,
|
||||
struct BigNum const *b);
|
||||
int (*bnMulQ)(struct BigNum *dest, struct BigNum const *a, unsigned b);
|
||||
int (*bnDivMod)(struct BigNum *q, struct BigNum *r, struct BigNum const *n,
|
||||
struct BigNum const *d);
|
||||
int (*bnMod)(struct BigNum *dest, struct BigNum const *src,
|
||||
struct BigNum const *d);
|
||||
unsigned (*bnModQ)(struct BigNum const *src, unsigned d);
|
||||
int (*bnExpMod)(struct BigNum *result, struct BigNum const *n,
|
||||
struct BigNum const *exp, struct BigNum const *mod);
|
||||
int (*bnDoubleExpMod)(struct BigNum *dest,
|
||||
struct BigNum const *n1, struct BigNum const *e1,
|
||||
struct BigNum const *n2, struct BigNum const *e2,
|
||||
struct BigNum const *mod);
|
||||
int (*bnTwoExpMod)(struct BigNum *n, struct BigNum const *exp,
|
||||
struct BigNum const *mod);
|
||||
int (*bnGcd)(struct BigNum *dest, struct BigNum const *a,
|
||||
struct BigNum const *b);
|
||||
int (*bnInv)(struct BigNum *dest, struct BigNum const *src,
|
||||
struct BigNum const *mod);
|
||||
int (*bnLShift)(struct BigNum *dest, unsigned amt);
|
||||
void (*bnRShift)(struct BigNum *dest, unsigned amt);
|
||||
unsigned (*bnMakeOdd)(struct BigNum *n);
|
||||
|
|
@ -1,221 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bn.h - the interface to the bignum routines.
|
||||
* All functions which return ints can potentially allocate memory
|
||||
* and return -1 if they are unable to. All "const" arguments
|
||||
* are unmodified.
|
||||
*
|
||||
* This is not particularly asymmetric, as some operations are of the
|
||||
* form a = b @ c, while others do a @= b. In general, outputs may not
|
||||
* point to the same struct BigNums as inputs, except as specified
|
||||
* below. This relationship is referred to as "being the same as".
|
||||
* This is not numerical equivalence.
|
||||
*
|
||||
* The "Q" operations take "unsigned" inputs. Higher values of the
|
||||
* extra input may work on some implementations, but 65535 is the
|
||||
* highest portable value. Just because UNSIGNED_MAX is larger than
|
||||
* that, or you know that the word size of the library is larger than that,
|
||||
* that, does *not* mean it's allowed.
|
||||
*/
|
||||
#ifndef BN_H
|
||||
#define BN_H
|
||||
|
||||
struct BigNum {
|
||||
void *ptr;
|
||||
unsigned size; /* Note: in (variable-sized) words */
|
||||
unsigned allocated;
|
||||
};
|
||||
|
||||
/* Functions */
|
||||
|
||||
/*
|
||||
* You usually never have to call this function explicitly, as
|
||||
* bnBegin() takes care of it. If the program jumps to address 0,
|
||||
* this function has bot been called.
|
||||
*/
|
||||
void bnInit(void);
|
||||
|
||||
/*
|
||||
* This initializes an empty struct BigNum to a zero value.
|
||||
* Do not use this on a BigNum which has had a value stored in it!
|
||||
*/
|
||||
void bnBegin(struct BigNum *bn);
|
||||
|
||||
/* Swap two BigNums. Cheap. */
|
||||
void bnSwap(struct BigNum *a, struct BigNum *b);
|
||||
|
||||
/* Reset an initialized bigNum to empty, pending deallocation. */
|
||||
extern void (*bnEnd)(struct BigNum *bn);
|
||||
|
||||
/*
|
||||
* If you know you'll need space in the number soon, you can use this function
|
||||
* to ensure that there is room for at least "bits" bits. Optional.
|
||||
* Returns <0 on out of memory, but the value is unaffected.
|
||||
*/
|
||||
extern int (*bnPrealloc)(struct BigNum *bn, unsigned bits);
|
||||
|
||||
/* Hopefully obvious. dest = src. dest may be the same as src. */
|
||||
extern int (*bnCopy)(struct BigNum *dest, struct BigNum const *src);
|
||||
|
||||
/*
|
||||
* Mostly done automatically, but this removes leading zero words from
|
||||
* the internal representation of the BigNum. Use is unclear.
|
||||
*/
|
||||
extern void (*bnNorm)(struct BigNum *bn);
|
||||
|
||||
/*
|
||||
* Move bytes between the given buffer and the given BigNum encoded in
|
||||
* base 256. I.e. after either of these, the buffer will be equal to
|
||||
* (bn / 256^lsbyte) % 256^len. The difference is which is altered to
|
||||
* match the other!
|
||||
*/
|
||||
extern void (*bnExtractBigBytes)(struct BigNum const *bn,
|
||||
unsigned char *dest, unsigned lsbyte, unsigned len);
|
||||
extern int (*bnInsertBigBytes)(struct BigNum *bn, unsigned char const *src,
|
||||
unsigned lsbyte, unsigned len);
|
||||
|
||||
/* The same, but the buffer is little-endian. */
|
||||
extern void (*bnExtractLittleBytes)(struct BigNum const *bn,
|
||||
unsigned char *dest, unsigned lsbyte, unsigned len);
|
||||
extern int (*bnInsertLittleBytes)(struct BigNum *bn, unsigned char const *src,
|
||||
unsigned lsbyte, unsigned len);
|
||||
|
||||
/* Return the least-significant bits (at least 16) of the BigNum */
|
||||
extern unsigned (*bnLSWord)(struct BigNum const *src);
|
||||
|
||||
/*
|
||||
* Return the number of significant bits in the BigNum.
|
||||
* 0 or 1+floor(log2(src))
|
||||
*/
|
||||
extern unsigned (*bnBits)(struct BigNum const *src);
|
||||
|
||||
/*
|
||||
* dest += src. dest and src may be the same. Guaranteed not to
|
||||
* allocate memory unnecessarily, so if you're sure bnBits(dest)
|
||||
* won't change, you don't need to check the return value.
|
||||
*/
|
||||
extern int (*bnAdd)(struct BigNum *dest, struct BigNum const *src);
|
||||
|
||||
/*
|
||||
* dest -= src. dest and src may be the same, but bnSetQ(dest, 0) is faster.
|
||||
* if dest < src, returns +1 and sets dest = src-dest.
|
||||
*/
|
||||
extern int (*bnSub)(struct BigNum *dest, struct BigNum const *src);
|
||||
|
||||
/* Return sign (-1, 0, +1) of a-b. a <=> b --> bnCmpQ(a, b) <=> 0 */
|
||||
extern int (*bnCmpQ)(struct BigNum const *a, unsigned b);
|
||||
|
||||
/* dest = src, where 0 <= src < 2^16. */
|
||||
extern int (*bnSetQ)(struct BigNum *dest, unsigned src);
|
||||
|
||||
/* dest += src, where 0 <= src < 2^16 */
|
||||
extern int (*bnAddQ)(struct BigNum *dest, unsigned src);
|
||||
|
||||
/* dest -= src, where 0 <= src < 2^16 */
|
||||
extern int (*bnSubQ)(struct BigNum *dest, unsigned src);
|
||||
|
||||
/* Return sign (-1, 0, +1) of a-b. a <=> b --> bnCmp(a, b) <=> 0 */
|
||||
extern int (*bnCmp)(struct BigNum const *a, struct BigNum const *b);
|
||||
|
||||
/* dest = src^2. dest may be the same as src, but it costs time. */
|
||||
extern int (*bnSquare)(struct BigNum *dest, struct BigNum const *src);
|
||||
|
||||
/* dest = a * b. dest may be the same as a or b, but it costs time. */
|
||||
extern int (*bnMul)(struct BigNum *dest, struct BigNum const *a,
|
||||
struct BigNum const *b);
|
||||
|
||||
/* dest = a * b, where 0 <= b < 2^16. dest and a may be the same. */
|
||||
extern int (*bnMulQ)(struct BigNum *dest, struct BigNum const *a, unsigned b);
|
||||
|
||||
/*
|
||||
* q = n/d, r = n%d. r may be the same as n, but not d,
|
||||
* and q may not be the same as n or d.
|
||||
* re-entrancy issue: this temporarily modifies d, but restores
|
||||
* it for return.
|
||||
*/
|
||||
extern int (*bnDivMod)(struct BigNum *q, struct BigNum *r,
|
||||
struct BigNum const *n, struct BigNum const *d);
|
||||
/*
|
||||
* dest = src % d. dest and src may be the same, but not dest and d.
|
||||
* re-entrancy issue: this temporarily modifies d, but restores
|
||||
* it for return.
|
||||
*/
|
||||
extern int (*bnMod)(struct BigNum *dest, struct BigNum const *src,
|
||||
struct BigNum const *d);
|
||||
|
||||
/* return src % d, where 0 <= d < 2^16. */
|
||||
extern unsigned int (*bnModQ)(struct BigNum const *src, unsigned d);
|
||||
|
||||
/* n = n^exp, modulo "mod" "mod" *must* be odd */
|
||||
extern int (*bnExpMod)(struct BigNum *result, struct BigNum const *n,
|
||||
struct BigNum const *exp, struct BigNum const *mod);
|
||||
|
||||
/*
|
||||
* dest = n1^e1 * n2^e2, modulo "mod". "mod" *must* be odd.
|
||||
* dest may be the same as n1 or n2.
|
||||
*/
|
||||
extern int (*bnDoubleExpMod)(struct BigNum *dest,
|
||||
struct BigNum const *n1, struct BigNum const *e1,
|
||||
struct BigNum const *n2, struct BigNum const *e2,
|
||||
struct BigNum const *mod);
|
||||
|
||||
/* n = 2^exp, modulo "mod" "mod" *must* be odd */
|
||||
extern int (*bnTwoExpMod)(struct BigNum *n, struct BigNum const *exp,
|
||||
struct BigNum const *mod);
|
||||
|
||||
/* dest = gcd(a, b). The inputs may overlap arbitrarily. */
|
||||
extern int (*bnGcd)(struct BigNum *dest, struct BigNum const *a,
|
||||
struct BigNum const *b);
|
||||
|
||||
/* dest = src^-1, modulo "mod". dest may be the same as src. */
|
||||
extern int (*bnInv)(struct BigNum *dest, struct BigNum const *src,
|
||||
struct BigNum const *mod);
|
||||
|
||||
/* Shift dest left "amt" places */
|
||||
extern int (*bnLShift)(struct BigNum *dest, unsigned amt);
|
||||
/* Shift dest right "amt" places, discarding low-order bits */
|
||||
extern void (*bnRShift)(struct BigNum *dest, unsigned amt);
|
||||
|
||||
/* For the largest 2^k that divides n, divide n by it and return k. */
|
||||
extern unsigned (*bnMakeOdd)(struct BigNum *n);
|
||||
|
||||
#endif/* !BN_H */
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bn00.c - auto-size-detecting bn??.c file.
|
||||
*
|
||||
* Written in 1995 by Colin Plumb.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "bnsize00.h"
|
||||
|
||||
#if BNSIZE64
|
||||
|
||||
/* Include all of the C source file by reference */
|
||||
#include "bn64.c"
|
||||
#include "bninit64.c"
|
||||
|
||||
#elif BNSIZE32
|
||||
|
||||
/* Include all of the C source file by reference */
|
||||
#include "bn32.c"
|
||||
#include "bninit32.c"
|
||||
|
||||
#else /* BNSIZE16 */
|
||||
|
||||
/* Include all of the C source file by reference */
|
||||
#include "bn16.c"
|
||||
#include "bninit16.c"
|
||||
|
||||
#endif
|
||||
|
|
@ -1,949 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bn16.c - the high-level bignum interface
|
||||
*
|
||||
* Like lbn16.c, this reserves the string "16" for textual replacement.
|
||||
* The string must not appear anywhere unless it is intended to be replaced
|
||||
* to generate other bignum interface functions.
|
||||
*
|
||||
* Copyright (c) 1995 Colin Plumb. All rights reserved.
|
||||
* For licensing and other legal details, see the file legal.c.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_CONFIG_H
|
||||
#define HAVE_CONFIG_H 0
|
||||
#endif
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Some compilers complain about #if FOO if FOO isn't defined,
|
||||
* so do the ANSI-mandated thing explicitly...
|
||||
*/
|
||||
#ifndef NO_ASSERT_H
|
||||
#define NO_ASSERT_H 0
|
||||
#endif
|
||||
#ifndef NO_STRING_H
|
||||
#define NO_STRING_H 0
|
||||
#endif
|
||||
#ifndef HAVE_STRINGS_H
|
||||
#define HAVE_STRINGS_H 0
|
||||
#endif
|
||||
#ifndef NEED_MEMORY_H
|
||||
#define NEED_MEMORY_H 0
|
||||
#endif
|
||||
|
||||
#if !NO_ASSERT_H
|
||||
#include <assert.h>
|
||||
#else
|
||||
#define assert(x) (void)0
|
||||
#endif
|
||||
|
||||
#if !NO_STRING_H
|
||||
#include <string.h> /* for memmove() in bnMakeOdd */
|
||||
#elif HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#if NEED_MEMORY_H
|
||||
#include <memory.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This was useful during debugging, so it's left in here.
|
||||
* You can ignore it. DBMALLOC is generally undefined.
|
||||
*/
|
||||
#ifndef DBMALLOC
|
||||
#define DBAMLLOC 0
|
||||
#endif
|
||||
#if DBMALLOC
|
||||
#include "../dbmalloc/malloc.h"
|
||||
#define MALLOCDB malloc_chain_check(1)
|
||||
#else
|
||||
#define MALLOCDB (void)0
|
||||
#endif
|
||||
|
||||
#include "lbn.h"
|
||||
#include "lbn16.h"
|
||||
#include "lbnmem.h"
|
||||
#include "bn16.h"
|
||||
#include "bn.h"
|
||||
|
||||
/* Work-arounds for some particularly broken systems */
|
||||
#include "kludge.h" /* For memmove() */
|
||||
#include <port_after.h>
|
||||
|
||||
/* Functions */
|
||||
void
|
||||
bnInit_16(void)
|
||||
{
|
||||
bnEnd = bnEnd_16;
|
||||
bnPrealloc = bnPrealloc_16;
|
||||
bnCopy = bnCopy_16;
|
||||
bnNorm = bnNorm_16;
|
||||
bnExtractBigBytes = bnExtractBigBytes_16;
|
||||
bnInsertBigBytes = bnInsertBigBytes_16;
|
||||
bnExtractLittleBytes = bnExtractLittleBytes_16;
|
||||
bnInsertLittleBytes = bnInsertLittleBytes_16;
|
||||
bnLSWord = bnLSWord_16;
|
||||
bnBits = bnBits_16;
|
||||
bnAdd = bnAdd_16;
|
||||
bnSub = bnSub_16;
|
||||
bnCmpQ = bnCmpQ_16;
|
||||
bnSetQ = bnSetQ_16;
|
||||
bnAddQ = bnAddQ_16;
|
||||
bnSubQ = bnSubQ_16;
|
||||
bnCmp = bnCmp_16;
|
||||
bnSquare = bnSquare_16;
|
||||
bnMul = bnMul_16;
|
||||
bnMulQ = bnMulQ_16;
|
||||
bnDivMod = bnDivMod_16;
|
||||
bnMod = bnMod_16;
|
||||
bnModQ = bnModQ_16;
|
||||
bnExpMod = bnExpMod_16;
|
||||
bnDoubleExpMod = bnDoubleExpMod_16;
|
||||
bnTwoExpMod = bnTwoExpMod_16;
|
||||
bnGcd = bnGcd_16;
|
||||
bnInv = bnInv_16;
|
||||
bnLShift = bnLShift_16;
|
||||
bnRShift = bnRShift_16;
|
||||
bnMakeOdd = bnMakeOdd_16;
|
||||
}
|
||||
|
||||
void
|
||||
bnEnd_16(struct BigNum *bn)
|
||||
{
|
||||
if (bn->ptr) {
|
||||
LBNFREE((BNWORD16 *)bn->ptr, bn->allocated);
|
||||
bn->ptr = 0;
|
||||
}
|
||||
bn->size = 0;
|
||||
bn->allocated = 0;
|
||||
|
||||
MALLOCDB;
|
||||
}
|
||||
|
||||
/* Internal function. It operates in words. */
|
||||
static int
|
||||
bnResize_16(struct BigNum *bn, unsigned len)
|
||||
{
|
||||
void *p;
|
||||
|
||||
/* Round size up: most mallocs impose 8-byte granularity anyway */
|
||||
len = (len + (8/sizeof(BNWORD16) - 1)) & ~(8/sizeof(BNWORD16) - 1);
|
||||
p = LBNREALLOC((BNWORD16 *)bn->ptr, bn->allocated, len);
|
||||
if (!p)
|
||||
return -1;
|
||||
bn->ptr = p;
|
||||
bn->allocated = len;
|
||||
|
||||
MALLOCDB;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define bnSizeCheck(bn, size) \
|
||||
if (bn->allocated < size && bnResize_16(bn, size) < 0) \
|
||||
return -1
|
||||
|
||||
int
|
||||
bnPrealloc_16(struct BigNum *bn, unsigned bits)
|
||||
{
|
||||
bits = (bits + 16-1)/16;
|
||||
bnSizeCheck(bn, bits);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnCopy_16(struct BigNum *dest, struct BigNum const *src)
|
||||
{
|
||||
bnSizeCheck(dest, src->size);
|
||||
dest->size = src->size;
|
||||
lbnCopy_16((BNWORD16 *)dest->ptr, (BNWORD16 *)src->ptr, src->size);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
bnNorm_16(struct BigNum *bn)
|
||||
{
|
||||
bn->size = lbnNorm_16((BNWORD16 *)bn->ptr, bn->size);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a bignum to big-endian bytes. Returns, in big-endian form, a
|
||||
* substring of the bignum starting from lsbyte and "len" bytes long.
|
||||
* Unused high-order (leading) bytes are filled with 0.
|
||||
*/
|
||||
void
|
||||
bnExtractBigBytes_16(struct BigNum const *bn, unsigned char *dest,
|
||||
unsigned lsbyte, unsigned len)
|
||||
{
|
||||
unsigned s = bn->size * (16 / 8);
|
||||
|
||||
/* Fill unused leading bytes with 0 */
|
||||
while (s < lsbyte+len) {
|
||||
*dest++ = 0;
|
||||
len--;
|
||||
}
|
||||
|
||||
if (len)
|
||||
lbnExtractBigBytes_16((BNWORD16 *)bn->ptr, dest, lsbyte, len);
|
||||
MALLOCDB;
|
||||
}
|
||||
|
||||
int
|
||||
bnInsertBigBytes_16(struct BigNum *bn, unsigned char const *src,
|
||||
unsigned lsbyte, unsigned len)
|
||||
{
|
||||
unsigned s = bn->size;
|
||||
unsigned words = (len+lsbyte+sizeof(BNWORD16)-1) / sizeof(BNWORD16);
|
||||
|
||||
/* Pad with zeros as required */
|
||||
bnSizeCheck(bn, words);
|
||||
|
||||
if (s < words) {
|
||||
lbnZero_16((BNWORD16 *)bn->ptr BIGLITTLE(-s,+s), words-s);
|
||||
s = words;
|
||||
}
|
||||
|
||||
lbnInsertBigBytes_16((BNWORD16 *)bn->ptr, src, lsbyte, len);
|
||||
|
||||
bn->size = lbnNorm_16((BNWORD16 *)bn->ptr, s);
|
||||
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Convert a bignum to little-endian bytes. Returns, in little-endian form, a
|
||||
* substring of the bignum starting from lsbyte and "len" bytes long.
|
||||
* Unused high-order (trailing) bytes are filled with 0.
|
||||
*/
|
||||
void
|
||||
bnExtractLittleBytes_16(struct BigNum const *bn, unsigned char *dest,
|
||||
unsigned lsbyte, unsigned len)
|
||||
{
|
||||
unsigned s = bn->size * (16 / 8);
|
||||
|
||||
/* Fill unused leading bytes with 0 */
|
||||
while (s < lsbyte+len)
|
||||
dest[--len] = 0;
|
||||
|
||||
if (len)
|
||||
lbnExtractLittleBytes_16((BNWORD16 *)bn->ptr, dest,
|
||||
lsbyte, len);
|
||||
MALLOCDB;
|
||||
}
|
||||
|
||||
int
|
||||
bnInsertLittleBytes_16(struct BigNum *bn, unsigned char const *src,
|
||||
unsigned lsbyte, unsigned len)
|
||||
{
|
||||
unsigned s = bn->size;
|
||||
unsigned words = (len+lsbyte+sizeof(BNWORD16)-1) / sizeof(BNWORD16);
|
||||
|
||||
/* Pad with zeros as required */
|
||||
bnSizeCheck(bn, words);
|
||||
|
||||
if (s < words) {
|
||||
lbnZero_16((BNWORD16 *)bn->ptr BIGLITTLE(-s,+s), words-s);
|
||||
s = words;
|
||||
}
|
||||
|
||||
lbnInsertLittleBytes_16((BNWORD16 *)bn->ptr, src, lsbyte, len);
|
||||
|
||||
bn->size = lbnNorm_16((BNWORD16 *)bn->ptr, s);
|
||||
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Return the least-significant word of the input. */
|
||||
unsigned
|
||||
bnLSWord_16(struct BigNum const *src)
|
||||
{
|
||||
return src->size ? (unsigned)((BNWORD16 *)src->ptr)[BIGLITTLE(-1,0)]: 0;
|
||||
}
|
||||
|
||||
unsigned
|
||||
bnBits_16(struct BigNum const *src)
|
||||
{
|
||||
return lbnBits_16((BNWORD16 *)src->ptr, src->size);
|
||||
}
|
||||
|
||||
int
|
||||
bnAdd_16(struct BigNum *dest, struct BigNum const *src)
|
||||
{
|
||||
unsigned s = src->size, d = dest->size;
|
||||
BNWORD16 t;
|
||||
|
||||
if (!s)
|
||||
return 0;
|
||||
|
||||
bnSizeCheck(dest, s);
|
||||
|
||||
if (d < s) {
|
||||
lbnZero_16((BNWORD16 *)dest->ptr BIGLITTLE(-d,+d), s-d);
|
||||
dest->size = d = s;
|
||||
MALLOCDB;
|
||||
}
|
||||
t = lbnAddN_16((BNWORD16 *)dest->ptr, (BNWORD16 *)src->ptr, s);
|
||||
MALLOCDB;
|
||||
if (t) {
|
||||
if (d > s) {
|
||||
t = lbnAdd1_16((BNWORD16 *)dest->ptr BIGLITTLE(-s,+s),
|
||||
d-s, t);
|
||||
MALLOCDB;
|
||||
}
|
||||
if (t) {
|
||||
bnSizeCheck(dest, d+1);
|
||||
((BNWORD16 *)dest->ptr)[BIGLITTLE(-1-d,d)] = t;
|
||||
dest->size = d+1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* dest -= src.
|
||||
* If dest goes negative, this produces the absolute value of
|
||||
* the difference (the negative of the true value) and returns 1.
|
||||
* Otherwise, it returls 0.
|
||||
*/
|
||||
int
|
||||
bnSub_16(struct BigNum *dest, struct BigNum const *src)
|
||||
{
|
||||
unsigned s = src->size, d = dest->size;
|
||||
BNWORD16 t;
|
||||
|
||||
if (d < s && d < (s = lbnNorm_16((BNWORD16 *)src->ptr, s))) {
|
||||
bnSizeCheck(dest, s);
|
||||
lbnZero_16((BNWORD16 *)dest->ptr BIGLITTLE(-d,+d), s-d);
|
||||
dest->size = d = s;
|
||||
MALLOCDB;
|
||||
}
|
||||
if (!s)
|
||||
return 0;
|
||||
t = lbnSubN_16((BNWORD16 *)dest->ptr, (BNWORD16 *)src->ptr, s);
|
||||
MALLOCDB;
|
||||
if (t) {
|
||||
if (d > s) {
|
||||
t = lbnSub1_16((BNWORD16 *)dest->ptr BIGLITTLE(-s,+s),
|
||||
d-s, t);
|
||||
MALLOCDB;
|
||||
}
|
||||
if (t) {
|
||||
lbnNeg_16((BNWORD16 *)dest->ptr, d);
|
||||
dest->size = lbnNorm_16((BNWORD16 *)dest->ptr,
|
||||
dest->size);
|
||||
MALLOCDB;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
dest->size = lbnNorm_16((BNWORD16 *)dest->ptr, dest->size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compare the BigNum to the given value, which must be < 65536.
|
||||
* Returns -1. 0 or 1 if a<b, a == b or a>b.
|
||||
* a <=> b --> bnCmpQ(a,b) <=> 0
|
||||
*/
|
||||
int
|
||||
bnCmpQ_16(struct BigNum const *a, unsigned b)
|
||||
{
|
||||
unsigned t;
|
||||
BNWORD16 v;
|
||||
|
||||
t = lbnNorm_16((BNWORD16 *)a->ptr, a->size);
|
||||
/* If a is more than one word long or zero, it's easy... */
|
||||
if (t != 1)
|
||||
return (t > 1) ? 1 : (b ? -1 : 0);
|
||||
v = (unsigned)((BNWORD16 *)a->ptr)[BIGLITTLE(-1,0)];
|
||||
return (v > b) ? 1 : ((v < b) ? -1 : 0);
|
||||
}
|
||||
|
||||
int
|
||||
bnSetQ_16(struct BigNum *dest, unsigned src)
|
||||
{
|
||||
if (src) {
|
||||
bnSizeCheck(dest, 1);
|
||||
|
||||
((BNWORD16 *)dest->ptr)[BIGLITTLE(-1,0)] = (BNWORD16)src;
|
||||
dest->size = 1;
|
||||
} else {
|
||||
dest->size = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnAddQ_16(struct BigNum *dest, unsigned src)
|
||||
{
|
||||
BNWORD16 t;
|
||||
|
||||
if (!dest->size)
|
||||
return bnSetQ(dest, src);
|
||||
|
||||
t = lbnAdd1_16((BNWORD16 *)dest->ptr, dest->size, (BNWORD16)src);
|
||||
MALLOCDB;
|
||||
if (t) {
|
||||
src = dest->size;
|
||||
bnSizeCheck(dest, src+1);
|
||||
((BNWORD16 *)dest->ptr)[BIGLITTLE(-1-src,src)] = t;
|
||||
dest->size = src+1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return value as for bnSub: 1 if subtract underflowed, in which
|
||||
* case the return is the negative of the computed value.
|
||||
*/
|
||||
int
|
||||
bnSubQ_16(struct BigNum *dest, unsigned src)
|
||||
{
|
||||
BNWORD16 t;
|
||||
|
||||
if (!dest->size)
|
||||
return bnSetQ(dest, src) < 0 ? -1 : (src != 0);
|
||||
|
||||
t = lbnSub1_16((BNWORD16 *)dest->ptr, dest->size, (BNWORD16)src);
|
||||
MALLOCDB;
|
||||
if (t) {
|
||||
/* Underflow. <= 1 word, so do it simply. */
|
||||
lbnNeg_16((BNWORD16 *)dest->ptr, 1);
|
||||
dest->size = 1;
|
||||
return 1;
|
||||
}
|
||||
/* Try to normalize? Needing this is going to be very rare. */
|
||||
/* dest->size = lbnNorm_16((BNWORD16 *)dest->ptr, dest->size); */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compare two BigNums. Returns -1. 0 or 1 if a<b, a == b or a>b.
|
||||
* a <=> b --> bnCmp(a,b) <=> 0
|
||||
*/
|
||||
int
|
||||
bnCmp_16(struct BigNum const *a, struct BigNum const *b)
|
||||
{
|
||||
unsigned s, t;
|
||||
|
||||
s = lbnNorm_16((BNWORD16 *)a->ptr, a->size);
|
||||
t = lbnNorm_16((BNWORD16 *)b->ptr, b->size);
|
||||
|
||||
if (s != t)
|
||||
return s > t ? 1 : -1;
|
||||
return lbnCmp_16((BNWORD16 *)a->ptr, (BNWORD16 *)b->ptr, s);
|
||||
}
|
||||
|
||||
int
|
||||
bnSquare_16(struct BigNum *dest, struct BigNum const *src)
|
||||
{
|
||||
unsigned s;
|
||||
BNWORD16 *srcbuf;
|
||||
|
||||
s = lbnNorm_16((BNWORD16 *)src->ptr, src->size);
|
||||
if (!s) {
|
||||
dest->size = 0;
|
||||
return 0;
|
||||
}
|
||||
bnSizeCheck(dest, 2*s);
|
||||
|
||||
if (src == dest) {
|
||||
LBNALLOC(srcbuf, s);
|
||||
if (!srcbuf)
|
||||
return -1;
|
||||
lbnCopy_16(srcbuf, (BNWORD16 *)src->ptr, s);
|
||||
lbnSquare_16((BNWORD16 *)dest->ptr, (BNWORD16 *)srcbuf, s);
|
||||
LBNFREE(srcbuf, s);
|
||||
} else {
|
||||
lbnSquare_16((BNWORD16 *)dest->ptr, (BNWORD16 *)src->ptr, s);
|
||||
}
|
||||
|
||||
dest->size = lbnNorm_16((BNWORD16 *)dest->ptr, 2*s);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnMul_16(struct BigNum *dest, struct BigNum const *a, struct BigNum const *b)
|
||||
{
|
||||
unsigned s, t;
|
||||
BNWORD16 *srcbuf;
|
||||
|
||||
s = lbnNorm_16((BNWORD16 *)a->ptr, a->size);
|
||||
t = lbnNorm_16((BNWORD16 *)b->ptr, b->size);
|
||||
|
||||
if (!s || !t) {
|
||||
dest->size = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (a == b)
|
||||
return bnSquare_16(dest, a);
|
||||
|
||||
bnSizeCheck(dest, s+t);
|
||||
|
||||
if (dest == a) {
|
||||
LBNALLOC(srcbuf, s);
|
||||
if (!srcbuf)
|
||||
return -1;
|
||||
lbnCopy_16(srcbuf, (BNWORD16 *)a->ptr, s);
|
||||
lbnMul_16((BNWORD16 *)dest->ptr, srcbuf, s,
|
||||
(BNWORD16 *)b->ptr, t);
|
||||
LBNFREE(srcbuf, s);
|
||||
} else if (dest == b) {
|
||||
LBNALLOC(srcbuf, t);
|
||||
if (!srcbuf)
|
||||
return -1;
|
||||
lbnCopy_16(srcbuf, (BNWORD16 *)b->ptr, t);
|
||||
lbnMul_16((BNWORD16 *)dest->ptr, (BNWORD16 *)a->ptr, s,
|
||||
srcbuf, t);
|
||||
LBNFREE(srcbuf, t);
|
||||
} else {
|
||||
lbnMul_16((BNWORD16 *)dest->ptr, (BNWORD16 *)a->ptr, s,
|
||||
(BNWORD16 *)b->ptr, t);
|
||||
}
|
||||
dest->size = lbnNorm_16((BNWORD16 *)dest->ptr, s+t);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnMulQ_16(struct BigNum *dest, struct BigNum const *a, unsigned b)
|
||||
{
|
||||
unsigned s;
|
||||
|
||||
s = lbnNorm_16((BNWORD16 *)a->ptr, a->size);
|
||||
if (!s || !b) {
|
||||
dest->size = 0;
|
||||
return 0;
|
||||
}
|
||||
if (b == 1)
|
||||
return bnCopy_16(dest, a);
|
||||
bnSizeCheck(dest, s+1);
|
||||
lbnMulN1_16((BNWORD16 *)dest->ptr, (BNWORD16 *)a->ptr, s, (BNWORD16)b);
|
||||
dest->size = lbnNorm_16((BNWORD16 *)dest->ptr, s+1);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnDivMod_16(struct BigNum *q, struct BigNum *r, struct BigNum const *n,
|
||||
struct BigNum const *d)
|
||||
{
|
||||
unsigned dsize, nsize;
|
||||
BNWORD16 qhigh;
|
||||
|
||||
dsize = lbnNorm_16((BNWORD16 *)d->ptr, d->size);
|
||||
nsize = lbnNorm_16((BNWORD16 *)n->ptr, n->size);
|
||||
|
||||
if (nsize < dsize) {
|
||||
q->size = 0; /* No quotient */
|
||||
r->size = nsize;
|
||||
return 0; /* Success */
|
||||
}
|
||||
|
||||
bnSizeCheck(q, nsize-dsize);
|
||||
|
||||
if (r != n) { /* You are allowed to reduce in place */
|
||||
bnSizeCheck(r, nsize);
|
||||
lbnCopy_16((BNWORD16 *)r->ptr, (BNWORD16 *)n->ptr, nsize);
|
||||
}
|
||||
|
||||
qhigh = lbnDiv_16((BNWORD16 *)q->ptr, (BNWORD16 *)r->ptr, nsize,
|
||||
(BNWORD16 *)d->ptr, dsize);
|
||||
nsize -= dsize;
|
||||
if (qhigh) {
|
||||
bnSizeCheck(q, nsize+1);
|
||||
*((BNWORD16 *)q->ptr BIGLITTLE(-nsize-1,+nsize)) = qhigh;
|
||||
q->size = nsize+1;
|
||||
} else {
|
||||
q->size = lbnNorm_16((BNWORD16 *)q->ptr, nsize);
|
||||
}
|
||||
r->size = lbnNorm_16((BNWORD16 *)r->ptr, dsize);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnMod_16(struct BigNum *dest, struct BigNum const *src, struct BigNum const *d)
|
||||
{
|
||||
unsigned dsize, nsize;
|
||||
|
||||
nsize = lbnNorm_16((BNWORD16 *)src->ptr, src->size);
|
||||
dsize = lbnNorm_16((BNWORD16 *)d->ptr, d->size);
|
||||
|
||||
|
||||
if (dest != src) {
|
||||
bnSizeCheck(dest, nsize);
|
||||
lbnCopy_16((BNWORD16 *)dest->ptr, (BNWORD16 *)src->ptr, nsize);
|
||||
}
|
||||
|
||||
if (nsize < dsize) {
|
||||
dest->size = nsize; /* No quotient */
|
||||
return 0;
|
||||
}
|
||||
|
||||
(void)lbnDiv_16((BNWORD16 *)dest->ptr BIGLITTLE(-dsize,+dsize),
|
||||
(BNWORD16 *)dest->ptr, nsize,
|
||||
(BNWORD16 *)d->ptr, dsize);
|
||||
dest->size = lbnNorm_16((BNWORD16 *)dest->ptr, dsize);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned
|
||||
bnModQ_16(struct BigNum const *src, unsigned d)
|
||||
{
|
||||
unsigned s;
|
||||
|
||||
s = lbnNorm_16((BNWORD16 *)src->ptr, src->size);
|
||||
if (!s)
|
||||
return 0;
|
||||
|
||||
return lbnModQ_16((BNWORD16 *)src->ptr, s, d);
|
||||
}
|
||||
|
||||
int
|
||||
bnExpMod_16(struct BigNum *dest, struct BigNum const *n,
|
||||
struct BigNum const *exp, struct BigNum const *mod)
|
||||
{
|
||||
unsigned nsize, esize, msize;
|
||||
|
||||
nsize = lbnNorm_16((BNWORD16 *)n->ptr, n->size);
|
||||
esize = lbnNorm_16((BNWORD16 *)exp->ptr, exp->size);
|
||||
msize = lbnNorm_16((BNWORD16 *)mod->ptr, mod->size);
|
||||
|
||||
if (!msize || (((BNWORD16 *)mod->ptr)[BIGLITTLE(-1,0)] & 1) == 0)
|
||||
return -1; /* Illegal modulus! */
|
||||
|
||||
bnSizeCheck(dest, msize);
|
||||
|
||||
/* Special-case base of 2 */
|
||||
if (nsize == 1 && ((BNWORD16 *)n->ptr)[BIGLITTLE(-1,0)] == 2) {
|
||||
if (lbnTwoExpMod_16((BNWORD16 *)dest->ptr,
|
||||
(BNWORD16 *)exp->ptr, esize,
|
||||
(BNWORD16 *)mod->ptr, msize) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
if (lbnExpMod_16((BNWORD16 *)dest->ptr,
|
||||
(BNWORD16 *)n->ptr, nsize,
|
||||
(BNWORD16 *)exp->ptr, esize,
|
||||
(BNWORD16 *)mod->ptr, msize) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
dest->size = lbnNorm_16((BNWORD16 *)dest->ptr, msize);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnDoubleExpMod_16(struct BigNum *dest,
|
||||
struct BigNum const *n1, struct BigNum const *e1,
|
||||
struct BigNum const *n2, struct BigNum const *e2,
|
||||
struct BigNum const *mod)
|
||||
{
|
||||
unsigned n1size, e1size, n2size, e2size, msize;
|
||||
|
||||
n1size = lbnNorm_16((BNWORD16 *)n1->ptr, n1->size);
|
||||
e1size = lbnNorm_16((BNWORD16 *)e1->ptr, e1->size);
|
||||
n2size = lbnNorm_16((BNWORD16 *)n2->ptr, n2->size);
|
||||
e2size = lbnNorm_16((BNWORD16 *)e2->ptr, e2->size);
|
||||
msize = lbnNorm_16((BNWORD16 *)mod->ptr, mod->size);
|
||||
|
||||
if (!msize || (((BNWORD16 *)mod->ptr)[BIGLITTLE(-1,0)] & 1) == 0)
|
||||
return -1; /* Illegal modulus! */
|
||||
|
||||
bnSizeCheck(dest, msize);
|
||||
|
||||
if (lbnDoubleExpMod_16((BNWORD16 *)dest->ptr,
|
||||
(BNWORD16 *)n1->ptr, n1size, (BNWORD16 *)e1->ptr, e1size,
|
||||
(BNWORD16 *)n2->ptr, n2size, (BNWORD16 *)e2->ptr, e2size,
|
||||
(BNWORD16 *)mod->ptr, msize) < 0)
|
||||
return -1;
|
||||
|
||||
dest->size = lbnNorm_16((BNWORD16 *)dest->ptr, msize);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnTwoExpMod_16(struct BigNum *n, struct BigNum const *exp,
|
||||
struct BigNum const *mod)
|
||||
{
|
||||
unsigned esize, msize;
|
||||
|
||||
esize = lbnNorm_16((BNWORD16 *)exp->ptr, exp->size);
|
||||
msize = lbnNorm_16((BNWORD16 *)mod->ptr, mod->size);
|
||||
|
||||
if (!msize || (((BNWORD16 *)mod->ptr)[BIGLITTLE(-1,0)] & 1) == 0)
|
||||
return -1; /* Illegal modulus! */
|
||||
|
||||
bnSizeCheck(n, msize);
|
||||
|
||||
if (lbnTwoExpMod_16((BNWORD16 *)n->ptr, (BNWORD16 *)exp->ptr, esize,
|
||||
(BNWORD16 *)mod->ptr, msize) < 0)
|
||||
return -1;
|
||||
|
||||
n->size = lbnNorm_16((BNWORD16 *)n->ptr, msize);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnGcd_16(struct BigNum *dest, struct BigNum const *a, struct BigNum const *b)
|
||||
{
|
||||
BNWORD16 *tmp;
|
||||
unsigned asize, bsize;
|
||||
int i;
|
||||
|
||||
/* Kind of silly, but we might as well permit it... */
|
||||
if (a == b)
|
||||
return dest == a ? 0 : bnCopy(dest, a);
|
||||
|
||||
/* Ensure a is not the same as "dest" */
|
||||
if (a == dest) {
|
||||
a = b;
|
||||
b = dest;
|
||||
}
|
||||
|
||||
asize = lbnNorm_16((BNWORD16 *)a->ptr, a->size);
|
||||
bsize = lbnNorm_16((BNWORD16 *)b->ptr, b->size);
|
||||
|
||||
bnSizeCheck(dest, bsize+1);
|
||||
|
||||
/* Copy a to tmp */
|
||||
LBNALLOC(tmp, asize+1);
|
||||
if (!tmp)
|
||||
return -1;
|
||||
lbnCopy_16(tmp, (BNWORD16 *)a->ptr, asize);
|
||||
|
||||
/* Copy b to dest,if necessary */
|
||||
if (dest != b)
|
||||
lbnCopy_16((BNWORD16 *)dest->ptr,
|
||||
(BNWORD16 *)b->ptr, bsize);
|
||||
if (bsize > asize || (bsize == asize &&
|
||||
lbnCmp_16((BNWORD16 *)b->ptr, (BNWORD16 *)a->ptr, asize) > 0))
|
||||
{
|
||||
i = lbnGcd_16((BNWORD16 *)dest->ptr, bsize, tmp, asize);
|
||||
if (i >= 0) {
|
||||
dest->size = (unsigned)i;
|
||||
} else {
|
||||
lbnCopy_16((BNWORD16 *)dest->ptr, tmp,
|
||||
(unsigned)-i);
|
||||
dest->size = (unsigned)-i;
|
||||
}
|
||||
} else {
|
||||
i = lbnGcd_16(tmp, asize, (BNWORD16 *)dest->ptr, bsize);
|
||||
if (i <= 0) {
|
||||
dest->size = (unsigned)-i;
|
||||
} else {
|
||||
lbnCopy_16((BNWORD16 *)dest->ptr, tmp,
|
||||
(unsigned)i);
|
||||
dest->size = (unsigned)i;
|
||||
}
|
||||
}
|
||||
LBNFREE(tmp, asize+1);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnInv_16(struct BigNum *dest, struct BigNum const *src,
|
||||
struct BigNum const *mod)
|
||||
{
|
||||
unsigned s, m;
|
||||
int i;
|
||||
|
||||
s = lbnNorm_16((BNWORD16 *)src->ptr, src->size);
|
||||
m = lbnNorm_16((BNWORD16 *)mod->ptr, mod->size);
|
||||
|
||||
/* lbnInv_16 requires that the input be less than the modulus */
|
||||
if (m < s ||
|
||||
(m==s && lbnCmp_16((BNWORD16 *)src->ptr, (BNWORD16 *)mod->ptr, s)))
|
||||
{
|
||||
bnSizeCheck(dest, s + (m==s));
|
||||
if (dest != src)
|
||||
lbnCopy_16((BNWORD16 *)dest->ptr,
|
||||
(BNWORD16 *)src->ptr, s);
|
||||
/* Pre-reduce modulo the modulus */
|
||||
(void)lbnDiv_16((BNWORD16 *)dest->ptr BIGLITTLE(-m,+m),
|
||||
(BNWORD16 *)dest->ptr, s,
|
||||
(BNWORD16 *)mod->ptr, m);
|
||||
s = lbnNorm_16((BNWORD16 *)dest->ptr, m);
|
||||
MALLOCDB;
|
||||
} else {
|
||||
bnSizeCheck(dest, m+1);
|
||||
if (dest != src)
|
||||
lbnCopy_16((BNWORD16 *)dest->ptr,
|
||||
(BNWORD16 *)src->ptr, s);
|
||||
}
|
||||
|
||||
i = lbnInv_16((BNWORD16 *)dest->ptr, s, (BNWORD16 *)mod->ptr, m);
|
||||
if (i == 0)
|
||||
dest->size = lbnNorm_16((BNWORD16 *)dest->ptr, m);
|
||||
|
||||
MALLOCDB;
|
||||
return i;
|
||||
}
|
||||
|
||||
/*
|
||||
* Shift a bignum left the appropriate number of bits,
|
||||
* multiplying by 2^amt.
|
||||
*/
|
||||
int
|
||||
bnLShift_16(struct BigNum *dest, unsigned amt)
|
||||
{
|
||||
unsigned s = dest->size;
|
||||
BNWORD16 carry;
|
||||
|
||||
if (amt % 16) {
|
||||
carry = lbnLshift_16(dest->ptr, s, amt % 16);
|
||||
if (carry) {
|
||||
s++;
|
||||
bnSizeCheck(dest, s);
|
||||
((BNWORD16 *)dest->ptr)[BIGLITTLE(-s,s-1)] = carry;
|
||||
}
|
||||
}
|
||||
|
||||
amt /= 16;
|
||||
if (amt) {
|
||||
bnSizeCheck(dest, s+amt);
|
||||
memmove((BNWORD16 *)dest->ptr BIGLITTLE(-s-amt, +amt),
|
||||
(BNWORD16 *)dest->ptr BIG(-s),
|
||||
s * sizeof(BNWORD16));
|
||||
lbnZero_16((BNWORD16 *)dest->ptr, amt);
|
||||
s += amt;
|
||||
}
|
||||
dest->size = s;
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Shift a bignum right the appropriate number of bits,
|
||||
* dividing by 2^amt.
|
||||
*/
|
||||
void bnRShift_16(struct BigNum *dest, unsigned amt)
|
||||
{
|
||||
unsigned s = dest->size;
|
||||
|
||||
if (amt >= 16) {
|
||||
memmove(
|
||||
(BNWORD16 *)dest->ptr BIG(-s+amt/16),
|
||||
(BNWORD16 *)dest->ptr BIGLITTLE(-s, +amt/16),
|
||||
s-amt/16 * sizeof(BNWORD16));
|
||||
s -= amt/16;
|
||||
amt %= 16;
|
||||
}
|
||||
|
||||
if (amt)
|
||||
(void)lbnRshift_16(dest->ptr, s, amt);
|
||||
|
||||
dest->size = lbnNorm_16(dest->ptr, s);
|
||||
MALLOCDB;
|
||||
}
|
||||
|
||||
/*
|
||||
* Shift a bignum right until it is odd, and return the number of
|
||||
* bits shifted. n = d * 2^s. Replaces n with d and returns s.
|
||||
* Returns 0 when given 0. (Another valid answer is infinity.)
|
||||
*/
|
||||
unsigned
|
||||
bnMakeOdd_16(struct BigNum *n)
|
||||
{
|
||||
unsigned size;
|
||||
unsigned s; /* shift amount */
|
||||
BNWORD16 *p;
|
||||
BNWORD16 t;
|
||||
|
||||
p = (BNWORD16 *)n->ptr;
|
||||
size = lbnNorm_16(p, n->size);
|
||||
if (!size)
|
||||
return 0;
|
||||
|
||||
t = BIGLITTLE(p[-1],p[0]);
|
||||
s = 0;
|
||||
|
||||
/* See how many words we have to shift */
|
||||
if (!t) {
|
||||
/* Shift by words */
|
||||
do {
|
||||
|
||||
s++;
|
||||
BIGLITTLE(--p,p++);
|
||||
} while ((t = BIGLITTLE(p[-1],p[0])) == 0);
|
||||
size -= s;
|
||||
s *= 16;
|
||||
memmove((BNWORD16 *)n->ptr BIG(-size), p BIG(-size),
|
||||
size * sizeof(BNWORD16));
|
||||
p = (BNWORD16 *)n->ptr;
|
||||
MALLOCDB;
|
||||
}
|
||||
|
||||
assert(t);
|
||||
|
||||
/* Now count the bits */
|
||||
while ((t & 1) == 0) {
|
||||
t >>= 1;
|
||||
s++;
|
||||
}
|
||||
|
||||
/* Shift the bits */
|
||||
if (s & (16-1)) {
|
||||
lbnRshift_16(p, size, s & (16-1));
|
||||
/* Renormalize */
|
||||
if (BIGLITTLE(*(p-size),*(p+(size-1))) == 0)
|
||||
--size;
|
||||
}
|
||||
n->size = size;
|
||||
|
||||
MALLOCDB;
|
||||
return s;
|
||||
}
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bn16.h - interface to 16-bit bignum routines.
|
||||
*/
|
||||
struct BigNum;
|
||||
|
||||
void bnInit_16(void);
|
||||
void bnEnd_16(struct BigNum *bn);
|
||||
int bnPrealloc_16(struct BigNum *bn, unsigned bits);
|
||||
int bnCopy_16(struct BigNum *dest, struct BigNum const *src);
|
||||
int bnSwap_16(struct BigNum *a, struct BigNum *b);
|
||||
void bnNorm_16(struct BigNum *bn);
|
||||
void bnExtractBigBytes_16(struct BigNum const *bn, unsigned char *dest,
|
||||
unsigned lsbyte, unsigned dlen);
|
||||
int bnInsertBigBytes_16(struct BigNum *bn, unsigned char const *src,
|
||||
unsigned lsbyte, unsigned len);
|
||||
void bnExtractLittleBytes_16(struct BigNum const *bn, unsigned char *dest,
|
||||
unsigned lsbyte, unsigned dlen);
|
||||
int bnInsertLittleBytes_16(struct BigNum *bn, unsigned char const *src,
|
||||
unsigned lsbyte, unsigned len);
|
||||
unsigned bnLSWord_16(struct BigNum const *src);
|
||||
unsigned bnBits_16(struct BigNum const *src);
|
||||
int bnAdd_16(struct BigNum *dest, struct BigNum const *src);
|
||||
int bnSub_16(struct BigNum *dest, struct BigNum const *src);
|
||||
int bnCmpQ_16(struct BigNum const *a, unsigned b);
|
||||
int bnSetQ_16(struct BigNum *dest, unsigned src);
|
||||
int bnAddQ_16(struct BigNum *dest, unsigned src);
|
||||
int bnSubQ_16(struct BigNum *dest, unsigned src);
|
||||
int bnCmp_16(struct BigNum const *a, struct BigNum const *b);
|
||||
int bnSquare_16(struct BigNum *dest, struct BigNum const *src);
|
||||
int bnMul_16(struct BigNum *dest, struct BigNum const *a,
|
||||
struct BigNum const *b);
|
||||
int bnMulQ_16(struct BigNum *dest, struct BigNum const *a, unsigned b);
|
||||
int bnDivMod_16(struct BigNum *q, struct BigNum *r, struct BigNum const *n,
|
||||
struct BigNum const *d);
|
||||
int bnMod_16(struct BigNum *dest, struct BigNum const *src,
|
||||
struct BigNum const *d);
|
||||
unsigned bnModQ_16(struct BigNum const *src, unsigned d);
|
||||
int bnExpMod_16(struct BigNum *dest, struct BigNum const *n,
|
||||
struct BigNum const *exp, struct BigNum const *mod);
|
||||
int bnDoubleExpMod_16(struct BigNum *dest,
|
||||
struct BigNum const *n1, struct BigNum const *e1,
|
||||
struct BigNum const *n2, struct BigNum const *e2,
|
||||
struct BigNum const *mod);
|
||||
int bnTwoExpMod_16(struct BigNum *n, struct BigNum const *exp,
|
||||
struct BigNum const *mod);
|
||||
int bnGcd_16(struct BigNum *dest, struct BigNum const *a,
|
||||
struct BigNum const *b);
|
||||
int bnInv_16(struct BigNum *dest, struct BigNum const *src,
|
||||
struct BigNum const *mod);
|
||||
int bnLShift_16(struct BigNum *dest, unsigned amt);
|
||||
void bnRShift_16(struct BigNum *dest, unsigned amt);
|
||||
unsigned bnMakeOdd_16(struct BigNum *n);
|
||||
|
|
@ -1,949 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bn32.c - the high-level bignum interface
|
||||
*
|
||||
* Like lbn32.c, this reserves the string "32" for textual replacement.
|
||||
* The string must not appear anywhere unless it is intended to be replaced
|
||||
* to generate other bignum interface functions.
|
||||
*
|
||||
* Copyright (c) 1995 Colin Plumb. All rights reserved.
|
||||
* For licensing and other legal details, see the file legal.c.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_CONFIG_H
|
||||
#define HAVE_CONFIG_H 0
|
||||
#endif
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Some compilers complain about #if FOO if FOO isn't defined,
|
||||
* so do the ANSI-mandated thing explicitly...
|
||||
*/
|
||||
#ifndef NO_ASSERT_H
|
||||
#define NO_ASSERT_H 0
|
||||
#endif
|
||||
#ifndef NO_STRING_H
|
||||
#define NO_STRING_H 0
|
||||
#endif
|
||||
#ifndef HAVE_STRINGS_H
|
||||
#define HAVE_STRINGS_H 0
|
||||
#endif
|
||||
#ifndef NEED_MEMORY_H
|
||||
#define NEED_MEMORY_H 0
|
||||
#endif
|
||||
|
||||
#if !NO_ASSERT_H
|
||||
#include <assert.h>
|
||||
#else
|
||||
#define assert(x) (void)0
|
||||
#endif
|
||||
|
||||
#if !NO_STRING_H
|
||||
#include <string.h> /* for memmove() in bnMakeOdd */
|
||||
#elif HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#if NEED_MEMORY_H
|
||||
#include <memory.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This was useful during debugging, so it's left in here.
|
||||
* You can ignore it. DBMALLOC is generally undefined.
|
||||
*/
|
||||
#ifndef DBMALLOC
|
||||
#define DBAMLLOC 0
|
||||
#endif
|
||||
#if DBMALLOC
|
||||
#include "../dbmalloc/malloc.h"
|
||||
#define MALLOCDB malloc_chain_check(1)
|
||||
#else
|
||||
#define MALLOCDB (void)0
|
||||
#endif
|
||||
|
||||
#include "lbn.h"
|
||||
#include "lbn32.h"
|
||||
#include "lbnmem.h"
|
||||
#include "bn32.h"
|
||||
#include "bn.h"
|
||||
|
||||
/* Work-arounds for some particularly broken systems */
|
||||
#include "kludge.h" /* For memmove() */
|
||||
#include <port_after.h>
|
||||
|
||||
/* Functions */
|
||||
void
|
||||
bnInit_32(void)
|
||||
{
|
||||
bnEnd = bnEnd_32;
|
||||
bnPrealloc = bnPrealloc_32;
|
||||
bnCopy = bnCopy_32;
|
||||
bnNorm = bnNorm_32;
|
||||
bnExtractBigBytes = bnExtractBigBytes_32;
|
||||
bnInsertBigBytes = bnInsertBigBytes_32;
|
||||
bnExtractLittleBytes = bnExtractLittleBytes_32;
|
||||
bnInsertLittleBytes = bnInsertLittleBytes_32;
|
||||
bnLSWord = bnLSWord_32;
|
||||
bnBits = bnBits_32;
|
||||
bnAdd = bnAdd_32;
|
||||
bnSub = bnSub_32;
|
||||
bnCmpQ = bnCmpQ_32;
|
||||
bnSetQ = bnSetQ_32;
|
||||
bnAddQ = bnAddQ_32;
|
||||
bnSubQ = bnSubQ_32;
|
||||
bnCmp = bnCmp_32;
|
||||
bnSquare = bnSquare_32;
|
||||
bnMul = bnMul_32;
|
||||
bnMulQ = bnMulQ_32;
|
||||
bnDivMod = bnDivMod_32;
|
||||
bnMod = bnMod_32;
|
||||
bnModQ = bnModQ_32;
|
||||
bnExpMod = bnExpMod_32;
|
||||
bnDoubleExpMod = bnDoubleExpMod_32;
|
||||
bnTwoExpMod = bnTwoExpMod_32;
|
||||
bnGcd = bnGcd_32;
|
||||
bnInv = bnInv_32;
|
||||
bnLShift = bnLShift_32;
|
||||
bnRShift = bnRShift_32;
|
||||
bnMakeOdd = bnMakeOdd_32;
|
||||
}
|
||||
|
||||
void
|
||||
bnEnd_32(struct BigNum *bn)
|
||||
{
|
||||
if (bn->ptr) {
|
||||
LBNFREE((BNWORD32 *)bn->ptr, bn->allocated);
|
||||
bn->ptr = 0;
|
||||
}
|
||||
bn->size = 0;
|
||||
bn->allocated = 0;
|
||||
|
||||
MALLOCDB;
|
||||
}
|
||||
|
||||
/* Internal function. It operates in words. */
|
||||
static int
|
||||
bnResize_32(struct BigNum *bn, unsigned len)
|
||||
{
|
||||
void *p;
|
||||
|
||||
/* Round size up: most mallocs impose 8-byte granularity anyway */
|
||||
len = (len + (8/sizeof(BNWORD32) - 1)) & ~(8/sizeof(BNWORD32) - 1);
|
||||
p = LBNREALLOC((BNWORD32 *)bn->ptr, bn->allocated, len);
|
||||
if (!p)
|
||||
return -1;
|
||||
bn->ptr = p;
|
||||
bn->allocated = len;
|
||||
|
||||
MALLOCDB;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define bnSizeCheck(bn, size) \
|
||||
if (bn->allocated < size && bnResize_32(bn, size) < 0) \
|
||||
return -1
|
||||
|
||||
int
|
||||
bnPrealloc_32(struct BigNum *bn, unsigned bits)
|
||||
{
|
||||
bits = (bits + 32-1)/32;
|
||||
bnSizeCheck(bn, bits);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnCopy_32(struct BigNum *dest, struct BigNum const *src)
|
||||
{
|
||||
bnSizeCheck(dest, src->size);
|
||||
dest->size = src->size;
|
||||
lbnCopy_32((BNWORD32 *)dest->ptr, (BNWORD32 *)src->ptr, src->size);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
bnNorm_32(struct BigNum *bn)
|
||||
{
|
||||
bn->size = lbnNorm_32((BNWORD32 *)bn->ptr, bn->size);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a bignum to big-endian bytes. Returns, in big-endian form, a
|
||||
* substring of the bignum starting from lsbyte and "len" bytes long.
|
||||
* Unused high-order (leading) bytes are filled with 0.
|
||||
*/
|
||||
void
|
||||
bnExtractBigBytes_32(struct BigNum const *bn, unsigned char *dest,
|
||||
unsigned lsbyte, unsigned len)
|
||||
{
|
||||
unsigned s = bn->size * (32 / 8);
|
||||
|
||||
/* Fill unused leading bytes with 0 */
|
||||
while (s < lsbyte+len) {
|
||||
*dest++ = 0;
|
||||
len--;
|
||||
}
|
||||
|
||||
if (len)
|
||||
lbnExtractBigBytes_32((BNWORD32 *)bn->ptr, dest, lsbyte, len);
|
||||
MALLOCDB;
|
||||
}
|
||||
|
||||
int
|
||||
bnInsertBigBytes_32(struct BigNum *bn, unsigned char const *src,
|
||||
unsigned lsbyte, unsigned len)
|
||||
{
|
||||
unsigned s = bn->size;
|
||||
unsigned words = (len+lsbyte+sizeof(BNWORD32)-1) / sizeof(BNWORD32);
|
||||
|
||||
/* Pad with zeros as required */
|
||||
bnSizeCheck(bn, words);
|
||||
|
||||
if (s < words) {
|
||||
lbnZero_32((BNWORD32 *)bn->ptr BIGLITTLE(-s,+s), words-s);
|
||||
s = words;
|
||||
}
|
||||
|
||||
lbnInsertBigBytes_32((BNWORD32 *)bn->ptr, src, lsbyte, len);
|
||||
|
||||
bn->size = lbnNorm_32((BNWORD32 *)bn->ptr, s);
|
||||
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Convert a bignum to little-endian bytes. Returns, in little-endian form, a
|
||||
* substring of the bignum starting from lsbyte and "len" bytes long.
|
||||
* Unused high-order (trailing) bytes are filled with 0.
|
||||
*/
|
||||
void
|
||||
bnExtractLittleBytes_32(struct BigNum const *bn, unsigned char *dest,
|
||||
unsigned lsbyte, unsigned len)
|
||||
{
|
||||
unsigned s = bn->size * (32 / 8);
|
||||
|
||||
/* Fill unused leading bytes with 0 */
|
||||
while (s < lsbyte+len)
|
||||
dest[--len] = 0;
|
||||
|
||||
if (len)
|
||||
lbnExtractLittleBytes_32((BNWORD32 *)bn->ptr, dest,
|
||||
lsbyte, len);
|
||||
MALLOCDB;
|
||||
}
|
||||
|
||||
int
|
||||
bnInsertLittleBytes_32(struct BigNum *bn, unsigned char const *src,
|
||||
unsigned lsbyte, unsigned len)
|
||||
{
|
||||
unsigned s = bn->size;
|
||||
unsigned words = (len+lsbyte+sizeof(BNWORD32)-1) / sizeof(BNWORD32);
|
||||
|
||||
/* Pad with zeros as required */
|
||||
bnSizeCheck(bn, words);
|
||||
|
||||
if (s < words) {
|
||||
lbnZero_32((BNWORD32 *)bn->ptr BIGLITTLE(-s,+s), words-s);
|
||||
s = words;
|
||||
}
|
||||
|
||||
lbnInsertLittleBytes_32((BNWORD32 *)bn->ptr, src, lsbyte, len);
|
||||
|
||||
bn->size = lbnNorm_32((BNWORD32 *)bn->ptr, s);
|
||||
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Return the least-significant word of the input. */
|
||||
unsigned
|
||||
bnLSWord_32(struct BigNum const *src)
|
||||
{
|
||||
return src->size ? (unsigned)((BNWORD32 *)src->ptr)[BIGLITTLE(-1,0)]: 0;
|
||||
}
|
||||
|
||||
unsigned
|
||||
bnBits_32(struct BigNum const *src)
|
||||
{
|
||||
return lbnBits_32((BNWORD32 *)src->ptr, src->size);
|
||||
}
|
||||
|
||||
int
|
||||
bnAdd_32(struct BigNum *dest, struct BigNum const *src)
|
||||
{
|
||||
unsigned s = src->size, d = dest->size;
|
||||
BNWORD32 t;
|
||||
|
||||
if (!s)
|
||||
return 0;
|
||||
|
||||
bnSizeCheck(dest, s);
|
||||
|
||||
if (d < s) {
|
||||
lbnZero_32((BNWORD32 *)dest->ptr BIGLITTLE(-d,+d), s-d);
|
||||
dest->size = d = s;
|
||||
MALLOCDB;
|
||||
}
|
||||
t = lbnAddN_32((BNWORD32 *)dest->ptr, (BNWORD32 *)src->ptr, s);
|
||||
MALLOCDB;
|
||||
if (t) {
|
||||
if (d > s) {
|
||||
t = lbnAdd1_32((BNWORD32 *)dest->ptr BIGLITTLE(-s,+s),
|
||||
d-s, t);
|
||||
MALLOCDB;
|
||||
}
|
||||
if (t) {
|
||||
bnSizeCheck(dest, d+1);
|
||||
((BNWORD32 *)dest->ptr)[BIGLITTLE(-1-d,d)] = t;
|
||||
dest->size = d+1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* dest -= src.
|
||||
* If dest goes negative, this produces the absolute value of
|
||||
* the difference (the negative of the true value) and returns 1.
|
||||
* Otherwise, it returls 0.
|
||||
*/
|
||||
int
|
||||
bnSub_32(struct BigNum *dest, struct BigNum const *src)
|
||||
{
|
||||
unsigned s = src->size, d = dest->size;
|
||||
BNWORD32 t;
|
||||
|
||||
if (d < s && d < (s = lbnNorm_32((BNWORD32 *)src->ptr, s))) {
|
||||
bnSizeCheck(dest, s);
|
||||
lbnZero_32((BNWORD32 *)dest->ptr BIGLITTLE(-d,+d), s-d);
|
||||
dest->size = d = s;
|
||||
MALLOCDB;
|
||||
}
|
||||
if (!s)
|
||||
return 0;
|
||||
t = lbnSubN_32((BNWORD32 *)dest->ptr, (BNWORD32 *)src->ptr, s);
|
||||
MALLOCDB;
|
||||
if (t) {
|
||||
if (d > s) {
|
||||
t = lbnSub1_32((BNWORD32 *)dest->ptr BIGLITTLE(-s,+s),
|
||||
d-s, t);
|
||||
MALLOCDB;
|
||||
}
|
||||
if (t) {
|
||||
lbnNeg_32((BNWORD32 *)dest->ptr, d);
|
||||
dest->size = lbnNorm_32((BNWORD32 *)dest->ptr,
|
||||
dest->size);
|
||||
MALLOCDB;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
dest->size = lbnNorm_32((BNWORD32 *)dest->ptr, dest->size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compare the BigNum to the given value, which must be < 65536.
|
||||
* Returns -1. 0 or 1 if a<b, a == b or a>b.
|
||||
* a <=> b --> bnCmpQ(a,b) <=> 0
|
||||
*/
|
||||
int
|
||||
bnCmpQ_32(struct BigNum const *a, unsigned b)
|
||||
{
|
||||
unsigned t;
|
||||
BNWORD32 v;
|
||||
|
||||
t = lbnNorm_32((BNWORD32 *)a->ptr, a->size);
|
||||
/* If a is more than one word long or zero, it's easy... */
|
||||
if (t != 1)
|
||||
return (t > 1) ? 1 : (b ? -1 : 0);
|
||||
v = (unsigned)((BNWORD32 *)a->ptr)[BIGLITTLE(-1,0)];
|
||||
return (v > b) ? 1 : ((v < b) ? -1 : 0);
|
||||
}
|
||||
|
||||
int
|
||||
bnSetQ_32(struct BigNum *dest, unsigned src)
|
||||
{
|
||||
if (src) {
|
||||
bnSizeCheck(dest, 1);
|
||||
|
||||
((BNWORD32 *)dest->ptr)[BIGLITTLE(-1,0)] = (BNWORD32)src;
|
||||
dest->size = 1;
|
||||
} else {
|
||||
dest->size = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnAddQ_32(struct BigNum *dest, unsigned src)
|
||||
{
|
||||
BNWORD32 t;
|
||||
|
||||
if (!dest->size)
|
||||
return bnSetQ(dest, src);
|
||||
|
||||
t = lbnAdd1_32((BNWORD32 *)dest->ptr, dest->size, (BNWORD32)src);
|
||||
MALLOCDB;
|
||||
if (t) {
|
||||
src = dest->size;
|
||||
bnSizeCheck(dest, src+1);
|
||||
((BNWORD32 *)dest->ptr)[BIGLITTLE(-1-src,src)] = t;
|
||||
dest->size = src+1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return value as for bnSub: 1 if subtract underflowed, in which
|
||||
* case the return is the negative of the computed value.
|
||||
*/
|
||||
int
|
||||
bnSubQ_32(struct BigNum *dest, unsigned src)
|
||||
{
|
||||
BNWORD32 t;
|
||||
|
||||
if (!dest->size)
|
||||
return bnSetQ(dest, src) < 0 ? -1 : (src != 0);
|
||||
|
||||
t = lbnSub1_32((BNWORD32 *)dest->ptr, dest->size, src);
|
||||
MALLOCDB;
|
||||
if (t) {
|
||||
/* Underflow. <= 1 word, so do it simply. */
|
||||
lbnNeg_32((BNWORD32 *)dest->ptr, 1);
|
||||
dest->size = 1;
|
||||
return 1;
|
||||
}
|
||||
/* Try to normalize? Needing this is going to be very rare. */
|
||||
/* dest->size = lbnNorm_32((BNWORD32 *)dest->ptr, dest->size); */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compare two BigNums. Returns -1. 0 or 1 if a<b, a == b or a>b.
|
||||
* a <=> b --> bnCmp(a,b) <=> 0
|
||||
*/
|
||||
int
|
||||
bnCmp_32(struct BigNum const *a, struct BigNum const *b)
|
||||
{
|
||||
unsigned s, t;
|
||||
|
||||
s = lbnNorm_32((BNWORD32 *)a->ptr, a->size);
|
||||
t = lbnNorm_32((BNWORD32 *)b->ptr, b->size);
|
||||
|
||||
if (s != t)
|
||||
return s > t ? 1 : -1;
|
||||
return lbnCmp_32((BNWORD32 *)a->ptr, (BNWORD32 *)b->ptr, s);
|
||||
}
|
||||
|
||||
int
|
||||
bnSquare_32(struct BigNum *dest, struct BigNum const *src)
|
||||
{
|
||||
unsigned s;
|
||||
BNWORD32 *srcbuf;
|
||||
|
||||
s = lbnNorm_32((BNWORD32 *)src->ptr, src->size);
|
||||
if (!s) {
|
||||
dest->size = 0;
|
||||
return 0;
|
||||
}
|
||||
bnSizeCheck(dest, 2*s);
|
||||
|
||||
if (src == dest) {
|
||||
LBNALLOC(srcbuf, s);
|
||||
if (!srcbuf)
|
||||
return -1;
|
||||
lbnCopy_32(srcbuf, (BNWORD32 *)src->ptr, s);
|
||||
lbnSquare_32((BNWORD32 *)dest->ptr, (BNWORD32 *)srcbuf, s);
|
||||
LBNFREE(srcbuf, s);
|
||||
} else {
|
||||
lbnSquare_32((BNWORD32 *)dest->ptr, (BNWORD32 *)src->ptr, s);
|
||||
}
|
||||
|
||||
dest->size = lbnNorm_32((BNWORD32 *)dest->ptr, 2*s);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnMul_32(struct BigNum *dest, struct BigNum const *a, struct BigNum const *b)
|
||||
{
|
||||
unsigned s, t;
|
||||
BNWORD32 *srcbuf;
|
||||
|
||||
s = lbnNorm_32((BNWORD32 *)a->ptr, a->size);
|
||||
t = lbnNorm_32((BNWORD32 *)b->ptr, b->size);
|
||||
|
||||
if (!s || !t) {
|
||||
dest->size = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (a == b)
|
||||
return bnSquare_32(dest, a);
|
||||
|
||||
bnSizeCheck(dest, s+t);
|
||||
|
||||
if (dest == a) {
|
||||
LBNALLOC(srcbuf, s);
|
||||
if (!srcbuf)
|
||||
return -1;
|
||||
lbnCopy_32(srcbuf, (BNWORD32 *)a->ptr, s);
|
||||
lbnMul_32((BNWORD32 *)dest->ptr, srcbuf, s,
|
||||
(BNWORD32 *)b->ptr, t);
|
||||
LBNFREE(srcbuf, s);
|
||||
} else if (dest == b) {
|
||||
LBNALLOC(srcbuf, t);
|
||||
if (!srcbuf)
|
||||
return -1;
|
||||
lbnCopy_32(srcbuf, (BNWORD32 *)b->ptr, t);
|
||||
lbnMul_32((BNWORD32 *)dest->ptr, (BNWORD32 *)a->ptr, s,
|
||||
srcbuf, t);
|
||||
LBNFREE(srcbuf, t);
|
||||
} else {
|
||||
lbnMul_32((BNWORD32 *)dest->ptr, (BNWORD32 *)a->ptr, s,
|
||||
(BNWORD32 *)b->ptr, t);
|
||||
}
|
||||
dest->size = lbnNorm_32((BNWORD32 *)dest->ptr, s+t);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnMulQ_32(struct BigNum *dest, struct BigNum const *a, unsigned b)
|
||||
{
|
||||
unsigned s;
|
||||
|
||||
s = lbnNorm_32((BNWORD32 *)a->ptr, a->size);
|
||||
if (!s || !b) {
|
||||
dest->size = 0;
|
||||
return 0;
|
||||
}
|
||||
if (b == 1)
|
||||
return bnCopy_32(dest, a);
|
||||
bnSizeCheck(dest, s+1);
|
||||
lbnMulN1_32((BNWORD32 *)dest->ptr, (BNWORD32 *)a->ptr, s, b);
|
||||
dest->size = lbnNorm_32((BNWORD32 *)dest->ptr, s+1);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnDivMod_32(struct BigNum *q, struct BigNum *r, struct BigNum const *n,
|
||||
struct BigNum const *d)
|
||||
{
|
||||
unsigned dsize, nsize;
|
||||
BNWORD32 qhigh;
|
||||
|
||||
dsize = lbnNorm_32((BNWORD32 *)d->ptr, d->size);
|
||||
nsize = lbnNorm_32((BNWORD32 *)n->ptr, n->size);
|
||||
|
||||
if (nsize < dsize) {
|
||||
q->size = 0; /* No quotient */
|
||||
r->size = nsize;
|
||||
return 0; /* Success */
|
||||
}
|
||||
|
||||
bnSizeCheck(q, nsize-dsize);
|
||||
|
||||
if (r != n) { /* You are allowed to reduce in place */
|
||||
bnSizeCheck(r, nsize);
|
||||
lbnCopy_32((BNWORD32 *)r->ptr, (BNWORD32 *)n->ptr, nsize);
|
||||
}
|
||||
|
||||
qhigh = lbnDiv_32((BNWORD32 *)q->ptr, (BNWORD32 *)r->ptr, nsize,
|
||||
(BNWORD32 *)d->ptr, dsize);
|
||||
nsize -= dsize;
|
||||
if (qhigh) {
|
||||
bnSizeCheck(q, nsize+1);
|
||||
*((BNWORD32 *)q->ptr BIGLITTLE(-nsize-1,+nsize)) = qhigh;
|
||||
q->size = nsize+1;
|
||||
} else {
|
||||
q->size = lbnNorm_32((BNWORD32 *)q->ptr, nsize);
|
||||
}
|
||||
r->size = lbnNorm_32((BNWORD32 *)r->ptr, dsize);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnMod_32(struct BigNum *dest, struct BigNum const *src, struct BigNum const *d)
|
||||
{
|
||||
unsigned dsize, nsize;
|
||||
|
||||
nsize = lbnNorm_32((BNWORD32 *)src->ptr, src->size);
|
||||
dsize = lbnNorm_32((BNWORD32 *)d->ptr, d->size);
|
||||
|
||||
|
||||
if (dest != src) {
|
||||
bnSizeCheck(dest, nsize);
|
||||
lbnCopy_32((BNWORD32 *)dest->ptr, (BNWORD32 *)src->ptr, nsize);
|
||||
}
|
||||
|
||||
if (nsize < dsize) {
|
||||
dest->size = nsize; /* No quotient */
|
||||
return 0;
|
||||
}
|
||||
|
||||
(void)lbnDiv_32((BNWORD32 *)dest->ptr BIGLITTLE(-dsize,+dsize),
|
||||
(BNWORD32 *)dest->ptr, nsize,
|
||||
(BNWORD32 *)d->ptr, dsize);
|
||||
dest->size = lbnNorm_32((BNWORD32 *)dest->ptr, dsize);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned
|
||||
bnModQ_32(struct BigNum const *src, unsigned d)
|
||||
{
|
||||
unsigned s;
|
||||
|
||||
s = lbnNorm_32((BNWORD32 *)src->ptr, src->size);
|
||||
if (!s)
|
||||
return 0;
|
||||
|
||||
return lbnModQ_32((BNWORD32 *)src->ptr, s, d);
|
||||
}
|
||||
|
||||
int
|
||||
bnExpMod_32(struct BigNum *dest, struct BigNum const *n,
|
||||
struct BigNum const *exp, struct BigNum const *mod)
|
||||
{
|
||||
unsigned nsize, esize, msize;
|
||||
|
||||
nsize = lbnNorm_32((BNWORD32 *)n->ptr, n->size);
|
||||
esize = lbnNorm_32((BNWORD32 *)exp->ptr, exp->size);
|
||||
msize = lbnNorm_32((BNWORD32 *)mod->ptr, mod->size);
|
||||
|
||||
if (!msize || (((BNWORD32 *)mod->ptr)[BIGLITTLE(-1,0)] & 1) == 0)
|
||||
return -1; /* Illegal modulus! */
|
||||
|
||||
bnSizeCheck(dest, msize);
|
||||
|
||||
/* Special-case base of 2 */
|
||||
if (nsize == 1 && ((BNWORD32 *)n->ptr)[BIGLITTLE(-1,0)] == 2) {
|
||||
if (lbnTwoExpMod_32((BNWORD32 *)dest->ptr,
|
||||
(BNWORD32 *)exp->ptr, esize,
|
||||
(BNWORD32 *)mod->ptr, msize) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
if (lbnExpMod_32((BNWORD32 *)dest->ptr,
|
||||
(BNWORD32 *)n->ptr, nsize,
|
||||
(BNWORD32 *)exp->ptr, esize,
|
||||
(BNWORD32 *)mod->ptr, msize) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
dest->size = lbnNorm_32((BNWORD32 *)dest->ptr, msize);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnDoubleExpMod_32(struct BigNum *dest,
|
||||
struct BigNum const *n1, struct BigNum const *e1,
|
||||
struct BigNum const *n2, struct BigNum const *e2,
|
||||
struct BigNum const *mod)
|
||||
{
|
||||
unsigned n1size, e1size, n2size, e2size, msize;
|
||||
|
||||
n1size = lbnNorm_32((BNWORD32 *)n1->ptr, n1->size);
|
||||
e1size = lbnNorm_32((BNWORD32 *)e1->ptr, e1->size);
|
||||
n2size = lbnNorm_32((BNWORD32 *)n2->ptr, n2->size);
|
||||
e2size = lbnNorm_32((BNWORD32 *)e2->ptr, e2->size);
|
||||
msize = lbnNorm_32((BNWORD32 *)mod->ptr, mod->size);
|
||||
|
||||
if (!msize || (((BNWORD32 *)mod->ptr)[BIGLITTLE(-1,0)] & 1) == 0)
|
||||
return -1; /* Illegal modulus! */
|
||||
|
||||
bnSizeCheck(dest, msize);
|
||||
|
||||
if (lbnDoubleExpMod_32((BNWORD32 *)dest->ptr,
|
||||
(BNWORD32 *)n1->ptr, n1size, (BNWORD32 *)e1->ptr, e1size,
|
||||
(BNWORD32 *)n2->ptr, n2size, (BNWORD32 *)e2->ptr, e2size,
|
||||
(BNWORD32 *)mod->ptr, msize) < 0)
|
||||
return -1;
|
||||
|
||||
dest->size = lbnNorm_32((BNWORD32 *)dest->ptr, msize);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnTwoExpMod_32(struct BigNum *n, struct BigNum const *exp,
|
||||
struct BigNum const *mod)
|
||||
{
|
||||
unsigned esize, msize;
|
||||
|
||||
esize = lbnNorm_32((BNWORD32 *)exp->ptr, exp->size);
|
||||
msize = lbnNorm_32((BNWORD32 *)mod->ptr, mod->size);
|
||||
|
||||
if (!msize || (((BNWORD32 *)mod->ptr)[BIGLITTLE(-1,0)] & 1) == 0)
|
||||
return -1; /* Illegal modulus! */
|
||||
|
||||
bnSizeCheck(n, msize);
|
||||
|
||||
if (lbnTwoExpMod_32((BNWORD32 *)n->ptr, (BNWORD32 *)exp->ptr, esize,
|
||||
(BNWORD32 *)mod->ptr, msize) < 0)
|
||||
return -1;
|
||||
|
||||
n->size = lbnNorm_32((BNWORD32 *)n->ptr, msize);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnGcd_32(struct BigNum *dest, struct BigNum const *a, struct BigNum const *b)
|
||||
{
|
||||
BNWORD32 *tmp;
|
||||
unsigned asize, bsize;
|
||||
int i;
|
||||
|
||||
/* Kind of silly, but we might as well permit it... */
|
||||
if (a == b)
|
||||
return dest == a ? 0 : bnCopy(dest, a);
|
||||
|
||||
/* Ensure a is not the same as "dest" */
|
||||
if (a == dest) {
|
||||
a = b;
|
||||
b = dest;
|
||||
}
|
||||
|
||||
asize = lbnNorm_32((BNWORD32 *)a->ptr, a->size);
|
||||
bsize = lbnNorm_32((BNWORD32 *)b->ptr, b->size);
|
||||
|
||||
bnSizeCheck(dest, bsize+1);
|
||||
|
||||
/* Copy a to tmp */
|
||||
LBNALLOC(tmp, asize+1);
|
||||
if (!tmp)
|
||||
return -1;
|
||||
lbnCopy_32(tmp, (BNWORD32 *)a->ptr, asize);
|
||||
|
||||
/* Copy b to dest,if necessary */
|
||||
if (dest != b)
|
||||
lbnCopy_32((BNWORD32 *)dest->ptr,
|
||||
(BNWORD32 *)b->ptr, bsize);
|
||||
if (bsize > asize || (bsize == asize &&
|
||||
lbnCmp_32((BNWORD32 *)b->ptr, (BNWORD32 *)a->ptr, asize) > 0))
|
||||
{
|
||||
i = lbnGcd_32((BNWORD32 *)dest->ptr, bsize, tmp, asize);
|
||||
if (i >= 0) {
|
||||
dest->size = (unsigned)i;
|
||||
} else {
|
||||
lbnCopy_32((BNWORD32 *)dest->ptr, tmp,
|
||||
(unsigned)-i);
|
||||
dest->size = (unsigned)-i;
|
||||
}
|
||||
} else {
|
||||
i = lbnGcd_32(tmp, asize, (BNWORD32 *)dest->ptr, bsize);
|
||||
if (i <= 0) {
|
||||
dest->size = (unsigned)-i;
|
||||
} else {
|
||||
lbnCopy_32((BNWORD32 *)dest->ptr, tmp,
|
||||
(unsigned)i);
|
||||
dest->size = (unsigned)i;
|
||||
}
|
||||
}
|
||||
LBNFREE(tmp, asize+1);
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bnInv_32(struct BigNum *dest, struct BigNum const *src,
|
||||
struct BigNum const *mod)
|
||||
{
|
||||
unsigned s, m;
|
||||
int i;
|
||||
|
||||
s = lbnNorm_32((BNWORD32 *)src->ptr, src->size);
|
||||
m = lbnNorm_32((BNWORD32 *)mod->ptr, mod->size);
|
||||
|
||||
/* lbnInv_32 requires that the input be less than the modulus */
|
||||
if (m < s ||
|
||||
(m==s && lbnCmp_32((BNWORD32 *)src->ptr, (BNWORD32 *)mod->ptr, s)))
|
||||
{
|
||||
bnSizeCheck(dest, s + (m==s));
|
||||
if (dest != src)
|
||||
lbnCopy_32((BNWORD32 *)dest->ptr,
|
||||
(BNWORD32 *)src->ptr, s);
|
||||
/* Pre-reduce modulo the modulus */
|
||||
(void)lbnDiv_32((BNWORD32 *)dest->ptr BIGLITTLE(-m,+m),
|
||||
(BNWORD32 *)dest->ptr, s,
|
||||
(BNWORD32 *)mod->ptr, m);
|
||||
s = lbnNorm_32((BNWORD32 *)dest->ptr, m);
|
||||
MALLOCDB;
|
||||
} else {
|
||||
bnSizeCheck(dest, m+1);
|
||||
if (dest != src)
|
||||
lbnCopy_32((BNWORD32 *)dest->ptr,
|
||||
(BNWORD32 *)src->ptr, s);
|
||||
}
|
||||
|
||||
i = lbnInv_32((BNWORD32 *)dest->ptr, s, (BNWORD32 *)mod->ptr, m);
|
||||
if (i == 0)
|
||||
dest->size = lbnNorm_32((BNWORD32 *)dest->ptr, m);
|
||||
|
||||
MALLOCDB;
|
||||
return i;
|
||||
}
|
||||
|
||||
/*
|
||||
* Shift a bignum left the appropriate number of bits,
|
||||
* multiplying by 2^amt.
|
||||
*/
|
||||
int
|
||||
bnLShift_32(struct BigNum *dest, unsigned amt)
|
||||
{
|
||||
unsigned s = dest->size;
|
||||
BNWORD32 carry;
|
||||
|
||||
if (amt % 32) {
|
||||
carry = lbnLshift_32(dest->ptr, s, amt % 32);
|
||||
if (carry) {
|
||||
s++;
|
||||
bnSizeCheck(dest, s);
|
||||
((BNWORD32 *)dest->ptr)[BIGLITTLE(-s,s-1)] = carry;
|
||||
}
|
||||
}
|
||||
|
||||
amt /= 32;
|
||||
if (amt) {
|
||||
bnSizeCheck(dest, s+amt);
|
||||
memmove((BNWORD32 *)dest->ptr BIGLITTLE(-s-amt, +amt),
|
||||
(BNWORD32 *)dest->ptr BIG(-s),
|
||||
s * sizeof(BNWORD32));
|
||||
lbnZero_32((BNWORD32 *)dest->ptr, amt);
|
||||
s += amt;
|
||||
}
|
||||
dest->size = s;
|
||||
MALLOCDB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Shift a bignum right the appropriate number of bits,
|
||||
* dividing by 2^amt.
|
||||
*/
|
||||
void bnRShift_32(struct BigNum *dest, unsigned amt)
|
||||
{
|
||||
unsigned s = dest->size;
|
||||
|
||||
if (amt >= 32) {
|
||||
memmove(
|
||||
(BNWORD32 *)dest->ptr BIG(-s+amt/32),
|
||||
(BNWORD32 *)dest->ptr BIGLITTLE(-s, +amt/32),
|
||||
s-amt/32 * sizeof(BNWORD32));
|
||||
s -= amt/32;
|
||||
amt %= 32;
|
||||
}
|
||||
|
||||
if (amt)
|
||||
(void)lbnRshift_32(dest->ptr, s, amt);
|
||||
|
||||
dest->size = lbnNorm_32(dest->ptr, s);
|
||||
MALLOCDB;
|
||||
}
|
||||
|
||||
/*
|
||||
* Shift a bignum right until it is odd, and return the number of
|
||||
* bits shifted. n = d * 2^s. Replaces n with d and returns s.
|
||||
* Returns 0 when given 0. (Another valid answer is infinity.)
|
||||
*/
|
||||
unsigned
|
||||
bnMakeOdd_32(struct BigNum *n)
|
||||
{
|
||||
unsigned size;
|
||||
unsigned s; /* shift amount */
|
||||
BNWORD32 *p;
|
||||
BNWORD32 t;
|
||||
|
||||
p = (BNWORD32 *)n->ptr;
|
||||
size = lbnNorm_32(p, n->size);
|
||||
if (!size)
|
||||
return 0;
|
||||
|
||||
t = BIGLITTLE(p[-1],p[0]);
|
||||
s = 0;
|
||||
|
||||
/* See how many words we have to shift */
|
||||
if (!t) {
|
||||
/* Shift by words */
|
||||
do {
|
||||
|
||||
s++;
|
||||
BIGLITTLE(--p,p++);
|
||||
} while ((t = BIGLITTLE(p[-1],p[0])) == 0);
|
||||
size -= s;
|
||||
s *= 32;
|
||||
memmove((BNWORD32 *)n->ptr BIG(-size), p BIG(-size),
|
||||
size * sizeof(BNWORD32));
|
||||
p = (BNWORD32 *)n->ptr;
|
||||
MALLOCDB;
|
||||
}
|
||||
|
||||
assert(t);
|
||||
|
||||
/* Now count the bits */
|
||||
while ((t & 1) == 0) {
|
||||
t >>= 1;
|
||||
s++;
|
||||
}
|
||||
|
||||
/* Shift the bits */
|
||||
if (s & (32-1)) {
|
||||
lbnRshift_32(p, size, s & (32-1));
|
||||
/* Renormalize */
|
||||
if (BIGLITTLE(*(p-size),*(p+(size-1))) == 0)
|
||||
--size;
|
||||
}
|
||||
n->size = size;
|
||||
|
||||
MALLOCDB;
|
||||
return s;
|
||||
}
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bn32.h - interface to 32-bit bignum routines.
|
||||
*/
|
||||
struct BigNum;
|
||||
|
||||
void bnInit_32(void);
|
||||
void bnEnd_32(struct BigNum *bn);
|
||||
int bnPrealloc_32(struct BigNum *bn, unsigned bits);
|
||||
int bnCopy_32(struct BigNum *dest, struct BigNum const *src);
|
||||
int bnSwap_32(struct BigNum *a, struct BigNum *b);
|
||||
void bnNorm_32(struct BigNum *bn);
|
||||
void bnExtractBigBytes_32(struct BigNum const *bn, unsigned char *dest,
|
||||
unsigned lsbyte, unsigned dlen);
|
||||
int bnInsertBigBytes_32(struct BigNum *bn, unsigned char const *src,
|
||||
unsigned lsbyte, unsigned len);
|
||||
void bnExtractLittleBytes_32(struct BigNum const *bn, unsigned char *dest,
|
||||
unsigned lsbyte, unsigned dlen);
|
||||
int bnInsertLittleBytes_32(struct BigNum *bn, unsigned char const *src,
|
||||
unsigned lsbyte, unsigned len);
|
||||
unsigned bnLSWord_32(struct BigNum const *src);
|
||||
unsigned bnBits_32(struct BigNum const *src);
|
||||
int bnAdd_32(struct BigNum *dest, struct BigNum const *src);
|
||||
int bnSub_32(struct BigNum *dest, struct BigNum const *src);
|
||||
int bnCmpQ_32(struct BigNum const *a, unsigned b);
|
||||
int bnSetQ_32(struct BigNum *dest, unsigned src);
|
||||
int bnAddQ_32(struct BigNum *dest, unsigned src);
|
||||
int bnSubQ_32(struct BigNum *dest, unsigned src);
|
||||
int bnCmp_32(struct BigNum const *a, struct BigNum const *b);
|
||||
int bnSquare_32(struct BigNum *dest, struct BigNum const *src);
|
||||
int bnMul_32(struct BigNum *dest, struct BigNum const *a,
|
||||
struct BigNum const *b);
|
||||
int bnMulQ_32(struct BigNum *dest, struct BigNum const *a, unsigned b);
|
||||
int bnDivMod_32(struct BigNum *q, struct BigNum *r, struct BigNum const *n,
|
||||
struct BigNum const *d);
|
||||
int bnMod_32(struct BigNum *dest, struct BigNum const *src,
|
||||
struct BigNum const *d);
|
||||
unsigned bnModQ_32(struct BigNum const *src, unsigned d);
|
||||
int bnExpMod_32(struct BigNum *dest, struct BigNum const *n,
|
||||
struct BigNum const *exp, struct BigNum const *mod);
|
||||
int bnDoubleExpMod_32(struct BigNum *dest,
|
||||
struct BigNum const *n1, struct BigNum const *e1,
|
||||
struct BigNum const *n2, struct BigNum const *e2,
|
||||
struct BigNum const *mod);
|
||||
int bnTwoExpMod_32(struct BigNum *n, struct BigNum const *exp,
|
||||
struct BigNum const *mod);
|
||||
int bnGcd_32(struct BigNum *dest, struct BigNum const *a,
|
||||
struct BigNum const *b);
|
||||
int bnInv_32(struct BigNum *dest, struct BigNum const *src,
|
||||
struct BigNum const *mod);
|
||||
int bnLShift_32(struct BigNum *dest, unsigned amt);
|
||||
void bnRShift_32(struct BigNum *dest, unsigned amt);
|
||||
unsigned bnMakeOdd_32(struct BigNum *n);
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bn68000.c - bnInit() for Motorola 680x0 family, 16 or 32-bit.
|
||||
*
|
||||
* Written in 1995 by Colin Plumb.
|
||||
*/
|
||||
|
||||
#include "lbn.h"
|
||||
#include "bn16.h"
|
||||
#include "bn32.h"
|
||||
|
||||
#ifndef BNINCLUDE
|
||||
#error You must define BNINCLUDE to lbn68000.h to use assembly primitives.
|
||||
#endif
|
||||
|
||||
void
|
||||
bnInit(void)
|
||||
{
|
||||
if (is68020())
|
||||
bnInit_32();
|
||||
else
|
||||
bnInit_16();
|
||||
}
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bn8086.c - bnInit() for Intel x86 family in 16-bit mode.
|
||||
*
|
||||
* Written in 1995 by Colin Plumb.
|
||||
*/
|
||||
|
||||
#include "lbn.h"
|
||||
#include "bn16.h"
|
||||
#include "bn32.h"
|
||||
|
||||
#ifndef BNINCLUDE
|
||||
#error You must define BNINCLUDE to lbn8086.h to use assembly primitives.
|
||||
#endif
|
||||
|
||||
void
|
||||
bnInit(void)
|
||||
{
|
||||
/* if (not386())
|
||||
bnInit_16();
|
||||
else */
|
||||
bnInit_32();
|
||||
}
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bninit16.c - Provide an init function that sets things up for 16-bit
|
||||
* operation. This is a seaparate tiny file so you can compile two bn
|
||||
* packages into the library and write a custom init routine.
|
||||
*
|
||||
* Written in 1995 by Colin Plumb.
|
||||
*/
|
||||
|
||||
#include "bn.h"
|
||||
#include "bn16.h"
|
||||
|
||||
void
|
||||
bnInit(void)
|
||||
{
|
||||
bnInit_16();
|
||||
}
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bninit32.c - Provide an init function that sets things up for 32-bit
|
||||
* operation. This is a seaparate tiny file so you can compile two bn
|
||||
* packages into the library and write a custom init routine.
|
||||
*
|
||||
* Written in 1995 by Colin Plumb.
|
||||
*/
|
||||
|
||||
#include "bn.h"
|
||||
#include "bn32.h"
|
||||
|
||||
void
|
||||
bnInit(void)
|
||||
{
|
||||
bnInit_32();
|
||||
}
|
||||
|
|
@ -1,75 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bnsize00.h - pick the correct machine word size to use.
|
||||
*
|
||||
* Copyright (c) 1995 Colin Plumb. All rights reserved.
|
||||
* For licensing and other legal details, see the file legal.c.
|
||||
*/
|
||||
#include "lbn.h" /* Get basic information */
|
||||
|
||||
#if !BNSIZE64 && !BNSIZE32 && !BNSIZE16 && defined(BNWORD64)
|
||||
# if defined(BNWORD128) || (defined(lbnMulAdd1_64) && defined(lbnMulSub1_64))
|
||||
# define BNSIZE64 1
|
||||
# elif defined(mul64_ppmm) || defined(mul64_ppmma) || defined(mul64_ppmmaa)
|
||||
# define BNSIZE64 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !BNSIZE64 && !BNSIZE32 && !BNSIZE16 && defined(BNWORD32)
|
||||
# if defined(BNWORD64) || (defined(lbnMulAdd1_32) && defined(lbnMulSub1_32))
|
||||
# define BNSIZE32 1
|
||||
# elif defined(mul32_ppmm) || defined(mul32_ppmma) || defined(mul32_ppmmaa)
|
||||
# define BNSIZE32 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !BNSIZE64 && !BNSIZE32 && !BNSIZE16 && defined(BNWORD16)
|
||||
# if defined(BNWORD32) || (defined(lbnMulAdd1_16) && defined(lbnMulSub1_16))
|
||||
# define BNSIZE16 1
|
||||
# elif defined(mul16_ppmm) || defined(mul16_ppmma) || defined(mul16_ppmmaa)
|
||||
# define BNSIZE16 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !BNSIZE64 && !BNSIZE32 && !BNSIZE16
|
||||
#error Unable to find a viable word size to compile bignum library.
|
||||
#endif
|
||||
|
|
@ -1,133 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* FILENAME: c_asm.h PRODUCT NAME: CRYPTOGRAPHIC TOOLKIT
|
||||
*
|
||||
* FILE STATUS:
|
||||
*
|
||||
* DESCRIPTION: C / ASM Header File
|
||||
*
|
||||
* USAGE: File should be included to use Toolkit Functions
|
||||
*
|
||||
*
|
||||
* Copyright (c) Cylink Corporation 1994. All rights reserved.
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 14 Oct 94 GKL For Second version (big endian support)
|
||||
* 26 Oct 94 GKL (alignment for big endian support )
|
||||
*
|
||||
****************************************************************************/
|
||||
#if !defined( C_ASM_H )
|
||||
#define C_ASM_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#include "cylink.h"
|
||||
#include "ctk_endian.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
int Sum_big (ord *X,
|
||||
ord *Y,
|
||||
ord *Z,
|
||||
int len_X );
|
||||
int Sum (ord *X, ord *Y, ushort len_X );
|
||||
int Sub_big (ord *X,
|
||||
ord *Y,
|
||||
ord *Z,
|
||||
int len_X );
|
||||
/*
|
||||
void Mul_big( ord *X, ord *Y,ord *XY,
|
||||
ushort lx, ushort ly,
|
||||
ushort elements_in_X,
|
||||
ushort elements_in_Y);*/
|
||||
void Mul_big( ord *X, ord *Y,ord *XY,
|
||||
ushort lx, ushort ly);
|
||||
|
||||
void PReLo_big( ord *X, ord *P,
|
||||
ushort len_X, ushort el);
|
||||
|
||||
void Div_big( ord *X, ord *P,
|
||||
ushort len_X, ushort el,
|
||||
ord *div);
|
||||
|
||||
int LeftMostBit_big ( ord X );
|
||||
int LeftMostEl_big( ord *X, ushort len_X );
|
||||
void RShiftL_big( ord *X, u_int32_t len_X, u_int32_t n_bit );
|
||||
void LShiftL_big( ord *X, u_int32_t len_X, u_int32_t n_bit );
|
||||
int RShiftMostBit(ord *a, u_int32_t len);
|
||||
void ByteLong(uchar *X, u_int32_t X_bytes, u_int32_t *Y);
|
||||
void ByteOrd(uchar *X, u_int32_t X_bytes, ord *Y);
|
||||
void OrdByte(ord *X, u_int32_t X_bytes, uchar *Y);
|
||||
void LongByte(u_int32_t *X, u_int32_t X_bytes, uchar *Y);
|
||||
int BitValue_big( ord *X, ushort n_bits );
|
||||
int BitsValue_big( ord *X, ushort n_bits, ushort bit_count );
|
||||
void ByteSwap32_big( uchar *X, ushort X_len );
|
||||
void Complement_big( ord *X, ushort X_longs);
|
||||
void Diagonal_big (ord *X, ushort X_len, ord *X2);
|
||||
void Square_big( ord *X, ushort X_len, ord *X2);
|
||||
void Mul_big_1( ord X, ord *Y, ord *XY, ushort ly );
|
||||
int Sum_Q(ord *X, ushort src, ushort len_X );
|
||||
|
||||
|
||||
|
||||
/* In-place DES encryption */
|
||||
void DES_encrypt(uchar *keybuf, uchar *block);
|
||||
|
||||
/* In-place DES decryption */
|
||||
void DES_decrypt(uchar *keybuf, uchar *block);
|
||||
|
||||
/* In-place KAPPA encryption */
|
||||
void KAPPA_encrypt(uchar *a, uchar *k, ushort r);
|
||||
|
||||
/* In-place KAPPA decryption */
|
||||
void KAPPA_decrypt(uchar *a, uchar *k, ushort r);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /*C_ASM_H*/
|
||||
|
||||
|
|
@ -1,255 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* FILENAME: cencrint.h PRODUCT NAME: CRYPTOGRAPHIC TOOLKIT
|
||||
*
|
||||
* FILE STATUS:
|
||||
*
|
||||
* DESCRIPTION: Cryptographic Toolkit Internal Functions Header File
|
||||
*
|
||||
* USAGE: File should be included to use Toolkit Functions
|
||||
*
|
||||
*
|
||||
* Copyright (c) Cylink Corporation 1994. All rights reserved.
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 23 Aug 94 KPZ Initial release
|
||||
* 24 Sep 94 KPZ Added prototypes of internal functions
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
* 08 Dec 94 GKL Added YIELD_context to Expo, VerPrime and GenPrime
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CENCRINT_H /* Prevent multiple inclusions of same header file */
|
||||
#define CENCRINT_H
|
||||
|
||||
/****************************************************************************
|
||||
* INCLUDE FILES
|
||||
****************************************************************************/
|
||||
|
||||
/* system files */
|
||||
#include <sys/types.h>
|
||||
#include "cylink.h"
|
||||
#include "ctk_endian.h"
|
||||
#include "toolkit.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Compute a modulo */
|
||||
int PartReduct( u_int16_t X_bytes, ord *X,
|
||||
u_int16_t P_bytes, ord *P,
|
||||
ord *Z );
|
||||
|
||||
/* Compute a modulo product */
|
||||
int Mul( u_int16_t X_bytes, ord *X,
|
||||
u_int16_t Y_bytes, ord *Y,
|
||||
u_int16_t P_bytes, ord *P,
|
||||
ord *Z );
|
||||
/*Compute a modulo squaring*/
|
||||
int Mul_Squr( u_int16_t X_bytes, ord *X,
|
||||
u_int16_t P_bytes, ord *P,
|
||||
ord *Z );
|
||||
int Square( u_int16_t X_bytes,
|
||||
ord *X,
|
||||
u_int16_t P_bytes,
|
||||
ord *P,
|
||||
ord *Z );
|
||||
|
||||
/*Compare two array*/
|
||||
int Comp_Mont ( ord *X, ord *P, u_int16_t P_longs );
|
||||
/*Compute invers element*/
|
||||
ord Inv_Mont ( ord x );
|
||||
/*Modulo by the Mongomery*/
|
||||
void PartReduct_Mont( ord *X, u_int16_t P_bytes, ord *P, ord inv );
|
||||
/*Computes squaring by the Mongomery modulo*/
|
||||
int Mul_Squr_Mont(ord *X, u_int16_t P_bytes,
|
||||
ord *P, ord *Z,
|
||||
ord inv );
|
||||
/*Computes multiply by the montgomery modulo*/
|
||||
int Mul_Mont( ord *X, ord *Y,
|
||||
u_int16_t P_bytes, ord *P,
|
||||
ord *Z, ord inv );
|
||||
|
||||
/* Compute a modulo exponent */
|
||||
int Expo( u_int16_t X_bytes, ord *X,
|
||||
u_int16_t Y_bytes, ord *Y,
|
||||
u_int16_t P_bytes, ord *P,
|
||||
ord *Z );
|
||||
/*Compute double exponent */
|
||||
int DoubleExpo( u_int16_t X1_bytes,ord *X1,
|
||||
u_int16_t Y1_bytes,ord *Y1,
|
||||
u_int16_t X2_bytes,ord *X2,
|
||||
u_int16_t Y2_bytes,ord *Y2,
|
||||
u_int16_t P_bytes,ord *P,
|
||||
ord *Z);
|
||||
/* Compute a modulo inverse element */
|
||||
int Inverse( u_int16_t X_bytes, ord *X,
|
||||
u_int16_t P_bytes, ord *P,
|
||||
ord *Z );
|
||||
|
||||
/* Verify Pseudo Prime number */
|
||||
int VerPrime( u_int16_t P_bytes, ord *P,
|
||||
u_int16_t k, ord *RVAL,
|
||||
YIELD_context *yield_cont ); /*TKL00601*/
|
||||
|
||||
/* Generate Random Pseudo Prime number */
|
||||
int GenPrime( u_int16_t P_bytes, ord *P,
|
||||
u_int16_t k, ord *RVAL,
|
||||
YIELD_context *yield_cont ); /*TKL00601*/
|
||||
|
||||
/* Transfer bytes to u_int32_t */
|
||||
void ByteLong( uchar *X,
|
||||
u_int16_t X_bytes,
|
||||
u_int32_t *Y );
|
||||
|
||||
/* Transfer u_int32_t to bytes */
|
||||
void LongByte( u_int32_t *X,
|
||||
u_int16_t X_bytes,
|
||||
uchar *Y );
|
||||
|
||||
/* Transfer bytes to ord */
|
||||
void ByteOrd( uchar *X,
|
||||
u_int16_t X_bytes,
|
||||
ord *Y );
|
||||
|
||||
/* Transfer ord to bytes */
|
||||
void OrdByte( ord *X,
|
||||
u_int16_t X_bytes,
|
||||
uchar *Y );
|
||||
|
||||
/* Find the left most non zero bit */
|
||||
int LeftMostBit ( ord X );
|
||||
|
||||
/* Find the left most element */
|
||||
int LeftMostEl( ord *X,
|
||||
u_int16_t len_X );
|
||||
|
||||
/* Shift array to rigth by n_bit */
|
||||
void RShiftL( ord *X,
|
||||
u_int16_t len_X,
|
||||
u_int16_t n_bit );
|
||||
|
||||
/* Shifts array to left by n_bit */
|
||||
void LShiftL( ord *X,
|
||||
u_int16_t len_X,
|
||||
u_int16_t n_bit );
|
||||
|
||||
/* Find the value of bit */
|
||||
int BitValue( ord *X,
|
||||
u_int16_t n_bits );
|
||||
|
||||
/* Perform byte reversal on an array of ordinar type (longword or shortword) */
|
||||
void ByteSwap( uchar *X,
|
||||
u_int16_t X_len );
|
||||
|
||||
/* Perform byte reversal on an array from LSB to MSB */
|
||||
void BigSwap( uchar *X,
|
||||
u_int16_t X_len );
|
||||
|
||||
/* Perform byte reversal on an array of longword */
|
||||
void ByteSwap32( uchar *X,
|
||||
u_int16_t X_len );
|
||||
|
||||
/* Perform short reversal on an array of longword */
|
||||
void WordSwap( uchar *X,
|
||||
u_int16_t X_len );
|
||||
|
||||
/* Perform SHS transformation */
|
||||
void shaTransform( u_int32_t *state,
|
||||
const uchar *block );
|
||||
|
||||
/* Compute modulo addition
|
||||
int Add( ord *X,
|
||||
ord *Y,
|
||||
u_int16_t P_len,
|
||||
ord *P,
|
||||
ord *Z );
|
||||
*/
|
||||
int Add( ord *X,
|
||||
ord *Y,
|
||||
u_int16_t P_len,
|
||||
ord *P );
|
||||
/* Initialize Secure Hash Function for generate
|
||||
random number for DSS */
|
||||
void SHAInitK( SHA_context *hash_context );
|
||||
|
||||
/* Set parity bits */
|
||||
void SetKeyParity( uchar *key );
|
||||
|
||||
/* Find a least significant non zero bit
|
||||
and sfift array to right */
|
||||
int RShiftMostBit( ord *a, u_int16_t len );
|
||||
|
||||
/*Compute great common divisor */
|
||||
int SteinGCD( ord *m, ord *b, u_int16_t len );
|
||||
|
||||
/* Compute a modulo and divisor */
|
||||
int DivRem( u_int16_t X_bytes, ord *X,
|
||||
u_int16_t P_bytes, ord *P,
|
||||
ord *Z, ord *D );
|
||||
|
||||
/* Generate random number */
|
||||
int MyGenRand( u_int16_t A_bytes, ord *A,
|
||||
ord *RVAL);
|
||||
|
||||
/* Compute a Secure Hash Function */
|
||||
int MySHA( uchar *message,
|
||||
u_int16_t message_bytes,
|
||||
uchar *hash_result );
|
||||
|
||||
/* Finalize Secure Hash Function */
|
||||
int MySHAFinal( SHA_context *hash_context,
|
||||
uchar *hash_result );
|
||||
|
||||
void shaTransform_new( u_int32_t *state,
|
||||
uchar *block );
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* CENCRINT_H */
|
||||
|
||||
|
|
@ -1,212 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/**********************************************************************\
|
||||
* FILENAME: ctk_endian.h PRODUCT NAME:
|
||||
*
|
||||
* DESCRIPTION: header file of defines
|
||||
*
|
||||
* USAGE: Platform-dependend compilation modes header
|
||||
*
|
||||
*
|
||||
* Copyright (c) Cylink Corporation 1994. All rights reserved.
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
\**********************************************************************/
|
||||
|
||||
#ifndef CTK_ENDIAN_H /* Prevent multiple inclusions of same header file */
|
||||
#define CTK_ENDIAN_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <ctype.h>
|
||||
#include <arpa/nameser_compat.h>
|
||||
#include "lbn.h"
|
||||
|
||||
#if (defined(BIG_ENDIAN) || defined(_BIG_ENDIAN)) && !(defined(LITTLE_ENDIAN) || defined(_LITTLE_ENDIAN))
|
||||
# undef BIG_ENDIAN
|
||||
# undef _BIG_ENDIAN
|
||||
# define BIG_ENDIAN 4321
|
||||
# define LITTLE_ENDIAN 1234
|
||||
# define BYTE_ORDER BIG_ENDIAN
|
||||
|
||||
#elif !(defined(BIG_ENDIAN) || defined(_BIG_ENDIAN)) && (defined(LITTLE_ENDIAN) || defined(_LITTLE_ENDIAN))
|
||||
# undef LITTLE_ENDIAN
|
||||
# undef _LITTLE_ENDIAN
|
||||
# define BIG_ENDIAN 4321
|
||||
# define LITTLE_ENDIAN 1234
|
||||
# define BYTE_ORDER LITTLE_ENDIAN
|
||||
#endif
|
||||
|
||||
#if !defined(BYTE_ORDER) || \
|
||||
(BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN)
|
||||
/* you must determine what the correct bit order is for
|
||||
* your compiler - the next line is an intentional error
|
||||
* which will force your compiles to bomb until you fix
|
||||
* the above macros.
|
||||
*/
|
||||
# if !defined(CTK_LITTLE_ENDIAN) && !defined(CTK_BIG_ENDIAN)
|
||||
# error "Undefined or invalid BYTE_ORDER";
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined(CTK_BIG_ENDIAN) && !defined(CTK_LITTLE_ENDIAN)
|
||||
# ifdef BYTE_ORDER
|
||||
# if (BYTE_ORDER == LITTLE_ENDIAN)
|
||||
# define CTK_LITTLE_ENDIAN
|
||||
# elif (BYTE_ORDER == BIG_ENDIAN)
|
||||
# define CTK_BIG_ENDIAN
|
||||
# else
|
||||
# error CAN NOT determine ENDIAN with BYTE_ORDER
|
||||
# endif
|
||||
# elif defined(_LITTLE_ENDIAN)
|
||||
# define CTK_LITTLE_ENDIAN
|
||||
# elif defined(_BIG_ENDIAN)
|
||||
# define CTK_BIG_ENDIAN
|
||||
# else
|
||||
# error CAN NOT determine ENDIAN
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined(CTK_BIG_ENDIAN) && !defined(CTK_LITTLE_ENDIAN)
|
||||
# error NO CTK_???_ENDIAN defined
|
||||
#endif
|
||||
|
||||
#if defined( CTK_LITTLE_ENDIAN ) && defined( CTK_BIG_ENDIAN )
|
||||
# error Use only one define CPU type CTK_LITTLE or BIG ENDIAN.
|
||||
#endif
|
||||
|
||||
#if !defined( ORD_32 ) && !defined( ORD_16 )
|
||||
# ifdef BNSIZE64
|
||||
# error BNSIZE64 do not know how to do this
|
||||
# elif defined(BNSIZE32)
|
||||
# define ORD_32
|
||||
# elif defined(BNSIZE16)
|
||||
# define ORD_16
|
||||
# elif !defined( UINT_MAX) /* No <limits.h> */
|
||||
# define ORD_16 /* default */
|
||||
# else
|
||||
# if ULONG_MAX == 0xffffffff
|
||||
# define ORD_16
|
||||
# else
|
||||
# define ORD_32
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined( ORD_32 ) && !defined( ORD_16 )
|
||||
#error Not defined basic word type ORD_32 or ORD_16.
|
||||
#endif
|
||||
|
||||
#if defined( ORD_32 ) && defined( ORD_16 )
|
||||
#error Use only one define basic word type ORD_32 or ORD_16.
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef ORD_16
|
||||
/* typedef unsigned short ord; deleted by ogud@tis.com 1998/9/14 */
|
||||
typedef u_int16_t ord;
|
||||
#define BITS_COUNT 16
|
||||
#define MAXDIGIT (ord)(0xFFFF)
|
||||
#endif
|
||||
|
||||
#ifdef ORD_32
|
||||
/* typedef unsigned long ord; deleted by ogud@tis.com 1998/9/14 */
|
||||
typedef u_int32_t ord;
|
||||
#define BITS_COUNT 32
|
||||
#define MAXDIGIT (ord)(0xFFFFFFFF)
|
||||
#endif /* ORD_32 */
|
||||
|
||||
|
||||
|
||||
#define CALLOC(var,type,len) \
|
||||
var=(type *)calloc(len,1); \
|
||||
if (var==NULL) \
|
||||
status=ERR_ALLOC
|
||||
#ifdef CTK_BIG_ENDIAN
|
||||
#define ALIGN_CALLOC(i,o,l) \
|
||||
CALLOC(o,ord,l)
|
||||
#define ALIGN_CALLOC_COPY(i,o,l) \
|
||||
CALLOC(o,ord,l); \
|
||||
if (o) ByteOrd(i,l,o)
|
||||
#define ALIGN_CALLOC_MOVE(i,o,l) \
|
||||
CALLOC(o,ord,l); \
|
||||
if (o) memcpy(o,i,l)
|
||||
#define ALIGN_FREE(o) \
|
||||
free ( o )
|
||||
#define ALIGN_COPY_FREE(o,i,l) \
|
||||
if ((o) && (status==SUCCESS)) \
|
||||
OrdByte(o,l,i); \
|
||||
free (o)
|
||||
#define ALIGN_MOVE_FREE(o,i,l) \
|
||||
if ((o) && (status==SUCCESS)) \
|
||||
memcpy(i,o,l); \
|
||||
memset(o,0,l); \
|
||||
free (o)
|
||||
#else
|
||||
#define ALIGN_CALLOC(i,o,l) o=(ord *)i
|
||||
#define ALIGN_CALLOC_COPY(i,o,l) o=(ord *)i
|
||||
#define ALIGN_CALLOC_MOVE(i,o,l) o=(ord *)i
|
||||
#define ALIGN_FREE(o) ;
|
||||
#define ALIGN_COPY_FREE(o,i,l) ;
|
||||
#define ALIGN_MOVE_FREE(o,i,l) ;
|
||||
#endif
|
||||
#define DSS_P_ALIGN_CALLOC_COPY(i,o,l) \
|
||||
if (i) \
|
||||
{ ALIGN_CALLOC_COPY(i,o,l);} \
|
||||
else \
|
||||
o = &DSS_P_NUMBERS[DSS_NUM_INDEX[(l-DSS_LENGTH_MIN)/LENGTH_STEP]]
|
||||
|
||||
#define DSS_G_ALIGN_CALLOC_COPY(i,o,l) \
|
||||
if (i) \
|
||||
{ ALIGN_CALLOC_COPY(i,o,l);} \
|
||||
else \
|
||||
o = &DSS_G_NUMBERS[DSS_NUM_INDEX[(l-DSS_LENGTH_MIN)/LENGTH_STEP]]
|
||||
|
||||
#define DSS_Q_ALIGN_CALLOC_COPY(i,o,l) \
|
||||
if (i) \
|
||||
{ ALIGN_CALLOC_COPY(i,o,l);} \
|
||||
else \
|
||||
o = DSS_Q_NUMBER
|
||||
|
||||
#define DSS_ALIGN_FREE(o,i) \
|
||||
if (i) \
|
||||
{ ALIGN_FREE(o);}
|
||||
#endif /* CTK_ENDIAN_H */
|
||||
|
|
@ -1,435 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* FILENAME: prime.c PRODUCT NAME: CRYPTOGRAPHIC TOOLKIT
|
||||
*
|
||||
* FILE STATUS:
|
||||
*
|
||||
* DESCRIPTION: Cryptographic Toolkit Internal Functions File
|
||||
* Prime Number functions
|
||||
* PRIVATE FUNCTIONS:
|
||||
*
|
||||
* int VerPrime( u_int16_t P_bytes, ord *P,
|
||||
* u_int16_t k, ord *RVAL,
|
||||
* YIELD_context *yield_cont )
|
||||
* int GenPrime( u_int16_t P_bytes, ord *P,
|
||||
* u_int16_t k, ord *RVAL,
|
||||
* YIELD_context *yield_cont )
|
||||
* Copyright (c) Cylink Corporation 1996. All rights reserved.
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* INCLUDE FILES
|
||||
****************************************************************************/
|
||||
|
||||
#include "port_before.h"
|
||||
#include <sys/types.h>
|
||||
#include "cylink.h"
|
||||
#include "ctk_endian.h"
|
||||
|
||||
/* system files */
|
||||
#ifdef VXD
|
||||
#include <vtoolsc.h>
|
||||
#else
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
/* program files */
|
||||
#include "cylink.h"
|
||||
#include "ctk_endian.h"
|
||||
#include "toolkit.h"
|
||||
#include "cencrint.h"
|
||||
#include "port_after.h"
|
||||
|
||||
/****************************************************************************
|
||||
* PRIVATE FUNCTIONS DEFINITIONS
|
||||
****************************************************************************/
|
||||
/****************************************************************************
|
||||
* NAME: int VerPrime( u_int16_t P_bytes,
|
||||
* ord *P,
|
||||
* u_int16_t k,
|
||||
* ord *RVAL,
|
||||
* YIELD_context *yield_cont )
|
||||
*
|
||||
* DESCRIPTION: Verify Pseudo Prime number
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* u_int16_t P_bytes Number of bytes in array
|
||||
* u_int16_t k Number of testing
|
||||
* ord *RVAL Pointer to random number generator value
|
||||
* YIELD_context *yield_cont Pointer to yield_cont structure (NULL if not used)
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* ord *P Pointer to prime number
|
||||
* ord *RVAL Pointer to updated value
|
||||
*
|
||||
* RETURN:
|
||||
* SUCCESS No errors
|
||||
* ERR_INPUT_LEN Invalid length for input data(zero bytes)
|
||||
* ERR_PRIME Number is not prime
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
* 08 Dec 94 GKL Added YIELD_context
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int VerPrime( u_int16_t P_bytes,
|
||||
ord *P,
|
||||
u_int16_t k,
|
||||
ord *RVAL,
|
||||
YIELD_context *yield_cont ) /*TKL00601*/
|
||||
|
||||
{
|
||||
int status = SUCCESS; /*function return status*/
|
||||
ord *b, *n, *c, *pp; /*pointers to working buffers */
|
||||
ord *m, *buf, *P_buf;
|
||||
u_int16_t max_bytes; /*number of maximum bytes*/
|
||||
u_int16_t P_longs; /*number of longs in Y*/
|
||||
u_int16_t i, j, s, k_b; /*counters*/
|
||||
u_int16_t exit ; /*flag for exit*/
|
||||
/* product of prime numbers from 3 to 379 (512-bit number) */
|
||||
#ifdef ORD_32
|
||||
ord b1[DSS_LENGTH_MIN/sizeof(ord)]={
|
||||
0x2e30c48fL, 0x0decece9L, 0xbada8f98L, 0x9f7ecb29L,
|
||||
0xa4a11de4L, 0x6ef04659L, 0xcbc38405L, 0x233db117L,
|
||||
0x03e81187L, 0xc1b631a2L, 0x238bfb99L, 0x077ec3baL,
|
||||
0xc5d5f09fL, 0xb0813c28L, 0x7646fa6eL, 0x106aa9fbL };
|
||||
#else
|
||||
ord b1[DSS_LENGTH_MIN/sizeof(ord)]={
|
||||
0xc48f, 0x2e30, 0xece9, 0x0dec, 0x8f98, 0xbada, 0xcb29, 0x9f7e,
|
||||
0x1de4, 0xa4a1, 0x4659, 0x6ef0, 0x8405, 0xcbc3, 0xb117, 0x233d,
|
||||
0x1187, 0x03e8, 0x31a2, 0xc1b6, 0xfb99, 0x238b, 0xc3ba, 0x077e,
|
||||
0xf09f, 0xc5d5, 0x3c28, 0xb081, 0xfa6e, 0x7646, 0xa9fb, 0x106a };
|
||||
#endif
|
||||
if ( P_bytes % sizeof(ord) != 0 ) /* not multiple 4 (32 bit) */
|
||||
{
|
||||
status = ERR_INPUT_LEN; /* invalid length for input data */
|
||||
return status;
|
||||
}
|
||||
if ( P_bytes <= DSS_LENGTH_MIN )
|
||||
{
|
||||
max_bytes = DSS_LENGTH_MIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
max_bytes = P_bytes;
|
||||
}
|
||||
buf = (ord *)calloc( max_bytes / sizeof(ord), sizeof(ord) );
|
||||
P_buf = (ord *)calloc( max_bytes / sizeof(ord), sizeof(ord));
|
||||
if( !buf || !P_buf )
|
||||
{
|
||||
if ( buf )
|
||||
free( buf );
|
||||
if( P_buf )
|
||||
free( P_buf );
|
||||
return ERR_ALLOC;
|
||||
}
|
||||
memcpy( buf, b1, DSS_LENGTH_MIN );
|
||||
memcpy( P_buf, P, P_bytes );
|
||||
|
||||
if ( (P_buf[0] & 0x1) == 0 )
|
||||
{
|
||||
#ifdef DEBUG1
|
||||
printf ("\n P is not pseudoprime");
|
||||
#endif
|
||||
status = ERR_PRIME;
|
||||
free ( buf );
|
||||
free( P_buf );
|
||||
return status;
|
||||
}
|
||||
P_longs = (u_int16_t) (P_bytes / sizeof(ord));
|
||||
b = (ord *)calloc( P_longs, sizeof(ord) );
|
||||
m = (ord *)malloc( P_longs * sizeof(ord) );
|
||||
n = (ord *)calloc( P_longs, sizeof(ord) );
|
||||
c = (ord *)calloc( P_longs, sizeof(ord) );
|
||||
pp = (ord *)malloc( P_longs * sizeof(ord) );
|
||||
if( !b || !m || !n || !c || !pp )
|
||||
{
|
||||
if( b )
|
||||
free( b );
|
||||
if( m )
|
||||
free( m );
|
||||
if( n )
|
||||
free( n );
|
||||
if( c )
|
||||
free( c );
|
||||
if( pp )
|
||||
free ( pp );
|
||||
}
|
||||
memcpy( m, P, P_bytes );
|
||||
memcpy( pp, P, P_bytes );
|
||||
/* Compute great common divisor(gcd) */
|
||||
if ( SteinGCD( P_buf, buf, (u_int16_t)(max_bytes / sizeof(ord)) ) == 0 )
|
||||
{
|
||||
pp[0] = pp[0] - 1; /* Initialized work buffer */
|
||||
m[0] = m[0] - 1;
|
||||
s = (u_int16_t) RShiftMostBit( m, (u_int16_t)(P_bytes / sizeof(ord)) ); /* Right shift by number of*/
|
||||
exit = 0; /* zero bits at rigth */
|
||||
k_b = 0;
|
||||
while( k_b != k )
|
||||
{
|
||||
MyGenRand( 4, b, RVAL ); /* generate random number */
|
||||
if ( SteinGCD( P_buf, b , (u_int16_t)(P_bytes / sizeof(ord)) ) ) /* check gcd */
|
||||
{
|
||||
#ifdef DEBUG1
|
||||
printf ("\n P is not pseudoprime");
|
||||
#endif
|
||||
status = ERR_PRIME;
|
||||
break;
|
||||
}
|
||||
k_b++; /* increment counter */
|
||||
if ( ( status = Expo ( 4, b, P_bytes, m,
|
||||
P_bytes, P, c ) ) != SUCCESS ) /* c=b^m mod(P) */ /*TKL00601*/
|
||||
{
|
||||
free( b );
|
||||
free( m );
|
||||
free( n );
|
||||
free( c );
|
||||
free( pp );
|
||||
free (buf );
|
||||
free( P_buf );
|
||||
return status;
|
||||
}
|
||||
if ( c[0] == 1 ) /* if c==1 number is pseudo prime */
|
||||
{
|
||||
for ( i = 1; i < P_bytes / sizeof(ord); i++ )
|
||||
{
|
||||
if ( c[i] != 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( i == P_bytes / sizeof(ord) )
|
||||
{
|
||||
if (yield_cont) /*TKL00601*/
|
||||
#ifdef VXD
|
||||
if ( VXD_Yield (yield_cont->yield_proc) )
|
||||
#else
|
||||
if ( yield_cont->yield_proc(0xFFFF) )
|
||||
#endif
|
||||
|
||||
{
|
||||
status = ERR_CANCEL;
|
||||
free( b );
|
||||
free( m );
|
||||
free( n );
|
||||
free( c );
|
||||
free( pp );
|
||||
free( P_buf );
|
||||
free (buf );
|
||||
return status;
|
||||
}
|
||||
#ifdef DEBUG1
|
||||
printf ("\n P is a pseudoprime %d",k_b);
|
||||
#endif
|
||||
if ( k_b == k )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( j = 1; j <= s; j++ )
|
||||
{
|
||||
for ( i = 0; i < P_bytes / sizeof(ord); i++ ) /* if c==pp number is pseudo prime */
|
||||
{
|
||||
if ( c[i] != pp[i] )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( i == P_bytes / sizeof(ord) )
|
||||
{
|
||||
if (yield_cont) /*TKL00601*/
|
||||
#ifdef VXD
|
||||
if ( VXD_Yield (yield_cont->yield_proc) )
|
||||
#else
|
||||
if ( yield_cont->yield_proc(0xFFFF) )
|
||||
#endif
|
||||
|
||||
{
|
||||
status = ERR_CANCEL;
|
||||
free( b );
|
||||
free( m );
|
||||
free( n );
|
||||
free( c );
|
||||
free( pp );
|
||||
free( P_buf );
|
||||
free (buf );
|
||||
return status;
|
||||
}
|
||||
#ifdef DEBUG1
|
||||
printf ("\n P is a pseudoprime %d",k_b);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
if ( j == s )
|
||||
{
|
||||
#ifdef DEBUG1
|
||||
printf ("\n P is not pseudoprime");
|
||||
#endif
|
||||
status = ERR_PRIME;
|
||||
exit = 1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( (status = Square(P_bytes, c, /*P_bytes,
|
||||
c,*/ P_bytes, P, c) )
|
||||
!= SUCCESS ) /* c=c^2mod(p) */
|
||||
{
|
||||
free( b );
|
||||
free( m );
|
||||
free( n );
|
||||
free( c );
|
||||
free( pp );
|
||||
free( P_buf );
|
||||
free (buf );
|
||||
return status;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( exit == 1 ) /* Exit */
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (yield_cont) /*TKL00601*/
|
||||
#ifdef VXD
|
||||
if ( VXD_Yield (yield_cont->yield_proc) )
|
||||
#else
|
||||
if ( yield_cont->yield_proc(0xFFFF) )
|
||||
#endif
|
||||
|
||||
{
|
||||
status = ERR_CANCEL;
|
||||
free( b );
|
||||
free( m );
|
||||
free( n );
|
||||
free( c );
|
||||
free( pp );
|
||||
free( P_buf );
|
||||
free (buf );
|
||||
return status;
|
||||
}
|
||||
#ifdef DEBUG1
|
||||
printf ("\n P is not pseudoprime");
|
||||
#endif
|
||||
status = ERR_PRIME;
|
||||
}
|
||||
free( b );
|
||||
free( m );
|
||||
free( n );
|
||||
free( c );
|
||||
free( pp );
|
||||
free( P_buf );
|
||||
free (buf );
|
||||
return status;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: int GenPrime( u_int16_t P_bytes,
|
||||
* ord *P,
|
||||
* u_int16_t k,
|
||||
* ord *RVAL,
|
||||
* YIELD_context *yield_cont )
|
||||
*
|
||||
* DESCRIPTION: Generate Random Pseudo Prime number
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* u_int16_t P_bytes Number of bytes in array
|
||||
* u_int16_t k Number of testing
|
||||
* ord *RVAL Pointer to random number generator value
|
||||
* YIELD_context *yield_cont Pointer to yield_cont structure (NULL if not used)
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* ord *P Pointer to prime number
|
||||
* ord *RVAL Pointer to updated value
|
||||
*
|
||||
* RETURN:
|
||||
* SUCCESS No errors
|
||||
* ERR_INPUT_LEN Invalid length for input data(zero bytes)
|
||||
* ERR_PRIME Number is not prime
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
* 08 Dec 94 GKL Added YIELD_context
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int GenPrime( u_int16_t P_bytes,
|
||||
ord *P,
|
||||
u_int16_t k,
|
||||
ord *RVAL,
|
||||
YIELD_context *yield_cont ) /*TKL00601*/
|
||||
{
|
||||
int status = SUCCESS; /* function return status */
|
||||
if ( P_bytes % sizeof(ord) != 0 ) /* not multiple 4 (32 bit) */
|
||||
{
|
||||
status = ERR_INPUT_LEN; /* invalid length for input data */
|
||||
return status;
|
||||
}
|
||||
do
|
||||
{
|
||||
MyGenRand( P_bytes, P, RVAL ); /* generate random number */
|
||||
P[0] |= 1;
|
||||
P[(P_bytes/sizeof(ord))-1] |= ((ord)1 << (BITS_COUNT-1));
|
||||
status = VerPrime( P_bytes, P, k, RVAL, yield_cont); /*TKL00601*/
|
||||
} while ((status != SUCCESS) && (status != ERR_CANCEL)); /*TKL00601*/
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/**********************************************************************\
|
||||
* FILENAME: cylink.h PRODUCT NAME:
|
||||
*
|
||||
* DESCRIPTION: Company standard include file
|
||||
*
|
||||
* USAGE: File should be #included
|
||||
*
|
||||
*
|
||||
* Copyright (c) Cylink Corporation 1994. All rights reserved.
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
\**********************************************************************/
|
||||
|
||||
#ifndef CYLINK_H /* Prevent multiple inclusions of same header file */
|
||||
#define CYLINK_H
|
||||
|
||||
#include <sys/param.h>
|
||||
#if (!defined(BSD)) || (BSD < 199306)
|
||||
# include <sys/bitypes.h>
|
||||
#else
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#if ! ( defined(__alpha) && defined(__osf__) ) /* in sys/types.h */
|
||||
#if !defined(_H_INTTYPES) && !defined (_H_TYPES) /* AIX puts this in inttypes.h */
|
||||
typedef unsigned char uchar;
|
||||
#endif /* _H_INTTYPES */
|
||||
#endif
|
||||
|
||||
typedef u_int16_t USHORT;
|
||||
typedef u_int32_t ULONG;
|
||||
|
||||
#define FALSE 0
|
||||
#define TRUE 1
|
||||
|
||||
/*-- ANSI-recommended NULL Pointer definition --*/
|
||||
#ifndef NULL
|
||||
edefine NULL (void *) 0
|
||||
#endif
|
||||
|
||||
#endif /* CYLINK_H */
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,724 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/**********************************************************************\
|
||||
* FILENAME: DSSNum.h PRODUCT NAME: CRYPTOGRAPHIC TOOLKIT
|
||||
*
|
||||
* DESCRIPTION: Standard Cylink DSS numbers (P Q G) support.
|
||||
*
|
||||
* USAGE: File should be included to get access to
|
||||
* Cylink DSS numbers
|
||||
*
|
||||
*
|
||||
* Copyright (c) Cylink Corporation 1995. All rights reserved.
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
* 10 APR 95 GKL Initial release
|
||||
*
|
||||
\**********************************************************************/
|
||||
#ifndef DSSNUMBER_H /* Prevent multiple inclusions */
|
||||
#define DSSNUMBER_H
|
||||
|
||||
#include "ctk_endian.h"
|
||||
|
||||
#define LENGTH_MULT_TO_64
|
||||
|
||||
#define F0 0
|
||||
#define F1 (F0 + 1)
|
||||
#define F2 (F1 + 2)
|
||||
#define F3 (F2 + 3)
|
||||
#define F4 (F3 + 4)
|
||||
#define F5 (F4 + 5)
|
||||
#define F6 (F5 + 6)
|
||||
#define F7 (F6 + 7)
|
||||
#define F8 (F7 + 8)
|
||||
#define F9 (F8 + 9)
|
||||
#define F10 (F9 + 10)
|
||||
#define F11 (F10 + 11)
|
||||
#define F12 (F11 + 12)
|
||||
#define F13 (F12 + 13)
|
||||
#define F14 (F13 + 14)
|
||||
#define F15 (F14 + 15)
|
||||
|
||||
|
||||
#ifdef LENGTH_MULT_TO_64
|
||||
#define LENGTH_STEP 8U
|
||||
#define LAST_F F8
|
||||
#endif
|
||||
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
#define LENGTH_STEP 4U
|
||||
#define LAST_F (F15 + 16)
|
||||
#endif
|
||||
|
||||
|
||||
#define DSS_LENS_NUMBER (int) (1 + ( DSS_LENGTH_MAX - DSS_LENGTH_MIN )/LENGTH_STEP)
|
||||
|
||||
#define DSS_LAST_INDEX (DSS_LENGTH_MIN*DSS_LENS_NUMBER + LENGTH_STEP*LAST_F)/sizeof(ord)
|
||||
|
||||
#ifndef INITIALIZ_PQG
|
||||
|
||||
extern ushort DSS_NUM_INDEX[ DSS_LENS_NUMBER ];
|
||||
extern ord DSS_Q_NUMBER[SHA_LENGTH/sizeof(ord)];
|
||||
extern ord DSS_P_NUMBERS[DSS_LAST_INDEX];
|
||||
extern ord DSS_G_NUMBERS[DSS_LAST_INDEX];
|
||||
|
||||
#else
|
||||
ushort DSS_NUM_INDEX[ DSS_LENS_NUMBER ] =
|
||||
{
|
||||
(DSS_LENGTH_MIN*0 + LENGTH_STEP*0 )/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*1 + LENGTH_STEP*F0 )/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*2 + LENGTH_STEP*F1 )/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*3 + LENGTH_STEP*F2 )/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*4 + LENGTH_STEP*F3 )/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*5 + LENGTH_STEP*F4 )/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*6 + LENGTH_STEP*F5 )/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*7 + LENGTH_STEP*F6 )/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*8 + LENGTH_STEP*F7 )/sizeof(ord)
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
,
|
||||
(DSS_LENGTH_MIN*9 + LENGTH_STEP*F8 )/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*10 + LENGTH_STEP*F9 )/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*11 + LENGTH_STEP*F10)/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*12 + LENGTH_STEP*F11)/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*13 + LENGTH_STEP*F12)/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*14 + LENGTH_STEP*F13)/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*15 + LENGTH_STEP*F14)/sizeof(ord),
|
||||
(DSS_LENGTH_MIN*16 + LENGTH_STEP*F15)/sizeof(ord)
|
||||
#endif
|
||||
};
|
||||
|
||||
ord DSS_Q_NUMBER[SHA_LENGTH/sizeof(ord)] =
|
||||
#ifdef ORD_16
|
||||
{
|
||||
0x8fb7, 0x81f0, 0x6b9e, 0x122a, 0x4dc4, 0x03ca, 0xc896, 0x8d0e, 0xbe3b, 0xed4b
|
||||
};
|
||||
#else
|
||||
{
|
||||
0x81f08fb7L, 0x122a6b9eL, 0x03ca4dc4L, 0x8d0ec896L, 0xed4bbe3bL
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
ord DSS_P_NUMBERS[DSS_LAST_INDEX] =
|
||||
#ifdef ORD_16
|
||||
{
|
||||
/* dss_p length = 512*/
|
||||
0x92b7, 0xbd96, 0x9aab, 0x584c, 0xd617, 0xf2f0, 0xda85, 0xd370,
|
||||
0xcc82, 0x273e, 0x6b04, 0xc171, 0x5c32, 0xd3ff, 0x352e, 0xf2f8,
|
||||
0x4fc2, 0x20bc, 0xbdec, 0xe96e, 0x3503, 0x4d89, 0xe92d, 0xeb7d,
|
||||
0x9c1a, 0x7852, 0xfe2a, 0x0a25, 0x4446, 0xce18, 0x7829, 0x95d8,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 544*/
|
||||
0x12db, 0x0d31, 0x9950, 0x16c9, 0x3045, 0x0acb, 0x3c46, 0x3c5c,
|
||||
0x6c94, 0x2458, 0x0736, 0x13da, 0xa0af, 0x790f, 0xb177, 0xa6ae,
|
||||
0xd111, 0x2bda, 0x697c, 0x49a2, 0xe3e5, 0x6f27, 0x02f5, 0x9bc9,
|
||||
0xd4da, 0x7d9b, 0x89c6, 0x63bc, 0x0b6d, 0xfe2d, 0xc7a1, 0x435f,
|
||||
0x7fad, 0x9e40,
|
||||
#endif
|
||||
/* dss_p length = 576*/
|
||||
0x626b, 0x41b5, 0xd218, 0x25bf, 0x1825, 0x42b3, 0x9eb0, 0xc244,
|
||||
0x96ce, 0x22ac, 0x3ac6, 0x713f, 0x321d, 0x398c, 0x3022, 0xbc49,
|
||||
0xdd03, 0x52d5, 0x29f8, 0x2a57, 0x8fa1, 0x2173, 0xee7d, 0xb90d,
|
||||
0xcc64, 0x5fae, 0xaa81, 0xe3d0, 0x648f, 0xfa6e, 0xdc6c, 0x039f,
|
||||
0x2cd6, 0xc552, 0xe2dc, 0xebec,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 608*/
|
||||
0x35f5, 0xb2af, 0x27d0, 0x398b, 0x493d, 0x6f2e, 0xbe27, 0xe5b5,
|
||||
0x972c, 0x3470, 0x9638, 0xe90e, 0xf7b7, 0x98ad, 0xd091, 0xb4ca,
|
||||
0x3f43, 0x5f58, 0xb6c5, 0xd014, 0x25ee, 0x414d, 0xe2c1, 0x6fd6,
|
||||
0xd737, 0x9be6, 0x66ca, 0xe241, 0x1897, 0xf740, 0xe5df, 0xceb0,
|
||||
0xdb38, 0xabc8, 0x8af8, 0xc58b, 0xc6a0, 0x9a04,
|
||||
#endif
|
||||
/* dss_p length = 640*/
|
||||
0x4095, 0xf6bf, 0x7568, 0x4032, 0x5c0f, 0x64f2, 0x5aae, 0xb099,
|
||||
0x346f, 0x0e81, 0x357a, 0x7aeb, 0x0291, 0xfd0a, 0x8d54, 0xce80,
|
||||
0x0c05, 0xbea3, 0x889f, 0x8a1b, 0xf1c1, 0x6049, 0x214a, 0x8ec3,
|
||||
0xb926, 0xdde1, 0x61b4, 0x384e, 0x404b, 0xb6d7, 0x2e2d, 0x4584,
|
||||
0xae6a, 0xcc7a, 0x7bfa, 0x9eb0, 0x3a26, 0x3904, 0x8cac, 0xc036,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 672*/
|
||||
0x0abb, 0xaea3, 0xc749, 0x757c, 0x3035, 0x29d0, 0x46bd, 0xd56c,
|
||||
0xf49d, 0xa355, 0x1297, 0x8dcb, 0x9802, 0xc58c, 0xf1ec, 0x8aac,
|
||||
0x55dd, 0xb107, 0x0140, 0x26d1, 0x8a5d, 0x8a90, 0xf33e, 0xde0b,
|
||||
0xb844, 0xb429, 0x4db2, 0x9806, 0xf629, 0x4c3b, 0xcd76, 0x2f23,
|
||||
0x6c68, 0x7bf4, 0x2a7e, 0xd982, 0xc89f, 0x16a2, 0xfe84, 0x953c,
|
||||
0x3e4a, 0x8de8,
|
||||
#endif
|
||||
/* dss_p length = 704*/
|
||||
0x0113, 0x1535, 0xca0b, 0x8faf, 0xa327, 0x989c, 0x12c8, 0xe512,
|
||||
0x796f, 0x1229, 0x12bf, 0x62c8, 0xa50a, 0x2b99, 0xc93b, 0x450c,
|
||||
0x71ad, 0x0826, 0xf4c6, 0x3913, 0x9b6e, 0x96da, 0xa08d, 0xbc5e,
|
||||
0xd4d3, 0x7b26, 0xf9fd, 0xdd76, 0x4e82, 0x2f06, 0x1f96, 0xbf47,
|
||||
0xcadf, 0x3610, 0x917b, 0x4e94, 0xe2e8, 0x0eaf, 0x1cb9, 0x6b90,
|
||||
0xb917, 0x6d6f, 0x92b9, 0xb329,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 736*/
|
||||
0x6dad, 0xd878, 0xc913, 0xe61e, 0x87d9, 0xe275, 0xad24, 0xf090,
|
||||
0xe12b, 0xfdfe, 0x39a3, 0xc9a1, 0x8330, 0x138a, 0x4bed, 0xc319,
|
||||
0x8094, 0x88ba, 0x4b80, 0x1325, 0x7852, 0x67e2, 0x715e, 0x7313,
|
||||
0x3b4e, 0x7727, 0x9870, 0x5c6e, 0xe0ce, 0xc67a, 0xd057, 0xf3c5,
|
||||
0x55ea, 0x98ba, 0x6ea0, 0xaee7, 0x31e8, 0x3cd6, 0x0e28, 0x42d1,
|
||||
0x8946, 0xc395, 0x34fc, 0x1b9d, 0x19d1, 0x86f9,
|
||||
#endif
|
||||
/* dss_p length = 768*/
|
||||
0xe293, 0xea08, 0xcdd0, 0xf668, 0x8b2a, 0x06db, 0x7c71, 0xadb2,
|
||||
0x943d, 0x6721, 0x54f5, 0xbc44, 0xf7ca, 0x3345, 0x1bf6, 0x0b90,
|
||||
0xb475, 0xd3c4, 0xbdb6, 0x7caa, 0xa45f, 0xe9b4, 0x6e0e, 0x0c1a,
|
||||
0xb5c3, 0x9760, 0x851a, 0x53af, 0x96b7, 0x4979, 0xf162, 0xe951,
|
||||
0x6a54, 0xd020, 0x9ded, 0xdecb, 0xfc81, 0x7d74, 0x5e92, 0x2aee,
|
||||
0x0946, 0x0eb5, 0x3700, 0x9bce, 0x845a, 0xa7a3, 0x157a, 0x8618,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 800*/
|
||||
0xb0a1, 0xac27, 0xec4e, 0xf623, 0x55e2, 0x2cb6, 0x288b, 0x4b28,
|
||||
0xd74e, 0xbbe6, 0xfdf7, 0xaecd, 0x5758, 0xe251, 0x9074, 0x1aee,
|
||||
0xe6ed, 0x4d5e, 0x01d9, 0x529e, 0xf736, 0x0091, 0x0212, 0xc725,
|
||||
0x60ce, 0x966f, 0x851d, 0x5c4b, 0x80de, 0x34df, 0x1c88, 0x0636,
|
||||
0xbb71, 0x32ce, 0x45cb, 0x86da, 0x4d0e, 0x13e0, 0x7d7d, 0x544b,
|
||||
0x1272, 0x747f, 0xd6a7, 0xfa3b, 0xcb86, 0x6b43, 0x66f5, 0xd012,
|
||||
0xfe7a, 0xa0cb,
|
||||
#endif
|
||||
/* dss_p length = 832*/
|
||||
0xed2d, 0x84dd, 0xf274, 0xdd8f, 0xcd5f, 0x7928, 0xbfc6, 0xa522,
|
||||
0xe4e4, 0x50f0, 0xcddf, 0x5842, 0xbb29, 0x7c4d, 0xeef4, 0x6946,
|
||||
0x87f6, 0xe486, 0x61b5, 0xc1b6, 0xadef, 0x575a, 0x360f, 0x724f,
|
||||
0xcb29, 0x591b, 0x9a4c, 0xf7bc, 0x309e, 0xa348, 0x0ff5, 0x94f3,
|
||||
0x932f, 0x9dc6, 0x992c, 0xc6d7, 0x12f6, 0xc2d7, 0x38aa, 0x8c01,
|
||||
0x5dca, 0x74f4, 0xfcfd, 0x4cf4, 0x588a, 0x7837, 0x097e, 0xd2e2,
|
||||
0x6eac, 0x8869, 0xe92f, 0xec62,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 864*/
|
||||
0x7c21, 0x931e, 0x553d, 0x00f2, 0xa860, 0x940f, 0x411e, 0x7d20,
|
||||
0xb168, 0x52a3, 0x69ee, 0x166e, 0xb9e6, 0x1b23, 0xd5e0, 0xef64,
|
||||
0x2850, 0x724c, 0xc1fe, 0xea73, 0xda8c, 0xe342, 0x1d7b, 0xd256,
|
||||
0x359b, 0x180f, 0xd7f5, 0xca77, 0x06ac, 0x2162, 0xa977, 0x78bb,
|
||||
0x5018, 0x5de2, 0x6061, 0xe217, 0x4d42, 0xfed1, 0x3929, 0xd50f,
|
||||
0xc946, 0x2433, 0x15f8, 0x361b, 0xbf51, 0x3ff0, 0x3efa, 0x3157,
|
||||
0x7350, 0x53a0, 0xd1a4, 0x261b, 0xde5b, 0x9236,
|
||||
#endif
|
||||
/* dss_p length = 896*/
|
||||
0x8e21, 0x0364, 0x86d2, 0xe58c, 0x2274, 0x780a, 0x9ffc, 0x4951,
|
||||
0x3f99, 0xbc96, 0x9e60, 0x5a7e, 0x010a, 0x23d4, 0x54d1, 0x48e9,
|
||||
0xfd6b, 0x979c, 0x5202, 0x8af3, 0x5d87, 0xfe8f, 0x3e3c, 0x1e0c,
|
||||
0xe294, 0xcc52, 0xa8d6, 0x480e, 0xa898, 0xd4ce, 0x5949, 0xd341,
|
||||
0xe325, 0xf41b, 0x72d6, 0x6a90, 0x7a8b, 0x6f14, 0x3e2b, 0x6636,
|
||||
0x3748, 0x4eea, 0xa590, 0x03e4, 0x0524, 0x9c32, 0xeb53, 0x02af,
|
||||
0xca71, 0x6792, 0xd673, 0xedf8, 0x6448, 0x59c3, 0x7319, 0x883f,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 928*/
|
||||
0xc17d, 0xa4e8, 0xea08, 0x8ff8, 0x2cb0, 0x73f5, 0xd7ba, 0xc027,
|
||||
0xb9c8, 0x989d, 0xe5fe, 0xe3a1, 0xf324, 0x39d3, 0xf142, 0x5ba8,
|
||||
0xe6cb, 0x3708, 0xa0b7, 0xed9a, 0xb6b3, 0xe314, 0xf80a, 0x6778,
|
||||
0x4d27, 0x7107, 0x6ee8, 0xb9c2, 0xc6af, 0xab70, 0x53be, 0xc445,
|
||||
0x7926, 0x34bb, 0x5191, 0xe11d, 0x67f1, 0xcc3a, 0x5354, 0xd34d,
|
||||
0xa1ac, 0x08ba, 0x32d4, 0x068a, 0x7c3b, 0x415f, 0xbce0, 0xb549,
|
||||
0x0ecf, 0x538f, 0xb5d0, 0x22a3, 0x1d47, 0xe837, 0x14c0, 0x69dd,
|
||||
0xa02d, 0xce91,
|
||||
#endif
|
||||
/* dss_p length = 960*/
|
||||
0x1ff3, 0xf77e, 0xae7a, 0x5a28, 0x43b1, 0xe187, 0x2e04, 0xb3ea,
|
||||
0x7394, 0xa3e8, 0x4985, 0xc9bc, 0x7b7d, 0x1e1c, 0xd99c, 0x55f8,
|
||||
0x447b, 0x5704, 0xd758, 0xbed1, 0xe698, 0x2a5e, 0x5c19, 0xc206,
|
||||
0x6d38, 0x1f88, 0x2ea4, 0x5f15, 0xebfd, 0xd716, 0x8a2a, 0xf960,
|
||||
0x83ac, 0xc493, 0xb966, 0x8f13, 0x4778, 0x9682, 0x4712, 0x84cd,
|
||||
0xbb4e, 0xe567, 0x644f, 0x0780, 0x133d, 0x0b0a, 0xe42e, 0x06e8,
|
||||
0xa4cc, 0x3131, 0x39d9, 0xfaf8, 0x12a3, 0x5550, 0x43b1, 0xb8a9,
|
||||
0xb0eb, 0x0fad, 0x986f, 0xd427,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 992*/
|
||||
0xbcfd, 0x363f, 0x050a, 0x18f0, 0x78d8, 0xcac9, 0x423a, 0xf31e,
|
||||
0x198f, 0xd0c3, 0xb319, 0x5d1b, 0x917a, 0xc0b0, 0x8d1b, 0x6b91,
|
||||
0xea69, 0xa9d1, 0x02ce, 0x5345, 0x2c80, 0x6992, 0x4dad, 0x7a28,
|
||||
0xbb75, 0xd46d, 0x0faa, 0x5612, 0x6878, 0x8a0e, 0x63b4, 0x46ab,
|
||||
0xaca0, 0x5381, 0xb90a, 0x3e70, 0x19c4, 0xb639, 0xf778, 0xe751,
|
||||
0x5974, 0xb726, 0x589f, 0x8679, 0xeb04, 0xc0b5, 0xdffd, 0x2b32,
|
||||
0x4b51, 0xc632, 0xd8c6, 0x9501, 0x4f94, 0x2026, 0x253a, 0x0d27,
|
||||
0x07bb, 0x0838, 0x2725, 0xa3eb, 0x3c4e, 0x89b6,
|
||||
#endif
|
||||
/* dss_p length = 1024*/
|
||||
0xa141, 0xecf7, 0xc6d6, 0x867d, 0xefa3, 0x1cdd, 0x6c9d, 0x6ca5,
|
||||
0x2e2f, 0x68af, 0x90e1, 0x1d3e, 0xd75f, 0x0c2a, 0x844b, 0x36c7,
|
||||
0x3420, 0xfd1a, 0xb9ee, 0xf6e5, 0x5fde, 0xc8ed, 0x0c90, 0xd353,
|
||||
0x6faa, 0x80a4, 0x5bbd, 0xa59d, 0x9e72, 0x3223, 0x8f59, 0xf33d,
|
||||
0x10eb, 0xeccd, 0x184e, 0x3e2a, 0x4c07, 0x564b, 0x4c0a, 0x3263,
|
||||
0xc535, 0x8aeb, 0xf982, 0x2be2, 0xe475, 0x9b87, 0xcca0, 0x4d08,
|
||||
0x3adf, 0x0484, 0xd528, 0x7acd, 0x304d, 0x55a0, 0x70ae, 0x8298,
|
||||
0x6a7a, 0x2298, 0x15c0, 0x7a86, 0x7fc5, 0x654a, 0x14ad, 0xd0aa
|
||||
};
|
||||
#else
|
||||
{
|
||||
/* dss_p length = 512*/
|
||||
0xbd9692b7L, 0x584c9aabL, 0xf2f0d617L, 0xd370da85L,
|
||||
0x273ecc82L, 0xc1716b04L, 0xd3ff5c32L, 0xf2f8352eL,
|
||||
0x20bc4fc2L, 0xe96ebdecL, 0x4d893503L, 0xeb7de92dL,
|
||||
0x78529c1aL, 0x0a25fe2aL, 0xce184446L, 0x95d87829L,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 544*/
|
||||
0x0d3112dbL, 0x16c99950L, 0x0acb3045L, 0x3c5c3c46L,
|
||||
0x24586c94L, 0x13da0736L, 0x790fa0afL, 0xa6aeb177L,
|
||||
0x2bdad111L, 0x49a2697cL, 0x6f27e3e5L, 0x9bc902f5L,
|
||||
0x7d9bd4daL, 0x63bc89c6L, 0xfe2d0b6dL, 0x435fc7a1L,
|
||||
0x9e407fadL,
|
||||
#endif
|
||||
/* dss_p length = 576*/
|
||||
0x41b5626bL, 0x25bfd218L, 0x42b31825L, 0xc2449eb0L,
|
||||
0x22ac96ceL, 0x713f3ac6L, 0x398c321dL, 0xbc493022L,
|
||||
0x52d5dd03L, 0x2a5729f8L, 0x21738fa1L, 0xb90dee7dL,
|
||||
0x5faecc64L, 0xe3d0aa81L, 0xfa6e648fL, 0x039fdc6cL,
|
||||
0xc5522cd6L, 0xebece2dcL,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 608*/
|
||||
0xb2af35f5L, 0x398b27d0L, 0x6f2e493dL, 0xe5b5be27L,
|
||||
0x3470972cL, 0xe90e9638L, 0x98adf7b7L, 0xb4cad091L,
|
||||
0x5f583f43L, 0xd014b6c5L, 0x414d25eeL, 0x6fd6e2c1L,
|
||||
0x9be6d737L, 0xe24166caL, 0xf7401897L, 0xceb0e5dfL,
|
||||
0xabc8db38L, 0xc58b8af8L, 0x9a04c6a0L,
|
||||
#endif
|
||||
/* dss_p length = 640*/
|
||||
0xf6bf4095L, 0x40327568L, 0x64f25c0fL, 0xb0995aaeL,
|
||||
0x0e81346fL, 0x7aeb357aL, 0xfd0a0291L, 0xce808d54L,
|
||||
0xbea30c05L, 0x8a1b889fL, 0x6049f1c1L, 0x8ec3214aL,
|
||||
0xdde1b926L, 0x384e61b4L, 0xb6d7404bL, 0x45842e2dL,
|
||||
0xcc7aae6aL, 0x9eb07bfaL, 0x39043a26L, 0xc0368cacL,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 672*/
|
||||
0xaea30abbL, 0x757cc749L, 0x29d03035L, 0xd56c46bdL,
|
||||
0xa355f49dL, 0x8dcb1297L, 0xc58c9802L, 0x8aacf1ecL,
|
||||
0xb10755ddL, 0x26d10140L, 0x8a908a5dL, 0xde0bf33eL,
|
||||
0xb429b844L, 0x98064db2L, 0x4c3bf629L, 0x2f23cd76L,
|
||||
0x7bf46c68L, 0xd9822a7eL, 0x16a2c89fL, 0x953cfe84L,
|
||||
0x8de83e4aL,
|
||||
#endif
|
||||
/* dss_p length = 704*/
|
||||
0x15350113L, 0x8fafca0bL, 0x989ca327L, 0xe51212c8L,
|
||||
0x1229796fL, 0x62c812bfL, 0x2b99a50aL, 0x450cc93bL,
|
||||
0x082671adL, 0x3913f4c6L, 0x96da9b6eL, 0xbc5ea08dL,
|
||||
0x7b26d4d3L, 0xdd76f9fdL, 0x2f064e82L, 0xbf471f96L,
|
||||
0x3610cadfL, 0x4e94917bL, 0x0eafe2e8L, 0x6b901cb9L,
|
||||
0x6d6fb917L, 0xb32992b9L,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 736*/
|
||||
0xd8786dadL, 0xe61ec913L, 0xe27587d9L, 0xf090ad24L,
|
||||
0xfdfee12bL, 0xc9a139a3L, 0x138a8330L, 0xc3194bedL,
|
||||
0x88ba8094L, 0x13254b80L, 0x67e27852L, 0x7313715eL,
|
||||
0x77273b4eL, 0x5c6e9870L, 0xc67ae0ceL, 0xf3c5d057L,
|
||||
0x98ba55eaL, 0xaee76ea0L, 0x3cd631e8L, 0x42d10e28L,
|
||||
0xc3958946L, 0x1b9d34fcL, 0x86f919d1L,
|
||||
#endif
|
||||
/* dss_p length = 768*/
|
||||
0xea08e293L, 0xf668cdd0L, 0x06db8b2aL, 0xadb27c71L,
|
||||
0x6721943dL, 0xbc4454f5L, 0x3345f7caL, 0x0b901bf6L,
|
||||
0xd3c4b475L, 0x7caabdb6L, 0xe9b4a45fL, 0x0c1a6e0eL,
|
||||
0x9760b5c3L, 0x53af851aL, 0x497996b7L, 0xe951f162L,
|
||||
0xd0206a54L, 0xdecb9dedL, 0x7d74fc81L, 0x2aee5e92L,
|
||||
0x0eb50946L, 0x9bce3700L, 0xa7a3845aL, 0x8618157aL,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 800*/
|
||||
0xac27b0a1L, 0xf623ec4eL, 0x2cb655e2L, 0x4b28288bL,
|
||||
0xbbe6d74eL, 0xaecdfdf7L, 0xe2515758L, 0x1aee9074L,
|
||||
0x4d5ee6edL, 0x529e01d9L, 0x0091f736L, 0xc7250212L,
|
||||
0x966f60ceL, 0x5c4b851dL, 0x34df80deL, 0x06361c88L,
|
||||
0x32cebb71L, 0x86da45cbL, 0x13e04d0eL, 0x544b7d7dL,
|
||||
0x747f1272L, 0xfa3bd6a7L, 0x6b43cb86L, 0xd01266f5L,
|
||||
0xa0cbfe7aL,
|
||||
#endif
|
||||
/* dss_p length = 832*/
|
||||
0x84dded2dL, 0xdd8ff274L, 0x7928cd5fL, 0xa522bfc6L,
|
||||
0x50f0e4e4L, 0x5842cddfL, 0x7c4dbb29L, 0x6946eef4L,
|
||||
0xe48687f6L, 0xc1b661b5L, 0x575aadefL, 0x724f360fL,
|
||||
0x591bcb29L, 0xf7bc9a4cL, 0xa348309eL, 0x94f30ff5L,
|
||||
0x9dc6932fL, 0xc6d7992cL, 0xc2d712f6L, 0x8c0138aaL,
|
||||
0x74f45dcaL, 0x4cf4fcfdL, 0x7837588aL, 0xd2e2097eL,
|
||||
0x88696eacL, 0xec62e92fL,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 864*/
|
||||
0x931e7c21L, 0x00f2553dL, 0x940fa860L, 0x7d20411eL,
|
||||
0x52a3b168L, 0x166e69eeL, 0x1b23b9e6L, 0xef64d5e0L,
|
||||
0x724c2850L, 0xea73c1feL, 0xe342da8cL, 0xd2561d7bL,
|
||||
0x180f359bL, 0xca77d7f5L, 0x216206acL, 0x78bba977L,
|
||||
0x5de25018L, 0xe2176061L, 0xfed14d42L, 0xd50f3929L,
|
||||
0x2433c946L, 0x361b15f8L, 0x3ff0bf51L, 0x31573efaL,
|
||||
0x53a07350L, 0x261bd1a4L, 0x9236de5bL,
|
||||
#endif
|
||||
/* dss_p length = 896*/
|
||||
0x03648e21L, 0xe58c86d2L, 0x780a2274L, 0x49519ffcL,
|
||||
0xbc963f99L, 0x5a7e9e60L, 0x23d4010aL, 0x48e954d1L,
|
||||
0x979cfd6bL, 0x8af35202L, 0xfe8f5d87L, 0x1e0c3e3cL,
|
||||
0xcc52e294L, 0x480ea8d6L, 0xd4cea898L, 0xd3415949L,
|
||||
0xf41be325L, 0x6a9072d6L, 0x6f147a8bL, 0x66363e2bL,
|
||||
0x4eea3748L, 0x03e4a590L, 0x9c320524L, 0x02afeb53L,
|
||||
0x6792ca71L, 0xedf8d673L, 0x59c36448L, 0x883f7319L,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 928*/
|
||||
0xa4e8c17dL, 0x8ff8ea08L, 0x73f52cb0L, 0xc027d7baL,
|
||||
0x989db9c8L, 0xe3a1e5feL, 0x39d3f324L, 0x5ba8f142L,
|
||||
0x3708e6cbL, 0xed9aa0b7L, 0xe314b6b3L, 0x6778f80aL,
|
||||
0x71074d27L, 0xb9c26ee8L, 0xab70c6afL, 0xc44553beL,
|
||||
0x34bb7926L, 0xe11d5191L, 0xcc3a67f1L, 0xd34d5354L,
|
||||
0x08baa1acL, 0x068a32d4L, 0x415f7c3bL, 0xb549bce0L,
|
||||
0x538f0ecfL, 0x22a3b5d0L, 0xe8371d47L, 0x69dd14c0L,
|
||||
0xce91a02dL,
|
||||
#endif
|
||||
/* dss_p length = 960*/
|
||||
0xf77e1ff3L, 0x5a28ae7aL, 0xe18743b1L, 0xb3ea2e04L,
|
||||
0xa3e87394L, 0xc9bc4985L, 0x1e1c7b7dL, 0x55f8d99cL,
|
||||
0x5704447bL, 0xbed1d758L, 0x2a5ee698L, 0xc2065c19L,
|
||||
0x1f886d38L, 0x5f152ea4L, 0xd716ebfdL, 0xf9608a2aL,
|
||||
0xc49383acL, 0x8f13b966L, 0x96824778L, 0x84cd4712L,
|
||||
0xe567bb4eL, 0x0780644fL, 0x0b0a133dL, 0x06e8e42eL,
|
||||
0x3131a4ccL, 0xfaf839d9L, 0x555012a3L, 0xb8a943b1L,
|
||||
0x0fadb0ebL, 0xd427986fL,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_p length = 992*/
|
||||
0x363fbcfdL, 0x18f0050aL, 0xcac978d8L, 0xf31e423aL,
|
||||
0xd0c3198fL, 0x5d1bb319L, 0xc0b0917aL, 0x6b918d1bL,
|
||||
0xa9d1ea69L, 0x534502ceL, 0x69922c80L, 0x7a284dadL,
|
||||
0xd46dbb75L, 0x56120faaL, 0x8a0e6878L, 0x46ab63b4L,
|
||||
0x5381aca0L, 0x3e70b90aL, 0xb63919c4L, 0xe751f778L,
|
||||
0xb7265974L, 0x8679589fL, 0xc0b5eb04L, 0x2b32dffdL,
|
||||
0xc6324b51L, 0x9501d8c6L, 0x20264f94L, 0x0d27253aL,
|
||||
0x083807bbL, 0xa3eb2725L, 0x89b63c4eL,
|
||||
#endif
|
||||
/* dss_p length = 1024*/
|
||||
0xecf7a141L, 0x867dc6d6L, 0x1cddefa3L, 0x6ca56c9dL,
|
||||
0x68af2e2fL, 0x1d3e90e1L, 0x0c2ad75fL, 0x36c7844bL,
|
||||
0xfd1a3420L, 0xf6e5b9eeL, 0xc8ed5fdeL, 0xd3530c90L,
|
||||
0x80a46faaL, 0xa59d5bbdL, 0x32239e72L, 0xf33d8f59L,
|
||||
0xeccd10ebL, 0x3e2a184eL, 0x564b4c07L, 0x32634c0aL,
|
||||
0x8aebc535L, 0x2be2f982L, 0x9b87e475L, 0x4d08cca0L,
|
||||
0x04843adfL, 0x7acdd528L, 0x55a0304dL, 0x829870aeL,
|
||||
0x22986a7aL, 0x7a8615c0L, 0x654a7fc5L, 0xd0aa14adL
|
||||
};
|
||||
#endif
|
||||
|
||||
ord DSS_G_NUMBERS[DSS_LAST_INDEX] =
|
||||
#ifdef ORD_16
|
||||
{
|
||||
/* dss_g length = 512*/
|
||||
0x8b1a, 0xedfe, 0xef16, 0xdb26, 0xeae0, 0x1f1d, 0xaf3a, 0x3e30,
|
||||
0x2bd6, 0x25ec, 0xa451, 0x6255, 0xbc75, 0x499c, 0x4071, 0x5da2,
|
||||
0x1149, 0xc7fc, 0x1402, 0x9b69, 0xc168, 0xb0ea, 0xaf92, 0x6a33,
|
||||
0xf45f, 0xd93a, 0x75a6, 0x263c, 0xb820, 0x7eb1, 0x5f5b, 0x4bd7,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 544*/
|
||||
0x2772, 0xe0e6, 0xce97, 0x605b, 0x4aa8, 0x2586, 0x095a, 0xb83f,
|
||||
0x8b01, 0xfe53, 0x9250, 0x74ef, 0x74d4, 0xd9fa, 0xb78b, 0xa714,
|
||||
0x106f, 0x03a6, 0xb406, 0xc549, 0xc44d, 0xd559, 0x8100, 0xfef4,
|
||||
0x34a4, 0x1f4c, 0x3c6b, 0x4ae0, 0xe770, 0x158b, 0x3f8d, 0xf73d,
|
||||
0x0cc5, 0x61b7,
|
||||
#endif
|
||||
/* dss_g length = 576*/
|
||||
0x3dde, 0x64fd, 0x2b69, 0x03c3, 0xad1d, 0x1751, 0x11dc, 0xfe67,
|
||||
0x6379, 0x76de, 0xe333, 0x3b8f, 0x242f, 0x27d8, 0x5f33, 0x3597,
|
||||
0xb98c, 0x11dc, 0x718c, 0xe3b5, 0xa3d4, 0x58f2, 0x71fa, 0x2675,
|
||||
0x49f9, 0xf2c7, 0x510e, 0xa4e1, 0xeca4, 0x7c64, 0x243b, 0x78fc,
|
||||
0x2ce2, 0x7017, 0x0095, 0x23b6,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 608*/
|
||||
0xdad8, 0x1e27, 0x41f5, 0xd536, 0x528f, 0x7047, 0x028a, 0x56f5,
|
||||
0xe55f, 0xe20d, 0x612c, 0x520f, 0xebfd, 0x8c86, 0x0924, 0x562a,
|
||||
0x2185, 0xe5ac, 0xa113, 0x4b8c, 0x87da, 0xfa4c, 0x8788, 0x9d8d,
|
||||
0x41c0, 0x9d25, 0x9c77, 0xff33, 0x6861, 0xd10a, 0xc734, 0x8454,
|
||||
0xf803, 0x55ce, 0xfeac, 0x6580, 0x6cd2, 0x482b,
|
||||
#endif
|
||||
/* dss_g length = 640*/
|
||||
0x4ff7, 0x2829, 0x8ab0, 0xa0bd, 0x7b1c, 0xf544, 0xe633, 0x6e7b,
|
||||
0x9824, 0x494a, 0xfb7f, 0xc8ad, 0x45b6, 0x956e, 0x0574, 0x5b0d,
|
||||
0xd40c, 0xf807, 0x7372, 0x56fd, 0xdd12, 0x8960, 0x255c, 0x019e,
|
||||
0xfc39, 0x06b3, 0x9f8e, 0x4cd9, 0xe714, 0x77f6, 0x76f7, 0xb573,
|
||||
0x010e, 0x9b52, 0x04d2, 0xe269, 0xd4bb, 0xbdec, 0x089d, 0x7f88,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 672*/
|
||||
0x3d36, 0xb22d, 0x2144, 0xfda0, 0x1d4a, 0xc144, 0xef8f, 0x70e8,
|
||||
0xfd0f, 0xcbf9, 0x7433, 0xbf29, 0x1657, 0x757b, 0x011d, 0x5c7e,
|
||||
0xa0d3, 0xec5a, 0xd45d, 0xacd6, 0x136a, 0x9454, 0x61fd, 0xc3f6,
|
||||
0x3758, 0x5c89, 0xe4df, 0xd3c9, 0x6f99, 0xa113, 0x0992, 0x16b2,
|
||||
0xf92f, 0xfb67, 0x3f34, 0x57e6, 0xb224, 0xdfd1, 0x43c4, 0x639a,
|
||||
0xccf5, 0x86c4,
|
||||
#endif
|
||||
/* dss_g length = 704*/
|
||||
0x1621, 0x8313, 0x216e, 0xcb3b, 0xde00, 0xa11b, 0xf27f, 0xd5d4,
|
||||
0x6d2e, 0xc870, 0x1c47, 0x2e21, 0x780b, 0x1db6, 0x8adf, 0xe5c6,
|
||||
0x837d, 0x7dba, 0x9c8c, 0x28b5, 0xd309, 0xf3fa, 0x6c65, 0xe37f,
|
||||
0x6a1e, 0x2601, 0xbb92, 0x56aa, 0x9c0e, 0x9db1, 0xb782, 0x642b,
|
||||
0x6cc9, 0xb9fb, 0x6a3c, 0x97b9, 0xf1a8, 0xd8a2, 0xfe6b, 0xcb93,
|
||||
0x59ee, 0x32a4, 0x0aa1, 0x58ad,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 736*/
|
||||
0x648c, 0xa15c, 0x27b2, 0x8137, 0xefb3, 0x0e81, 0x258e, 0xabe0,
|
||||
0x9f2f, 0x6c67, 0xbed6, 0xd201, 0x3647, 0xbe9a, 0x0091, 0xba9a,
|
||||
0x4df1, 0xdc8c, 0x5b15, 0x5a37, 0xb5b1, 0x50f8, 0xdfe6, 0x081b,
|
||||
0x48d7, 0xd40b, 0x7c51, 0x0417, 0x97c7, 0x2565, 0xf960, 0x89b2,
|
||||
0xa1f0, 0x7aac, 0xed6f, 0x20fe, 0x1d98, 0x0eee, 0x48b8, 0xb062,
|
||||
0x70e7, 0xa3f3, 0xbe3f, 0x9183, 0x76ae, 0x6cbc,
|
||||
#endif
|
||||
/* dss_g length = 768*/
|
||||
0x6216, 0x4b90, 0xc254, 0x7ab6, 0x7a04, 0xf90f, 0x42dd, 0x58c7,
|
||||
0xd015, 0x904d, 0xfbf7, 0x624a, 0x5010, 0x627f, 0x696c, 0x1a32,
|
||||
0xe0bc, 0xcdfd, 0xe32f, 0xb081, 0x1377, 0x1913, 0x5f96, 0x86c6,
|
||||
0x864a, 0x8429, 0x4bb9, 0xd0c6, 0x3361, 0xbc7d, 0xbd8d, 0xa3b2,
|
||||
0x47d5, 0x5086, 0xed0b, 0x3bb6, 0xdba6, 0x6f2c, 0x707a, 0x434b,
|
||||
0xd4cc, 0x7b10, 0x8ef0, 0x3466, 0x4737, 0x8f27, 0x3399, 0x3716,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 800*/
|
||||
0x99a7, 0xa90c, 0xdf8e, 0xba50, 0x83b5, 0x7ea0, 0x1d8a, 0xe5bb,
|
||||
0x34c9, 0x8c4d, 0xb151, 0x3aba, 0xee2f, 0x76c8, 0xeebf, 0x3db9,
|
||||
0xc1e0, 0x2b9a, 0x774f, 0xb476, 0x9b93, 0x53b5, 0xc008, 0xed2c,
|
||||
0x0ad4, 0x8af4, 0xc0e6, 0x0e98, 0x2d7b, 0xdb37, 0x7b59, 0x8a31,
|
||||
0x0667, 0x1225, 0xb882, 0x0355, 0x58ba, 0xf079, 0x80d7, 0x8033,
|
||||
0x54bc, 0xf9cd, 0x461e, 0xc70a, 0x9170, 0x1dba, 0xc447, 0xd3e5,
|
||||
0xaf18, 0x04c4,
|
||||
#endif
|
||||
/* dss_g length = 832*/
|
||||
0xd1b5, 0x3d20, 0xfbdb, 0xa0b6, 0x0505, 0x4e88, 0xa781, 0x7c65,
|
||||
0xd381, 0x5b6e, 0xfd1e, 0xbb71, 0xe085, 0x855d, 0x6d0b, 0x650a,
|
||||
0xa248, 0x82d0, 0xd4dd, 0x7ea0, 0x16d1, 0x6937, 0x2cc2, 0x2dec,
|
||||
0x5e07, 0x97b4, 0x0c5a, 0xcf21, 0x0299, 0x9b96, 0x4acf, 0xc732,
|
||||
0xfbcf, 0xeefb, 0x0032, 0x40bb, 0xc86e, 0xeacb, 0xae2b, 0x8adb,
|
||||
0x39aa, 0xbb47, 0xaf3a, 0xfd36, 0xf859, 0x97fc, 0x5535, 0x0d3d,
|
||||
0x627a, 0x3f62, 0x1f90, 0x5490,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 864*/
|
||||
0xbf83, 0x8b52, 0xc2b1, 0x0808, 0x4a3e, 0x6ccb, 0x8aa8, 0xcfdd,
|
||||
0xb046, 0x4948, 0xcdf4, 0x9881, 0x13d8, 0x85b0, 0xa22a, 0x3786,
|
||||
0xe9db, 0xcb8a, 0x89ad, 0x5e27, 0xd925, 0x1fcb, 0x3855, 0x4afd,
|
||||
0x7f67, 0x83be, 0xb092, 0xe061, 0x6703, 0xf21f, 0x403e, 0x4c6a,
|
||||
0xa8bd, 0x536a, 0x89b6, 0xb25e, 0xe165, 0xd259, 0xb765, 0xd7f3,
|
||||
0xc474, 0xd8bc, 0x617d, 0x1a0a, 0xa054, 0x8c28, 0x9fb0, 0x9595,
|
||||
0x6f2d, 0x6254, 0xe1c2, 0xb450, 0xef81, 0x277f,
|
||||
#endif
|
||||
/* dss_g length = 896*/
|
||||
0x7490, 0x2aea, 0xd005, 0xa3cc, 0x9211, 0x235a, 0x7b6d, 0xacec,
|
||||
0xfca5, 0x5407, 0x8515, 0x5bc1, 0x8b2a, 0x9388, 0x8ff9, 0xed56,
|
||||
0xf4e9, 0xf31e, 0x7e05, 0x172a, 0x6e2a, 0x8165, 0x7a24, 0x975b,
|
||||
0x1f6e, 0xd4d1, 0x8232, 0xd6ff, 0x2363, 0x4072, 0xa1f1, 0xd18b,
|
||||
0xe574, 0xb032, 0xc330, 0x81b6, 0x6033, 0x07d5, 0x5107, 0xb7cc,
|
||||
0x2c10, 0xbd8e, 0xc6a3, 0xe731, 0xfcd6, 0xe567, 0x3440, 0xbcde,
|
||||
0x1976, 0xdbb3, 0xd15a, 0x4e39, 0xc282, 0x4b0b, 0x82b3, 0x286b,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 928*/
|
||||
0x9f66, 0xd0e5, 0xd7d2, 0xe875, 0x0707, 0x2dca, 0xa5a2, 0x266d,
|
||||
0x80c2, 0x6d20, 0x69b3, 0x759c, 0x497f, 0x74b4, 0x0f56, 0x4b63,
|
||||
0xa294, 0x4995, 0x3eda, 0xf5c4, 0x7951, 0x3a3d, 0x22e9, 0x617f,
|
||||
0x1906, 0xd45d, 0x047f, 0x2726, 0x27be, 0x660e, 0xc1d3, 0xa588,
|
||||
0xceb2, 0xe300, 0xca06, 0x8620, 0x1110, 0x76ae, 0xf7b8, 0xe368,
|
||||
0x89a7, 0x2ded, 0x2756, 0x3ed6, 0x5449, 0x4bd8, 0xb73d, 0xb406,
|
||||
0x25ec, 0x32f7, 0x989c, 0x6623, 0x6b1f, 0xf7f0, 0x4807, 0x0954,
|
||||
0x51e6, 0x97d0,
|
||||
#endif
|
||||
/* dss_g length = 960*/
|
||||
0x4118, 0xe87c, 0x809a, 0x1287, 0x2a0f, 0x51d6, 0x7fc8, 0xdad8,
|
||||
0x8dc6, 0xddce, 0xd27c, 0x898a, 0x96a9, 0xaee1, 0xe44c, 0xd322,
|
||||
0x9d58, 0x3a34, 0xcebd, 0x322a, 0x5b48, 0x9c21, 0x6d04, 0x2d77,
|
||||
0x41f1, 0x5123, 0xaa5f, 0x2192, 0x8175, 0x5cac, 0xf547, 0xdc08,
|
||||
0xb0d9, 0x4f11, 0x85c9, 0xb5bf, 0x7147, 0x9fbf, 0x3c20, 0x7f7a,
|
||||
0xdd8a, 0xa163, 0x0ae4, 0xfcb2, 0x8251, 0x8162, 0xb96e, 0x84f9,
|
||||
0xd652, 0x94ba, 0xbb90, 0x9559, 0xac51, 0x6418, 0xdb54, 0x4739,
|
||||
0x3ec0, 0x9b7c, 0xae96, 0x3e14,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 992*/
|
||||
0x4eff, 0x399a, 0x5da9, 0x1e5a, 0x9040, 0x4bad, 0xc85d, 0x5b9a,
|
||||
0x825b, 0x5464, 0x7538, 0xe2ea, 0xb957, 0x5def, 0xbfa6, 0x4916,
|
||||
0x89be, 0x93fe, 0xe5da, 0x919f, 0x791c, 0xe7a8, 0xef86, 0xc186,
|
||||
0xbf63, 0xa881, 0x1e38, 0x9abe, 0x8b58, 0x70b4, 0x9dfd, 0x0719,
|
||||
0x85e5, 0xc60a, 0xab36, 0xe07d, 0x0c49, 0xd6fe, 0xfdb4, 0x6619,
|
||||
0xe55d, 0x997e, 0x5f38, 0x824f, 0x47ff, 0xf800, 0xb137, 0x839d,
|
||||
0x2dae, 0xe0db, 0x2a74, 0x2f58, 0x6fb3, 0x1bab, 0x62ed, 0x0e02,
|
||||
0xbef2, 0xd7f1, 0xe566, 0xa9ae, 0xbc35, 0x6357,
|
||||
#endif
|
||||
/* dss_g length = 1024*/
|
||||
0x914d, 0x76b2, 0xfee4, 0x9cf7, 0xa136, 0x07a1, 0x3808, 0x1857,
|
||||
0x8f96, 0x870c, 0x1f3c, 0x59f2, 0x6f01, 0x4d4d, 0x580e, 0xafc6,
|
||||
0x99af, 0xff1b, 0xc019, 0x6c1f, 0xe449, 0x1698, 0x4787, 0x0aa2,
|
||||
0x6e68, 0x768d, 0x5ff0, 0x27dc, 0xca9e, 0x630f, 0x01ae, 0x9981,
|
||||
0x688d, 0xf278, 0x7f3d, 0x17ad, 0x48aa, 0x65d6, 0x181f, 0x1802,
|
||||
0x647c, 0x9ef5, 0x7081, 0x5843, 0x1f0d, 0x9364, 0xebe9, 0x6330,
|
||||
0x033a, 0x5d2a, 0xb68a, 0x5639, 0xfa7c, 0xd77e, 0x4bdc, 0x4a62,
|
||||
0x5c6d, 0xfed5, 0xa8aa, 0x5eff, 0x1138, 0xae4a, 0xe993, 0x3a73
|
||||
};
|
||||
#else
|
||||
{
|
||||
/* dss_g length = 512*/
|
||||
0xedfe8b1aL, 0xdb26ef16L, 0x1f1deae0L, 0x3e30af3aL,
|
||||
0x25ec2bd6L, 0x6255a451L, 0x499cbc75L, 0x5da24071L,
|
||||
0xc7fc1149L, 0x9b691402L, 0xb0eac168L, 0x6a33af92L,
|
||||
0xd93af45fL, 0x263c75a6L, 0x7eb1b820L, 0x4bd75f5bL,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 544*/
|
||||
0xe0e62772L, 0x605bce97L, 0x25864aa8L, 0xb83f095aL,
|
||||
0xfe538b01L, 0x74ef9250L, 0xd9fa74d4L, 0xa714b78bL,
|
||||
0x03a6106fL, 0xc549b406L, 0xd559c44dL, 0xfef48100L,
|
||||
0x1f4c34a4L, 0x4ae03c6bL, 0x158be770L, 0xf73d3f8dL,
|
||||
0x61b70cc5L,
|
||||
#endif
|
||||
/* dss_g length = 576*/
|
||||
0x64fd3ddeL, 0x03c32b69L, 0x1751ad1dL, 0xfe6711dcL,
|
||||
0x76de6379L, 0x3b8fe333L, 0x27d8242fL, 0x35975f33L,
|
||||
0x11dcb98cL, 0xe3b5718cL, 0x58f2a3d4L, 0x267571faL,
|
||||
0xf2c749f9L, 0xa4e1510eL, 0x7c64eca4L, 0x78fc243bL,
|
||||
0x70172ce2L, 0x23b60095L,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 608*/
|
||||
0x1e27dad8L, 0xd53641f5L, 0x7047528fL, 0x56f5028aL,
|
||||
0xe20de55fL, 0x520f612cL, 0x8c86ebfdL, 0x562a0924L,
|
||||
0xe5ac2185L, 0x4b8ca113L, 0xfa4c87daL, 0x9d8d8788L,
|
||||
0x9d2541c0L, 0xff339c77L, 0xd10a6861L, 0x8454c734L,
|
||||
0x55cef803L, 0x6580feacL, 0x482b6cd2L,
|
||||
#endif
|
||||
/* dss_g length = 640*/
|
||||
0x28294ff7L, 0xa0bd8ab0L, 0xf5447b1cL, 0x6e7be633L,
|
||||
0x494a9824L, 0xc8adfb7fL, 0x956e45b6L, 0x5b0d0574L,
|
||||
0xf807d40cL, 0x56fd7372L, 0x8960dd12L, 0x019e255cL,
|
||||
0x06b3fc39L, 0x4cd99f8eL, 0x77f6e714L, 0xb57376f7L,
|
||||
0x9b52010eL, 0xe26904d2L, 0xbdecd4bbL, 0x7f88089dL,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 672*/
|
||||
0xb22d3d36L, 0xfda02144L, 0xc1441d4aL, 0x70e8ef8fL,
|
||||
0xcbf9fd0fL, 0xbf297433L, 0x757b1657L, 0x5c7e011dL,
|
||||
0xec5aa0d3L, 0xacd6d45dL, 0x9454136aL, 0xc3f661fdL,
|
||||
0x5c893758L, 0xd3c9e4dfL, 0xa1136f99L, 0x16b20992L,
|
||||
0xfb67f92fL, 0x57e63f34L, 0xdfd1b224L, 0x639a43c4L,
|
||||
0x86c4ccf5L,
|
||||
#endif
|
||||
/* dss_g length = 704*/
|
||||
0x83131621L, 0xcb3b216eL, 0xa11bde00L, 0xd5d4f27fL,
|
||||
0xc8706d2eL, 0x2e211c47L, 0x1db6780bL, 0xe5c68adfL,
|
||||
0x7dba837dL, 0x28b59c8cL, 0xf3fad309L, 0xe37f6c65L,
|
||||
0x26016a1eL, 0x56aabb92L, 0x9db19c0eL, 0x642bb782L,
|
||||
0xb9fb6cc9L, 0x97b96a3cL, 0xd8a2f1a8L, 0xcb93fe6bL,
|
||||
0x32a459eeL, 0x58ad0aa1L,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 736*/
|
||||
0xa15c648cL, 0x813727b2L, 0x0e81efb3L, 0xabe0258eL,
|
||||
0x6c679f2fL, 0xd201bed6L, 0xbe9a3647L, 0xba9a0091L,
|
||||
0xdc8c4df1L, 0x5a375b15L, 0x50f8b5b1L, 0x081bdfe6L,
|
||||
0xd40b48d7L, 0x04177c51L, 0x256597c7L, 0x89b2f960L,
|
||||
0x7aaca1f0L, 0x20feed6fL, 0x0eee1d98L, 0xb06248b8L,
|
||||
0xa3f370e7L, 0x9183be3fL, 0x6cbc76aeL,
|
||||
#endif
|
||||
/* dss_g length = 768*/
|
||||
0x4b906216L, 0x7ab6c254L, 0xf90f7a04L, 0x58c742ddL,
|
||||
0x904dd015L, 0x624afbf7L, 0x627f5010L, 0x1a32696cL,
|
||||
0xcdfde0bcL, 0xb081e32fL, 0x19131377L, 0x86c65f96L,
|
||||
0x8429864aL, 0xd0c64bb9L, 0xbc7d3361L, 0xa3b2bd8dL,
|
||||
0x508647d5L, 0x3bb6ed0bL, 0x6f2cdba6L, 0x434b707aL,
|
||||
0x7b10d4ccL, 0x34668ef0L, 0x8f274737L, 0x37163399L,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 800*/
|
||||
0xa90c99a7L, 0xba50df8eL, 0x7ea083b5L, 0xe5bb1d8aL,
|
||||
0x8c4d34c9L, 0x3abab151L, 0x76c8ee2fL, 0x3db9eebfL,
|
||||
0x2b9ac1e0L, 0xb476774fL, 0x53b59b93L, 0xed2cc008L,
|
||||
0x8af40ad4L, 0x0e98c0e6L, 0xdb372d7bL, 0x8a317b59L,
|
||||
0x12250667L, 0x0355b882L, 0xf07958baL, 0x803380d7L,
|
||||
0xf9cd54bcL, 0xc70a461eL, 0x1dba9170L, 0xd3e5c447L,
|
||||
0x04c4af18L,
|
||||
#endif
|
||||
/* dss_g length = 832*/
|
||||
0x3d20d1b5L, 0xa0b6fbdbL, 0x4e880505L, 0x7c65a781L,
|
||||
0x5b6ed381L, 0xbb71fd1eL, 0x855de085L, 0x650a6d0bL,
|
||||
0x82d0a248L, 0x7ea0d4ddL, 0x693716d1L, 0x2dec2cc2L,
|
||||
0x97b45e07L, 0xcf210c5aL, 0x9b960299L, 0xc7324acfL,
|
||||
0xeefbfbcfL, 0x40bb0032L, 0xeacbc86eL, 0x8adbae2bL,
|
||||
0xbb4739aaL, 0xfd36af3aL, 0x97fcf859L, 0x0d3d5535L,
|
||||
0x3f62627aL, 0x54901f90L,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 864*/
|
||||
0x8b52bf83L, 0x0808c2b1L, 0x6ccb4a3eL, 0xcfdd8aa8L,
|
||||
0x4948b046L, 0x9881cdf4L, 0x85b013d8L, 0x3786a22aL,
|
||||
0xcb8ae9dbL, 0x5e2789adL, 0x1fcbd925L, 0x4afd3855L,
|
||||
0x83be7f67L, 0xe061b092L, 0xf21f6703L, 0x4c6a403eL,
|
||||
0x536aa8bdL, 0xb25e89b6L, 0xd259e165L, 0xd7f3b765L,
|
||||
0xd8bcc474L, 0x1a0a617dL, 0x8c28a054L, 0x95959fb0L,
|
||||
0x62546f2dL, 0xb450e1c2L, 0x277fef81L,
|
||||
#endif
|
||||
/* dss_g length = 896*/
|
||||
0x2aea7490L, 0xa3ccd005L, 0x235a9211L, 0xacec7b6dL,
|
||||
0x5407fca5L, 0x5bc18515L, 0x93888b2aL, 0xed568ff9L,
|
||||
0xf31ef4e9L, 0x172a7e05L, 0x81656e2aL, 0x975b7a24L,
|
||||
0xd4d11f6eL, 0xd6ff8232L, 0x40722363L, 0xd18ba1f1L,
|
||||
0xb032e574L, 0x81b6c330L, 0x07d56033L, 0xb7cc5107L,
|
||||
0xbd8e2c10L, 0xe731c6a3L, 0xe567fcd6L, 0xbcde3440L,
|
||||
0xdbb31976L, 0x4e39d15aL, 0x4b0bc282L, 0x286b82b3L,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 928*/
|
||||
0xd0e59f66L, 0xe875d7d2L, 0x2dca0707L, 0x266da5a2L,
|
||||
0x6d2080c2L, 0x759c69b3L, 0x74b4497fL, 0x4b630f56L,
|
||||
0x4995a294L, 0xf5c43edaL, 0x3a3d7951L, 0x617f22e9L,
|
||||
0xd45d1906L, 0x2726047fL, 0x660e27beL, 0xa588c1d3L,
|
||||
0xe300ceb2L, 0x8620ca06L, 0x76ae1110L, 0xe368f7b8L,
|
||||
0x2ded89a7L, 0x3ed62756L, 0x4bd85449L, 0xb406b73dL,
|
||||
0x32f725ecL, 0x6623989cL, 0xf7f06b1fL, 0x09544807L,
|
||||
0x97d051e6L,
|
||||
#endif
|
||||
/* dss_g length = 960*/
|
||||
0xe87c4118L, 0x1287809aL, 0x51d62a0fL, 0xdad87fc8L,
|
||||
0xddce8dc6L, 0x898ad27cL, 0xaee196a9L, 0xd322e44cL,
|
||||
0x3a349d58L, 0x322acebdL, 0x9c215b48L, 0x2d776d04L,
|
||||
0x512341f1L, 0x2192aa5fL, 0x5cac8175L, 0xdc08f547L,
|
||||
0x4f11b0d9L, 0xb5bf85c9L, 0x9fbf7147L, 0x7f7a3c20L,
|
||||
0xa163dd8aL, 0xfcb20ae4L, 0x81628251L, 0x84f9b96eL,
|
||||
0x94bad652L, 0x9559bb90L, 0x6418ac51L, 0x4739db54L,
|
||||
0x9b7c3ec0L, 0x3e14ae96L,
|
||||
#ifdef LENGTH_MULT_TO_32
|
||||
/* dss_g length = 992*/
|
||||
0x399a4effL, 0x1e5a5da9L, 0x4bad9040L, 0x5b9ac85dL,
|
||||
0x5464825bL, 0xe2ea7538L, 0x5defb957L, 0x4916bfa6L,
|
||||
0x93fe89beL, 0x919fe5daL, 0xe7a8791cL, 0xc186ef86L,
|
||||
0xa881bf63L, 0x9abe1e38L, 0x70b48b58L, 0x07199dfdL,
|
||||
0xc60a85e5L, 0xe07dab36L, 0xd6fe0c49L, 0x6619fdb4L,
|
||||
0x997ee55dL, 0x824f5f38L, 0xf80047ffL, 0x839db137L,
|
||||
0xe0db2daeL, 0x2f582a74L, 0x1bab6fb3L, 0x0e0262edL,
|
||||
0xd7f1bef2L, 0xa9aee566L, 0x6357bc35L,
|
||||
#endif
|
||||
/* dss_g length = 1024*/
|
||||
0x76b2914dL, 0x9cf7fee4L, 0x07a1a136L, 0x18573808L,
|
||||
0x870c8f96L, 0x59f21f3cL, 0x4d4d6f01L, 0xafc6580eL,
|
||||
0xff1b99afL, 0x6c1fc019L, 0x1698e449L, 0x0aa24787L,
|
||||
0x768d6e68L, 0x27dc5ff0L, 0x630fca9eL, 0x998101aeL,
|
||||
0xf278688dL, 0x17ad7f3dL, 0x65d648aaL, 0x1802181fL,
|
||||
0x9ef5647cL, 0x58437081L, 0x93641f0dL, 0x6330ebe9L,
|
||||
0x5d2a033aL, 0x5639b68aL, 0xd77efa7cL, 0x4a624bdcL,
|
||||
0xfed55c6dL, 0x5effa8aaL, 0xae4a1138L, 0x3a73e993L
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /*INITIALIZ_PQG*/
|
||||
|
||||
#endif /*DSSNUMBER_H*/
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
void RShiftL_big(ord *X, u_int32_t len_X, u_int32_t n_bit);
|
||||
void LShiftL_big(ord *X, u_int32_t len_X, u_int32_t n_bit);
|
||||
int RShiftMostBit(ord *a, u_int32_t len);
|
||||
void ByteLong(uchar *X, u_int32_t X_bytes, u_int32_t *Y);
|
||||
void ByteOrd(uchar *X, u_int32_t X_bytes, ord *Y);
|
||||
void OrdByte(ord *X, u_int32_t X_bytes, uchar *Y);
|
||||
void LongByte(u_int32_t *X, u_int32_t X_bytes, uchar *Y);
|
||||
|
|
@ -1,158 +0,0 @@
|
|||
#ifndef KLUDGE_H
|
||||
#define KLUDGE_H
|
||||
|
||||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Kludges for not-quite-ANSI systems.
|
||||
* This should always be the last file included, because it may
|
||||
* mess up some system header files.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Some compilers complain about #if FOO if FOO isn't defined,
|
||||
* so do the ANSI-mandated thing explicitly...
|
||||
*/
|
||||
#ifndef ASSERT_NEEDS_STDIO
|
||||
#define ASSERT_NEEDS_STDIO 0
|
||||
#endif
|
||||
#ifndef ASSERT_NEEDS_STDLIB
|
||||
#define ASSERT_NEEDS_STDLIB 0
|
||||
#endif
|
||||
#ifndef NO_STDLIB_H
|
||||
#define NO_STDLIB_H 0
|
||||
#endif
|
||||
|
||||
/* SunOS 4.1.x <assert.h> needs "stderr" defined, and "exit" declared... */
|
||||
#ifdef assert
|
||||
#if ASSERT_NEEDS_STDIO
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
#if ASSERT_NEEDS_STDLIB
|
||||
#if !NO_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef NO_MEMMOVE
|
||||
#define NO_MEMMOVE 0
|
||||
#endif
|
||||
#if NO_MEMMOVE /* memove() not in libraries */
|
||||
#define memmove(dest,src,len) bcopy(src,dest,len)
|
||||
#endif
|
||||
|
||||
#ifndef NO_MEMCPY
|
||||
#define NO_MEMCPY 0
|
||||
#endif
|
||||
#if NO_MEMCPY /* memcpy() not in libraries */
|
||||
#define memcpy(dest,src,len) bcopy(src,dest,len)
|
||||
#endif
|
||||
|
||||
#ifndef MEM_PROTOS_BROKEN
|
||||
#define MEM_PROTOS_BROKEN 0
|
||||
#endif
|
||||
#if MEM_PROTOS_BROKEN
|
||||
#define memcpy(d,s,l) memcpy((void *)(d), (void const *)(s), l)
|
||||
#define memmove(d,s,l) memmove((void *)(d), (void const *)(s), l)
|
||||
#define memcmp(d,s,l) memcmp((void const *)(d), (void const *)(s), l)
|
||||
#define memset(d,v,l) memset((void *)(d), v, l)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If there are no prototypes for the stdio functions, use these to
|
||||
* reduce compiler warnings. Uses EOF as a giveaway to indicate
|
||||
* that <stdio.h> was #included.
|
||||
*/
|
||||
#ifndef NO_STDIO_PROTOS
|
||||
#define NO_STDIO_PROTOS 0
|
||||
#endif
|
||||
#if NO_STDIO_PROTOS /* Missing prototypes for "simple" functions */
|
||||
#ifdef EOF
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
int (puts)(char const *);
|
||||
int (fputs)(char const *, FILE *);
|
||||
int (fflush)(FILE *);
|
||||
int (printf)(char const *, ...);
|
||||
int (fprintf)(FILE *, char const *, ...);
|
||||
/* If we have a sufficiently old-fashioned stdio, it probably uses these... */
|
||||
int (_flsbuf)(int, FILE *);
|
||||
int (_filbuf)(FILE *);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* EOF */
|
||||
#endif /* NO_STDIO_PROTOS */
|
||||
|
||||
/*
|
||||
* Borland C seems to think that it's a bad idea to decleare a
|
||||
* structure tag and not declare the contents. I happen to think
|
||||
* it's a *good* idea to use such "opaque" structures wherever
|
||||
* possible. So shut up.
|
||||
*/
|
||||
#ifdef __BORLANDC__
|
||||
#pragma warn -stu
|
||||
#ifndef MSDOS
|
||||
#define MSDOS 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Turn off warning about negation of unsigned values */
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable:4146)
|
||||
#endif
|
||||
|
||||
/* Cope with people forgetting to define the OS, if possible... */
|
||||
|
||||
#ifndef MSDOS
|
||||
#ifdef __MSDOS
|
||||
#define MSDOS 1
|
||||
#endif
|
||||
#endif
|
||||
#ifndef MSDOS
|
||||
#ifdef __MSDOS__
|
||||
#define MSDOS 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* KLUDGE_H */
|
||||
|
|
@ -1,186 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* lbn.h - Low-level bignum header.
|
||||
* Defines various word sizes and useful macros.
|
||||
*
|
||||
* Copyright (c) 1995 Colin Plumb. All rights reserved.
|
||||
* For licensing and other legal details, see the file legal.c.
|
||||
*/
|
||||
#ifndef LBN_H
|
||||
#define LBN_H
|
||||
|
||||
#ifndef HAVE_CONFIG_H
|
||||
#define HAVE_CONFIG_H 0
|
||||
#endif
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Some compilers complain about #if FOO if FOO isn't defined,
|
||||
* so do the ANSI-mandated thing explicitly...
|
||||
*/
|
||||
#ifndef NO_LIMITS_H
|
||||
#define NO_LIMITS_H 0
|
||||
#endif
|
||||
|
||||
/* Make sure we have 8-bit bytes */
|
||||
#if !NO_LIMITS_H
|
||||
#include <limits.h>
|
||||
#if UCHAR_MAX != 0xff || CHAR_BIT != 8
|
||||
#error The bignum library requires 8-bit unsigned characters.
|
||||
#endif
|
||||
#endif /* !NO_LIMITS_H */
|
||||
|
||||
#ifdef BNINCLUDE /* If this is defined as, say, foo.h */
|
||||
#define STR(x) #x /* STR(BNINCLUDE) -> "BNINCLUDE" */
|
||||
#define XSTR(x) STR(x) /* XSTR(BNINCLUDE) -> STR(foo.h) -> "foo.h" */
|
||||
#include XSTR(BNINCLUDE) /* #include "foo.h" */
|
||||
#undef XSTR
|
||||
#undef STR
|
||||
#endif
|
||||
|
||||
/* Figure out the endianness */
|
||||
/* Error if more than one is defined */
|
||||
#if BN_BIG_ENDIAN && BN_LITTLE_ENDIAN
|
||||
#error Only one of BN_BIG_ENDIAN or BN_LITTLE_ENDIAN may be defined
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If no preference is stated, little-endian C code is slightly more
|
||||
* efficient, so prefer that. (The endianness here does NOT have to
|
||||
* match the machine's native byte sex; the library's C code will work
|
||||
* either way. The flexibility is allowed for assembly routines
|
||||
* that do care.
|
||||
*/
|
||||
#if !defined(BN_BIG_ENDIAN) && !defined(BN_LITTLE_ENDIAN)
|
||||
#define BN_LITTLE_ENDIAN 1
|
||||
#endif /* !BN_BIG_ENDIAN && !BN_LITTLE_ENDIAN */
|
||||
|
||||
/* Macros to choose between big and little endian */
|
||||
#if BN_BIG_ENDIAN
|
||||
#define BIG(b) b
|
||||
#define LITTLE(l) /*nothing*/
|
||||
#define BIGLITTLE(b,l) b
|
||||
#elif BN_LITTLE_ENDIAN
|
||||
#define BIG(b) /*nothing*/
|
||||
#define LITTLE(l) l
|
||||
#define BIGLITTLE(b,l) l
|
||||
#else
|
||||
#error One of BN_BIG_ENDIAN or BN_LITTLE_ENDIAN must be defined as 1
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Find a 16-bit unsigned type.
|
||||
* Unsigned short is preferred over unsigned int to make the type chosen
|
||||
* by this file more stable on platforms (such as many 68000 compilers)
|
||||
* which support both 16- and 32-bit ints.
|
||||
*/
|
||||
#ifndef BNWORD16
|
||||
#ifndef USHRT_MAX /* No <limits.h> available - guess */
|
||||
typedef unsigned short bnword16;
|
||||
#define BNWORD16 bnword16
|
||||
#elif USHRT_MAX == 0xffff
|
||||
typedef unsigned short bnword16;
|
||||
#define BNWORD16 bnword16
|
||||
#elif UINT_MAX == 0xffff
|
||||
typedef unsigned bnword16;
|
||||
#define BNWORD16 bnword16
|
||||
#endif
|
||||
#endif /* BNWORD16 */
|
||||
|
||||
/*
|
||||
* Find a 32-bit unsigned type.
|
||||
* Unsigned long is preferred over unsigned int to make the type chosen
|
||||
* by this file more stable on platforms (such as many 68000 compilers)
|
||||
* which support both 16- and 32-bit ints.
|
||||
*/
|
||||
#ifndef BNWORD32
|
||||
#ifndef ULONG_MAX /* No <limits.h> available - guess */
|
||||
typedef unsigned long bnword32;
|
||||
#define BNWORD32 bnword32
|
||||
#elif ULONG_MAX == 0xfffffffful
|
||||
typedef unsigned long bnword32;
|
||||
#define BNWORD32 bnword32
|
||||
#elif UINT_MAX == 0xffffffff
|
||||
typedef unsigned bnword32;
|
||||
#define BNWORD32 bnword32
|
||||
#elif USHRT_MAX == 0xffffffff
|
||||
typedef unsigned short bnword32;
|
||||
#define BNWORD32 bnword32
|
||||
#endif
|
||||
#endif /* BNWORD16 */
|
||||
|
||||
/*
|
||||
* Find a 64-bit unsigned type.
|
||||
* The conditions here are more complicated to avoid using numbers that
|
||||
* will choke lesser preprocessors (like 0xffffffffffffffff) unless
|
||||
* we're reasonably certain that they'll be acceptable.
|
||||
*/
|
||||
#if !defined(BNWORD64) && ULONG_MAX > 0xfffffffful
|
||||
#if ULONG_MAX == 0xffffffffffffffff
|
||||
typedef unsigned long bnword64;
|
||||
#define BNWORD64 bnword64
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* I would test the value of unsigned long long, but some *preprocessors*
|
||||
* don't constants that long even if the compiler can accept them, so it
|
||||
* doesn't work reliably. So cross our fingers and hope that it's a 64-bit
|
||||
* type.
|
||||
*
|
||||
* GCC uses ULONG_LONG_MAX. Solaris uses ULLONG_MAX. IRIX uses ULONGLONG_MAX.
|
||||
* Are there any other names for this?
|
||||
*/
|
||||
#if !defined(BNWORD64) && \
|
||||
(defined(ULONG_LONG_MAX) || defined (ULLONG_MAX) || defined(ULONGLONG_MAX))
|
||||
typedef unsigned long long bnword64;
|
||||
#define BNWORD64 bnword64
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* We don't even try to find a 128-bit type at the moment */
|
||||
|
||||
#endif /* !LBN_H */
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* lbn00.c - auto-size-detecting lbn??.c file.
|
||||
*
|
||||
* Written in 1995 by Colin Plumb.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "bnsize00.h"
|
||||
|
||||
#if BNSIZE64
|
||||
|
||||
/* Include all of the C source file by reference */
|
||||
#include "lbn64.c"
|
||||
|
||||
#elif BNSIZE32
|
||||
|
||||
/* Include all of the C source file by reference */
|
||||
#include "lbn32.c"
|
||||
|
||||
#else /* BNSIZE16 */
|
||||
|
||||
/* Include all of the C source file by reference */
|
||||
#include "lbn16.c"
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,181 +0,0 @@
|
|||
#ifndef LBN16_H
|
||||
#define LBN16_H
|
||||
|
||||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
#include "lbn.h"
|
||||
|
||||
#ifndef BNWORD16
|
||||
#error 16-bit bignum library requires a 16-bit data type
|
||||
#endif
|
||||
|
||||
#ifndef lbnCopy_16
|
||||
void lbnCopy_16(BNWORD16 *dest, BNWORD16 const *src, unsigned len);
|
||||
#endif
|
||||
#ifndef lbnZero_16
|
||||
void lbnZero_16(BNWORD16 *num, unsigned len);
|
||||
#endif
|
||||
#ifndef lbnNeg_16
|
||||
void lbnNeg_16(BNWORD16 *num, unsigned len);
|
||||
#endif
|
||||
|
||||
#ifndef lbnAdd1_16
|
||||
BNWORD16 lbnAdd1_16(BNWORD16 *num, unsigned len, BNWORD16 carry);
|
||||
#endif
|
||||
#ifndef lbnSub1_16
|
||||
BNWORD16 lbnSub1_16(BNWORD16 *num, unsigned len, BNWORD16 borrow);
|
||||
#endif
|
||||
|
||||
#ifndef lbnAddN_16
|
||||
BNWORD16 lbnAddN_16(BNWORD16 *num1, BNWORD16 const *num2, unsigned len);
|
||||
#endif
|
||||
#ifndef lbnSubN_16
|
||||
BNWORD16 lbnSubN_16(BNWORD16 *num1, BNWORD16 const *num2, unsigned len);
|
||||
#endif
|
||||
|
||||
#ifndef lbnCmp_16
|
||||
int lbnCmp_16(BNWORD16 const *num1, BNWORD16 const *num2, unsigned len);
|
||||
#endif
|
||||
|
||||
#ifndef lbnMulN1_16
|
||||
void lbnMulN1_16(BNWORD16 *out, BNWORD16 const *in, unsigned len, BNWORD16 k);
|
||||
#endif
|
||||
#ifndef lbnMulAdd1_16
|
||||
BNWORD16
|
||||
lbnMulAdd1_16(BNWORD16 *out, BNWORD16 const *in, unsigned len, BNWORD16 k);
|
||||
#endif
|
||||
#ifndef lbnMulSub1_16
|
||||
BNWORD16 lbnMulSub1_16(BNWORD16 *out, BNWORD16 const *in, unsigned len, BNWORD16 k);
|
||||
#endif
|
||||
|
||||
#ifndef lbnLshift_16
|
||||
BNWORD16 lbnLshift_16(BNWORD16 *num, unsigned len, unsigned shift);
|
||||
#endif
|
||||
#ifndef lbnDouble_16
|
||||
BNWORD16 lbnDouble_16(BNWORD16 *num, unsigned len);
|
||||
#endif
|
||||
#ifndef lbnRshift_16
|
||||
BNWORD16 lbnRshift_16(BNWORD16 *num, unsigned len, unsigned shift);
|
||||
#endif
|
||||
|
||||
#ifndef lbnMul_16
|
||||
void lbnMul_16(BNWORD16 *prod, BNWORD16 const *num1, unsigned len1,
|
||||
BNWORD16 const *num2, unsigned len2);
|
||||
#endif
|
||||
#ifndef lbnSquare_16
|
||||
void lbnSquare_16(BNWORD16 *prod, BNWORD16 const *num, unsigned len);
|
||||
#endif
|
||||
|
||||
#ifndef lbnNorm_16
|
||||
unsigned lbnNorm_16(BNWORD16 const *num, unsigned len);
|
||||
#endif
|
||||
#ifndef lbnBits_16
|
||||
unsigned lbnBits_16(BNWORD16 const *num, unsigned len);
|
||||
#endif
|
||||
|
||||
#ifndef lbnExtractBigBytes_16
|
||||
void lbnExtractBigBytes_16(BNWORD16 const *bn, unsigned char *buf,
|
||||
unsigned lsbyte, unsigned buflen);
|
||||
#endif
|
||||
#ifndef lbnInsertBigytes_16
|
||||
void lbnInsertBigBytes_16(BNWORD16 *n, unsigned char const *buf,
|
||||
unsigned lsbyte, unsigned buflen);
|
||||
#endif
|
||||
#ifndef lbnExtractLittleBytes_16
|
||||
void lbnExtractLittleBytes_16(BNWORD16 const *bn, unsigned char *buf,
|
||||
unsigned lsbyte, unsigned buflen);
|
||||
#endif
|
||||
#ifndef lbnInsertLittleBytes_16
|
||||
void lbnInsertLittleBytes_16(BNWORD16 *n, unsigned char const *buf,
|
||||
unsigned lsbyte, unsigned buflen);
|
||||
#endif
|
||||
|
||||
#ifndef lbnDiv21_16
|
||||
BNWORD16 lbnDiv21_16(BNWORD16 *q, BNWORD16 nh, BNWORD16 nl, BNWORD16 d);
|
||||
#endif
|
||||
#ifndef lbnDiv1_16
|
||||
BNWORD16 lbnDiv1_16(BNWORD16 *q, BNWORD16 *rem,
|
||||
BNWORD16 const *n, unsigned len, BNWORD16 d);
|
||||
#endif
|
||||
#ifndef lbnModQ_16
|
||||
unsigned lbnModQ_16(BNWORD16 const *n, unsigned len, unsigned d);
|
||||
#endif
|
||||
#ifndef lbnDiv_16
|
||||
BNWORD16
|
||||
lbnDiv_16(BNWORD16 *q, BNWORD16 *n, unsigned nlen, BNWORD16 *d, unsigned dlen);
|
||||
#endif
|
||||
|
||||
#ifndef lbnMontInv1_16
|
||||
BNWORD16 lbnMontInv1_16(BNWORD16 const x);
|
||||
#endif
|
||||
#ifndef lbnMontReduce_16
|
||||
void lbnMontReduce_16(BNWORD16 *n, BNWORD16 const *mod, unsigned const mlen,
|
||||
BNWORD16 inv);
|
||||
#endif
|
||||
#ifndef lbnToMont_16
|
||||
void lbnToMont_16(BNWORD16 *n, unsigned nlen, BNWORD16 *mod, unsigned mlen);
|
||||
#endif
|
||||
#ifndef lbnFromMont_16
|
||||
void lbnFromMont_16(BNWORD16 *n, BNWORD16 *mod, unsigned len);
|
||||
#endif
|
||||
|
||||
#ifndef lbnExpMod_16
|
||||
int lbnExpMod_16(BNWORD16 *result, BNWORD16 const *n, unsigned nlen,
|
||||
BNWORD16 const *exp, unsigned elen, BNWORD16 *mod, unsigned mlen);
|
||||
#endif
|
||||
#ifndef lbnDoubleExpMod_16
|
||||
int lbnDoubleExpMod_16(BNWORD16 *result,
|
||||
BNWORD16 const *n1, unsigned n1len, BNWORD16 const *e1, unsigned e1len,
|
||||
BNWORD16 const *n2, unsigned n2len, BNWORD16 const *e2, unsigned e2len,
|
||||
BNWORD16 *mod, unsigned mlen);
|
||||
#endif
|
||||
#ifndef lbnTwoExpMod_16
|
||||
int lbnTwoExpMod_16(BNWORD16 *n, BNWORD16 const *exp, unsigned elen,
|
||||
BNWORD16 *mod, unsigned mlen);
|
||||
#endif
|
||||
#ifndef lbnGcd_16
|
||||
int lbnGcd_16(BNWORD16 *a, unsigned alen, BNWORD16 *b, unsigned blen);
|
||||
#endif
|
||||
#ifndef lbnInv_16
|
||||
int lbnInv_16(BNWORD16 *a, unsigned alen, BNWORD16 const *mod, unsigned mlen);
|
||||
#endif
|
||||
|
||||
#endif /* LBN16_H */
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,181 +0,0 @@
|
|||
#ifndef LBN32_H
|
||||
#define LBN32_H
|
||||
|
||||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
#include "lbn.h"
|
||||
|
||||
#ifndef BNWORD32
|
||||
#error 32-bit bignum library requires a 32-bit data type
|
||||
#endif
|
||||
|
||||
#ifndef lbnCopy_32
|
||||
void lbnCopy_32(BNWORD32 *dest, BNWORD32 const *src, unsigned len);
|
||||
#endif
|
||||
#ifndef lbnZero_32
|
||||
void lbnZero_32(BNWORD32 *num, unsigned len);
|
||||
#endif
|
||||
#ifndef lbnNeg_32
|
||||
void lbnNeg_32(BNWORD32 *num, unsigned len);
|
||||
#endif
|
||||
|
||||
#ifndef lbnAdd1_32
|
||||
BNWORD32 lbnAdd1_32(BNWORD32 *num, unsigned len, BNWORD32 carry);
|
||||
#endif
|
||||
#ifndef lbnSub1_32
|
||||
BNWORD32 lbnSub1_32(BNWORD32 *num, unsigned len, BNWORD32 borrow);
|
||||
#endif
|
||||
|
||||
#ifndef lbnAddN_32
|
||||
BNWORD32 lbnAddN_32(BNWORD32 *num1, BNWORD32 const *num2, unsigned len);
|
||||
#endif
|
||||
#ifndef lbnSubN_32
|
||||
BNWORD32 lbnSubN_32(BNWORD32 *num1, BNWORD32 const *num2, unsigned len);
|
||||
#endif
|
||||
|
||||
#ifndef lbnCmp_32
|
||||
int lbnCmp_32(BNWORD32 const *num1, BNWORD32 const *num2, unsigned len);
|
||||
#endif
|
||||
|
||||
#ifndef lbnMulN1_32
|
||||
void lbnMulN1_32(BNWORD32 *out, BNWORD32 const *in, unsigned len, BNWORD32 k);
|
||||
#endif
|
||||
#ifndef lbnMulAdd1_32
|
||||
BNWORD32
|
||||
lbnMulAdd1_32(BNWORD32 *out, BNWORD32 const *in, unsigned len, BNWORD32 k);
|
||||
#endif
|
||||
#ifndef lbnMulSub1_32
|
||||
BNWORD32 lbnMulSub1_32(BNWORD32 *out, BNWORD32 const *in, unsigned len, BNWORD32 k);
|
||||
#endif
|
||||
|
||||
#ifndef lbnLshift_32
|
||||
BNWORD32 lbnLshift_32(BNWORD32 *num, unsigned len, unsigned shift);
|
||||
#endif
|
||||
#ifndef lbnDouble_32
|
||||
BNWORD32 lbnDouble_32(BNWORD32 *num, unsigned len);
|
||||
#endif
|
||||
#ifndef lbnRshift_32
|
||||
BNWORD32 lbnRshift_32(BNWORD32 *num, unsigned len, unsigned shift);
|
||||
#endif
|
||||
|
||||
#ifndef lbnMul_32
|
||||
void lbnMul_32(BNWORD32 *prod, BNWORD32 const *num1, unsigned len1,
|
||||
BNWORD32 const *num2, unsigned len2);
|
||||
#endif
|
||||
#ifndef lbnSquare_32
|
||||
void lbnSquare_32(BNWORD32 *prod, BNWORD32 const *num, unsigned len);
|
||||
#endif
|
||||
|
||||
#ifndef lbnNorm_32
|
||||
unsigned lbnNorm_32(BNWORD32 const *num, unsigned len);
|
||||
#endif
|
||||
#ifndef lbnBits_32
|
||||
unsigned lbnBits_32(BNWORD32 const *num, unsigned len);
|
||||
#endif
|
||||
|
||||
#ifndef lbnExtractBigBytes_32
|
||||
void lbnExtractBigBytes_32(BNWORD32 const *bn, unsigned char *buf,
|
||||
unsigned lsbyte, unsigned buflen);
|
||||
#endif
|
||||
#ifndef lbnInsertBigytes_32
|
||||
void lbnInsertBigBytes_32(BNWORD32 *n, unsigned char const *buf,
|
||||
unsigned lsbyte, unsigned buflen);
|
||||
#endif
|
||||
#ifndef lbnExtractLittleBytes_32
|
||||
void lbnExtractLittleBytes_32(BNWORD32 const *bn, unsigned char *buf,
|
||||
unsigned lsbyte, unsigned buflen);
|
||||
#endif
|
||||
#ifndef lbnInsertLittleBytes_32
|
||||
void lbnInsertLittleBytes_32(BNWORD32 *n, unsigned char const *buf,
|
||||
unsigned lsbyte, unsigned buflen);
|
||||
#endif
|
||||
|
||||
#ifndef lbnDiv21_32
|
||||
BNWORD32 lbnDiv21_32(BNWORD32 *q, BNWORD32 nh, BNWORD32 nl, BNWORD32 d);
|
||||
#endif
|
||||
#ifndef lbnDiv1_32
|
||||
BNWORD32 lbnDiv1_32(BNWORD32 *q, BNWORD32 *rem,
|
||||
BNWORD32 const *n, unsigned len, BNWORD32 d);
|
||||
#endif
|
||||
#ifndef lbnModQ_32
|
||||
unsigned lbnModQ_32(BNWORD32 const *n, unsigned len, unsigned d);
|
||||
#endif
|
||||
#ifndef lbnDiv_32
|
||||
BNWORD32
|
||||
lbnDiv_32(BNWORD32 *q, BNWORD32 *n, unsigned nlen, BNWORD32 *d, unsigned dlen);
|
||||
#endif
|
||||
|
||||
#ifndef lbnMontInv1_32
|
||||
BNWORD32 lbnMontInv1_32(BNWORD32 const x);
|
||||
#endif
|
||||
#ifndef lbnMontReduce_32
|
||||
void lbnMontReduce_32(BNWORD32 *n, BNWORD32 const *mod, unsigned const mlen,
|
||||
BNWORD32 inv);
|
||||
#endif
|
||||
#ifndef lbnToMont_32
|
||||
void lbnToMont_32(BNWORD32 *n, unsigned nlen, BNWORD32 *mod, unsigned mlen);
|
||||
#endif
|
||||
#ifndef lbnFromMont_32
|
||||
void lbnFromMont_32(BNWORD32 *n, BNWORD32 *mod, unsigned len);
|
||||
#endif
|
||||
|
||||
#ifndef lbnExpMod_32
|
||||
int lbnExpMod_32(BNWORD32 *result, BNWORD32 const *n, unsigned nlen,
|
||||
BNWORD32 const *exp, unsigned elen, BNWORD32 *mod, unsigned mlen);
|
||||
#endif
|
||||
#ifndef lbnDoubleExpMod_32
|
||||
int lbnDoubleExpMod_32(BNWORD32 *result,
|
||||
BNWORD32 const *n1, unsigned n1len, BNWORD32 const *e1, unsigned e1len,
|
||||
BNWORD32 const *n2, unsigned n2len, BNWORD32 const *e2, unsigned e2len,
|
||||
BNWORD32 *mod, unsigned mlen);
|
||||
#endif
|
||||
#ifndef lbnTwoExpMod_32
|
||||
int lbnTwoExpMod_32(BNWORD32 *n, BNWORD32 const *exp, unsigned elen,
|
||||
BNWORD32 *mod, unsigned mlen);
|
||||
#endif
|
||||
#ifndef lbnGcd_32
|
||||
int lbnGcd_32(BNWORD32 *a, unsigned alen, BNWORD32 *b, unsigned blen);
|
||||
#endif
|
||||
#ifndef lbnInv_32
|
||||
int lbnInv_32(BNWORD32 *a, unsigned alen, BNWORD32 const *mod, unsigned mlen);
|
||||
#endif
|
||||
|
||||
#endif /* LBN32_H */
|
||||
|
|
@ -1,500 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* lbn68000.c - 16-bit bignum primitives for the 68000 (or 68010) processors.
|
||||
*
|
||||
* Copyright (c) 1995 Colin Plumb. All rights reserved.
|
||||
* For licensing and other legal details, see the file legal.c.
|
||||
*
|
||||
* This was written for Metrowerks C, and while it should be reasonably
|
||||
* portable, NOTE that Metrowerks lets a callee trash a0, a1, d0, d1, and d2.
|
||||
* Some 680x0 compilers make d2 callee-save, so instructions to save it
|
||||
* will have to be added.
|
||||
*
|
||||
* This code supports 16 or 32-bit ints, based on UINT_MAX.
|
||||
* Regardless of UINT_MAX, only bignums up to 64K words (1 million bits)
|
||||
* are supported. (68k hackers will recognize this as a consequence of
|
||||
* using dbra.)
|
||||
*
|
||||
* These primitives use little-endian word order.
|
||||
* (The order of bytes within words is irrelevant to this issue.)
|
||||
*/
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#include "lbn.h" /* Should include lbn68000.h */
|
||||
|
||||
/*
|
||||
* The Metrowerks C compiler (1.2.2) produces bad 68k code for the
|
||||
* following input, which happens to be the inner loop of lbnSub1,
|
||||
* so a few less than critical routines have been recoded in assembly
|
||||
* to avoid the bug. (Optimizer on or off does not matter.)
|
||||
*
|
||||
* unsigned
|
||||
* decrement(unsigned *num, unsigned len)
|
||||
* {
|
||||
* do {
|
||||
* if ((*num++)-- != 0)
|
||||
* return 0;
|
||||
* } while (--len);
|
||||
* return 1;
|
||||
* }
|
||||
*/
|
||||
asm BNWORD16
|
||||
lbnSub1_16(BNWORD16 *num, unsigned len, BNWORD16 borrow)
|
||||
{
|
||||
movea.l 4(sp),a0 /* num */
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 10(sp),d0 /* borrow */
|
||||
#else
|
||||
move.w 12(sp),d0 /* borrow */
|
||||
#endif
|
||||
sub.w d0,(a0)+
|
||||
bcc done
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 8(sp),d0 /* len */
|
||||
#else
|
||||
move.w 10(sp),d0 /* len */
|
||||
#endif
|
||||
subq.w #2,d0
|
||||
bcs done
|
||||
loop:
|
||||
subq.w #1,(a0)+
|
||||
dbcc d0,loop
|
||||
done:
|
||||
moveq.l #0,d0
|
||||
addx.w d0,d0
|
||||
rts
|
||||
}
|
||||
|
||||
asm BNWORD16
|
||||
lbnAdd1_16(BNWORD16 *num, unsigned len, BNWORD16 carry)
|
||||
{
|
||||
movea.l 4(sp),a0 /* num */
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 10(sp),d0 /* carry */
|
||||
#else
|
||||
move.w 12(sp),d0 /* carry */
|
||||
#endif
|
||||
add.w d0,(a0)+
|
||||
bcc done
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 8(sp),d0 /* len */
|
||||
#else
|
||||
move.w 10(sp),d0 /* len */
|
||||
#endif
|
||||
subq.w #2,d0
|
||||
bcs done
|
||||
loop:
|
||||
addq.w #1,(a0)+
|
||||
dbcc d0,loop
|
||||
done:
|
||||
moveq.l #0,d0
|
||||
addx.w d0,d0
|
||||
rts
|
||||
}
|
||||
|
||||
asm void
|
||||
lbnMulN1_16(BNWORD16 *out, BNWORD16 const *in, unsigned len, BNWORD16 k)
|
||||
{
|
||||
move.w d3,-(sp) /* 2 bytes of stack frame */
|
||||
move.l 2+4(sp),a1 /* out */
|
||||
move.l 2+8(sp),a0 /* in */
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 2+12(sp),d3 /* len */
|
||||
move.w 2+14(sp),d2 /* k */
|
||||
#else
|
||||
move.w 2+14(sp),d3 /* len (low 16 bits) */
|
||||
move.w 2+16(sp),d2 /* k */
|
||||
#endif
|
||||
|
||||
move.w (a0)+,d1 /* First multiply */
|
||||
mulu.w d2,d1
|
||||
move.w d1,(a1)+
|
||||
clr.w d1
|
||||
swap d1
|
||||
|
||||
subq.w #1,d3 /* Setup for loop unrolling */
|
||||
lsr.w #1,d3
|
||||
bcs.s m16_even
|
||||
beq.s m16_short
|
||||
|
||||
subq.w #1,d3 /* Set up software pipeline properly */
|
||||
move.l d1,d0
|
||||
|
||||
m16_loop:
|
||||
move.w (a0)+,d1
|
||||
mulu.w d2,d1
|
||||
add.l d0,d1
|
||||
move.w d1,(a1)+
|
||||
clr.w d1
|
||||
swap d1
|
||||
m16_even:
|
||||
|
||||
move.w (a0)+,d0
|
||||
mulu.w d2,d0
|
||||
add.l d1,d0
|
||||
move.w d0,(a1)+
|
||||
clr.w d0
|
||||
swap d0
|
||||
|
||||
dbra d3,m16_loop
|
||||
|
||||
move.w d0,(a1)
|
||||
move.w (sp)+,d3
|
||||
rts
|
||||
m16_short:
|
||||
move.w d1,(a1)
|
||||
move.w (sp)+,d3
|
||||
rts
|
||||
}
|
||||
|
||||
|
||||
asm BNWORD16
|
||||
lbnMulAdd1_16(BNWORD16 *out, BNWORD16 const *in, unsigned len, BNWORD16 k)
|
||||
{
|
||||
move.w d4,-(sp)
|
||||
clr.w d4
|
||||
move.w d3,-(sp) /* 4 bytes of stack frame */
|
||||
move.l 4+4(sp),a1 /* out */
|
||||
move.l 4+8(sp),a0 /* in */
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 4+12(sp),d3 /* len */
|
||||
move.w 4+14(sp),d2 /* k */
|
||||
#else
|
||||
move.w 4+14(sp),d3 /* len (low 16 bits) */
|
||||
move.w 4+16(sp),d2 /* k */
|
||||
#endif
|
||||
|
||||
move.w (a0)+,d1 /* First multiply */
|
||||
mulu.w d2,d1
|
||||
add.w d1,(a1)+
|
||||
clr.w d1
|
||||
swap d1
|
||||
addx.w d4,d1
|
||||
|
||||
subq.w #1,d3 /* Setup for loop unrolling */
|
||||
lsr.w #1,d3
|
||||
bcs.s ma16_even
|
||||
beq.s ma16_short
|
||||
|
||||
subq.w #1,d3 /* Set up software pipeline properly */
|
||||
move.l d1,d0
|
||||
|
||||
ma16_loop:
|
||||
move.w (a0)+,d1
|
||||
mulu.w d2,d1
|
||||
add.l d0,d1
|
||||
add.w d1,(a1)+
|
||||
clr.w d1
|
||||
swap d1
|
||||
addx.w d4,d1
|
||||
ma16_even:
|
||||
|
||||
move.w (a0)+,d0
|
||||
mulu.w d2,d0
|
||||
add.l d1,d0
|
||||
add.w d0,(a1)+
|
||||
clr.w d0
|
||||
swap d0
|
||||
addx.w d4,d0
|
||||
|
||||
dbra d3,ma16_loop
|
||||
|
||||
move.w (sp)+,d3
|
||||
move.w (sp)+,d4
|
||||
rts
|
||||
ma16_short:
|
||||
move.w (sp)+,d3
|
||||
move.l d1,d0
|
||||
move.w (sp)+,d4
|
||||
rts
|
||||
}
|
||||
|
||||
|
||||
|
||||
asm BNWORD16
|
||||
lbnMulSub1_16(BNWORD16 *out, BNWORD16 const *in, unsigned len, BNWORD16 k)
|
||||
{
|
||||
move.w d4,-(sp)
|
||||
clr.w d4
|
||||
move.w d3,-(sp) /* 4 bytes of stack frame */
|
||||
move.l 4+4(sp),a1 /* out */
|
||||
move.l 4+8(sp),a0 /* in */
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 4+12(sp),d3 /* len */
|
||||
move.w 4+14(sp),d2 /* k */
|
||||
#else
|
||||
move.w 4+14(sp),d3 /* len (low 16 bits) */
|
||||
move.w 4+16(sp),d2 /* k */
|
||||
#endif
|
||||
|
||||
move.w (a0)+,d1 /* First multiply */
|
||||
mulu.w d2,d1
|
||||
sub.w d1,(a1)+
|
||||
clr.w d1
|
||||
swap d1
|
||||
addx.w d4,d1
|
||||
|
||||
subq.w #1,d3 /* Setup for loop unrolling */
|
||||
lsr.w #1,d3
|
||||
bcs.s ms16_even
|
||||
beq.s ms16_short
|
||||
|
||||
subq.w #1,d3 /* Set up software pipeline properly */
|
||||
move.l d1,d0
|
||||
|
||||
ms16_loop:
|
||||
move.w (a0)+,d1
|
||||
mulu.w d2,d1
|
||||
add.l d0,d1
|
||||
sub.w d1,(a1)+
|
||||
clr.w d1
|
||||
swap d1
|
||||
addx.w d4,d1
|
||||
ms16_even:
|
||||
|
||||
move.w (a0)+,d0
|
||||
mulu.w d2,d0
|
||||
add.l d1,d0
|
||||
sub.w d0,(a1)+
|
||||
clr.w d0
|
||||
swap d0
|
||||
addx.w d4,d0
|
||||
|
||||
dbra d3,ms16_loop
|
||||
|
||||
move.w (sp)+,d3
|
||||
move.w (sp)+,d4
|
||||
rts
|
||||
ms16_short:
|
||||
move.w (sp)+,d3
|
||||
move.l d1,d0
|
||||
move.w (sp)+,d4
|
||||
rts
|
||||
}
|
||||
|
||||
/* The generic long/short divide doesn't know that nh < d */
|
||||
asm BNWORD16
|
||||
lbnDiv21_16(BNWORD16 *q, BNWORD16 nh, BNWORD16 nl, BNWORD16 d)
|
||||
{
|
||||
move.l 8(sp),d0 /* nh *and* nl */
|
||||
divu.w 12(sp),d0
|
||||
move.l 4(sp),a0
|
||||
move.w d0,(a0)
|
||||
clr.w d0
|
||||
swap d0
|
||||
rts
|
||||
}
|
||||
|
||||
asm unsigned
|
||||
lbnModQ_16(BNWORD16 const *n, unsigned len, BNWORD16 d)
|
||||
{
|
||||
move.l 4(sp),a0 /* n */
|
||||
moveq.l #0,d1
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 8(sp),d1 /* len */
|
||||
move.w 10(sp),d2 /* d */
|
||||
#else
|
||||
move.w 10(sp),d1 /* len (low 16 bits) */
|
||||
move.w 12(sp),d2 /* d */
|
||||
#endif
|
||||
|
||||
add.l d1,a0
|
||||
add.l d1,a0 /* n += len */
|
||||
moveq.l #0,d0
|
||||
subq.w #1,d1
|
||||
|
||||
mq16_loop:
|
||||
move.w -(a0),d0 /* Assemble remainder and new word */
|
||||
divu.w d2,d0 /* Put remainder in high half of d0 */
|
||||
dbra d1,mq16_loop
|
||||
|
||||
mq16_done:
|
||||
clr.w d0
|
||||
swap d0
|
||||
rts
|
||||
}
|
||||
|
||||
/*
|
||||
* Detect if this is a 32-bit processor (68020+ *or* CPU32).
|
||||
* Both the 68020+ and CPU32 processors (which have 32x32->64-bit
|
||||
* multiply, what the 32-bit math library wants) support scaled indexed
|
||||
* addressing. The 68000 and 68010 ignore the scale selection
|
||||
* bits, treating it as *1 all the time. So a 32-bit processor
|
||||
* will evaluate -2(a0,a0.w*2) as 1+1*2-2 = 1.
|
||||
* A 16-bit processor will compute 1+1-2 = 0.
|
||||
*
|
||||
* Thus, the return value will indicate whether the chip this is
|
||||
* running on supports 32x32->64-bit multiply (mulu.l).
|
||||
*/
|
||||
asm int
|
||||
is68020(void)
|
||||
{
|
||||
machine 68020
|
||||
lea 1,a0
|
||||
#if 0
|
||||
lea -2(a0,a0.w*2),a0 /* Metrowerks won't assemble this, arrgh */
|
||||
#else
|
||||
dc.w 0x41f0, 0x82fe
|
||||
#endif
|
||||
move.l a0,d0
|
||||
rts
|
||||
}
|
||||
/*
|
||||
* Since I had to hand-assemble that fancy addressing mode, I had to study
|
||||
* up on 680x0 addressing modes.
|
||||
* A summary of 680x0 addressing modes.
|
||||
* A 68000 effective address specifies an operand on an instruction, which
|
||||
* may be a register or in memory. It is made up of a 3-bit mode and a
|
||||
* 3-bit register specifier. The meanings of the various modes are:
|
||||
*
|
||||
* 000 reg - Dn, n specified by "reg"
|
||||
* 001 reg - An, n specified by "reg"
|
||||
* 010 reg - (An)
|
||||
* 011 reg - (An)+
|
||||
* 100 reg - -(An)
|
||||
* 101 reg - d16(An), one 16-bit displacement word follows, sign-extended
|
||||
* 110 reg - Fancy addressing mode off of An, see extension word below
|
||||
* 111 000 - abs.W, one 16-bit signed absolute address follows
|
||||
* 111 001 - abs.L, one 32-bit absolute address follows
|
||||
* 111 010 - d16(PC), one 16-bit displacemnt word follows, sign-extended
|
||||
* 111 011 - Fancy addressing mode off of PC, see extension word below
|
||||
* 111 100 - #immediate, followed by 16 or 32 bits of immediate value
|
||||
* 111 101 - unused, reserved
|
||||
* 111 110 - unused, reserved
|
||||
* 111 111 - unused, reserved
|
||||
*
|
||||
* Memory references are to data space, except that PC-relative references
|
||||
* are to program space, and are read-only.
|
||||
*
|
||||
* Fancy addressing modes are followed by a 16-bit extension word, and come
|
||||
* in "brief" and "full" forms.
|
||||
* The "brief" form looks like this. Bit 8 is 0 to indicate this form:
|
||||
*
|
||||
* 1 1 1 1 1 1 1
|
||||
* 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
||||
* +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
* |A/D| register |L/W| scale | 0 | 8-bit signed displacement |
|
||||
* +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
*
|
||||
* The basic effective address specifies a 32-bit base register - A0 through
|
||||
* A7 or PC (the address of the following instruction).
|
||||
* The A/D and register fields specify an index register. A/D is 1 for
|
||||
* address registers, and 0 for data registers. L/W specifies the length
|
||||
* of the index register, 1 for 32 bits, and 0 for 16 bits (sign-extended).
|
||||
* The scale field is a left shift amount (0 to 3 bits) to apply to the
|
||||
* sign-extended index register. The final address is d8(An,Rn.X*SCALE),
|
||||
* also written (d8,An,Rn.X*SCALE). X is "W" or "L", SCALE is 1, 2, 4 or 8.
|
||||
* "*1" may be omitted, as may a d8 of 0.
|
||||
*
|
||||
* The 68000 supports this form, but only with a scale field of 0.
|
||||
* It does NOT (says the MC68030 User's Manual MC68030UM/AD, section 2.7)
|
||||
* decode the scale field and the following format bit. They are treated
|
||||
* as 0.
|
||||
* I recall (I don't have the data book handy) that the CPU32 processor
|
||||
* core used in the 683xx series processors supports variable scales,
|
||||
* but only the brief extension word form. I suspect it decodes the
|
||||
* format bit and traps if it is not zero, but I don't recall.
|
||||
*
|
||||
* The "full" form (680x0, x >= 2 processors only) looks like this:
|
||||
*
|
||||
* 1 1 1 1 1 1 1
|
||||
* 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
||||
* +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
* |A/D| register |L/W| scale | 1 | BS| IS|BD size| 0 | P |OD size|
|
||||
* +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
*
|
||||
* The first 8 bits are interpreted the same way as in the brief form,
|
||||
* except that bit 8 is set to 1 to indicate the full form.
|
||||
* BS, Base Suppress, if set, causes a value of 0 to be used in place of
|
||||
* the base register value. If this is set, the base register
|
||||
* specified is irrelevant, except that if it is the PC, the fetch is
|
||||
* still done from program space. The specifier "ZPC" can be used in
|
||||
* place of "PC" in the effective address mnemonic to represent this
|
||||
* case.
|
||||
* IS, Index Suppress, if set, causes a value of 0 to be used in place
|
||||
* of the scaled index register. In this case, the first 7 bits of the
|
||||
* extension word are irrelevant.
|
||||
* BD size specifies the base displacement size. A value of 00
|
||||
* in this field is illegal, while 01, 10 and 11 indicate that the
|
||||
* extension word is followed by 0, 1 or 2 16-bit words of base displacement
|
||||
* (zero, sign-extended to 32 bits, and most-significant word first,
|
||||
* respectively) to add to the base register value.
|
||||
* Bit 3 is unused.
|
||||
* The P bit is the pre/post indexing bit, and only applies if an outer
|
||||
* displacement is used. This is explained later.
|
||||
* OD size specifies the size of an outer displacement. In the simple
|
||||
* case, this field is set to 00 and the effective address is
|
||||
* (disp,An,Rn.X*SCALE) or (disp,PC,Rn.X*SCALE).
|
||||
* In this case the P bit must be 0. Any of those compnents may be
|
||||
* suppressed, with a BD size of 01, the BS bit, or the IS bit.
|
||||
* If the OD size is not 00, it encodes an outer displacement in the same
|
||||
* manner as the BD size, and 0, 1 or 2 16-bit words of outer displacement
|
||||
* follow the base displacement in the instruction stream. In this case,
|
||||
* this is a double-indirect addressing mode. The base, base displacement,
|
||||
* and possibly the index, specify a 32-bit memory word which holds a value
|
||||
* which is fetched, and the outer displacement and possibly the index are
|
||||
* added to produce the address of the operand.
|
||||
* If the P bit is 0, this is pre-indexed, and the index value is added
|
||||
* before the fetch of the indirect word, producing an effective address
|
||||
* of ([disp,An,Rn.X*SCALE],disp). If the P bit is 1, the post-indexed case,
|
||||
* the memory word is fectched from base+base displacement, then the index
|
||||
* and outer displacement are added to compute the address of the operand.
|
||||
* This effective address is written ([disp,An],Rn.X*SCALE,disp).
|
||||
* (In both cases, "An" may also be "PC" or "ZPC".)
|
||||
* Any of the components may be omitted. If the index is omitted (using the
|
||||
* IS bit), the P bit is irrelevant, but must be written as 0.
|
||||
* Thus, legal combinations of IS, P and OD size are:
|
||||
* 0 0 00 - (disp,An,Rn.X*SCALE), also written disp(An,Rn.X*SCALE)
|
||||
* 0 0 01 - ([disp,An,Rn.X*SCALE])
|
||||
* 0 0 10 - ([disp,An,Rn.X*SCALE],d16)
|
||||
* 0 0 11 - ([disp,An,Rn.X*SCALE],d32)
|
||||
* 0 1 01 - ([disp,An],Rn.X*SCALE)
|
||||
* 0 1 10 - ([disp,An],Rn.X*SCALE,d16)
|
||||
* 0 1 11 - ([disp,An],Rn.X*SCALE,d32)
|
||||
* 1 0 00 - (disp,An), also written disp(An)
|
||||
* 1 0 01 - ([disp,An])
|
||||
* 1 0 10 - ([disp,An],d16)
|
||||
* 1 0 11 - ([disp,An],d32)
|
||||
*/
|
||||
|
||||
/* 45678901234567890123456789012345678901234567890123456789012345678901234567 */
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* lbn68000.h - 16-bit bignum primitives for the 68000 (or 68010) processors.
|
||||
*
|
||||
* These primitives use little-endian word order.
|
||||
* (The order of bytes within words is irrelevant.)
|
||||
*/
|
||||
#define BN_LITTLE_ENDIAN 1
|
||||
|
||||
typedef unsigned short bnword16
|
||||
#define BNWORD16 bnword16
|
||||
|
||||
bnword16 lbnSub1_16(bnword16 *num, unsigned len, bnword16 borrow);
|
||||
bnword16 lbnAdd1_16(bnword16 *num, unsigned len, bnword16 carry);
|
||||
void lbnMulN1_16(bnword16 *out, bnword16 const *in, unsigned len, bnword16 k);
|
||||
bnword16
|
||||
lbnMulAdd1_16(bnword16 *out, bnword16 const *in, unsigned len, bnword16 k);
|
||||
bnword16
|
||||
lbnMulSub1_16(bnword16 *out, bnword16 const *in, unsigned len, bnword16 k);
|
||||
bnword16 lbnDiv21_16(bnword16 *q, bnword16 nh, bnword16 nl, bnword16 d);
|
||||
unsigned lbnModQ_16(bnword16 const *n, unsigned len, bnword16 d);
|
||||
|
||||
int is68020(void);
|
||||
|
||||
/* #define the values to exclude the C versions */
|
||||
#define lbnSub1_16 lbnSub1_16
|
||||
#define lbnAdd1_16 lbnAdd1_16
|
||||
#define lbnMulN1_16 lbnMulN1_16
|
||||
#define lbnMulAdd1_16 lbnMulAdd1_16
|
||||
#define lbnMulSub1_16 lbnMulSub1_16
|
||||
#define lbnDiv21_16 lbnDiv21_16
|
||||
#define lbnModQ_16 lbnModQ_16
|
||||
|
||||
/* Also include the 68020 definitions for 16/32 bit switching versions. */
|
||||
#include <lbn68020.h>
|
||||
|
|
@ -1,349 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* lbn68020.c - 32-bit bignum primitives for the 68020+ (0r 683xx) processors.
|
||||
*
|
||||
* Copyright (c) 1995 Colin Plumb. All rights reserved.
|
||||
* For licensing and other legal details, see the file legal.c.
|
||||
*
|
||||
* This was written for Metrowerks C, and while it should be reasonably
|
||||
* portable, NOTE that Metrowerks lets a callee trash a0, a1, d0, d1, and d2.
|
||||
* Some 680x0 compilers make d2 callee-save, so instructions to save it
|
||||
* will have to be added.
|
||||
*
|
||||
* This code supports 16 or 32-bit ints, based on UINT_MAX.
|
||||
* Regardless of UINT_MAX, only bignums up to 64K words (2 million bits)
|
||||
* are supported. (68k hackers will recognize this as a consequence of
|
||||
* using dbra.)
|
||||
*
|
||||
* These primitives use little-endian word order.
|
||||
* (The order of bytes within words is irrelevant to this issue.)
|
||||
*
|
||||
* TODO: Schedule this for the 68040's pipeline. (When I get a 68040 manual.)
|
||||
*/
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#include "lbn.h" /* Should include lbn68020.h */
|
||||
|
||||
/*
|
||||
* The Metrowerks C compiler (1.2.2) produces bad 68k code for the
|
||||
* following input, which happens to be the inner loop of lbnSub1,
|
||||
* so a few less than critical routines have been recoded in assembly
|
||||
* to avoid the bug. (Optimizer on or off does not matter.)
|
||||
*
|
||||
* unsigned
|
||||
* decrement(unsigned *num, unsigned len)
|
||||
* {
|
||||
* do {
|
||||
* if ((*num++)-- != 0)
|
||||
* return 0;
|
||||
* } while (--len);
|
||||
* return 1;
|
||||
* }
|
||||
*/
|
||||
asm BNWORD32
|
||||
lbnSub1_32(BNWORD32 *num, unsigned len, BNWORD32 borrow)
|
||||
{
|
||||
movea.l 4(sp),a0 /* num */
|
||||
#if UINT_MAX == 0xffff
|
||||
move.l 10(sp),d0 /* borrow */
|
||||
#else
|
||||
move.l 12(sp),d0 /* borrow */
|
||||
#endif
|
||||
sub.l d0,(a0)+
|
||||
bcc done
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 8(sp),d0 /* len */
|
||||
#else
|
||||
move.w 10(sp),d0 /* len */
|
||||
#endif
|
||||
subq.w #2,d0
|
||||
bcs done
|
||||
loop:
|
||||
subq.l #1,(a0)+
|
||||
dbcc d0,loop
|
||||
done:
|
||||
moveq.l #0,d0
|
||||
addx.w d0,d0
|
||||
rts
|
||||
}
|
||||
|
||||
asm BNWORD32
|
||||
lbnAdd1_32(BNWORD32 *num, unsigned len, BNWORD32 carry)
|
||||
{
|
||||
movea.l 4(sp),a0 /* num */
|
||||
#if UINT_MAX == 0xffff
|
||||
move.l 10(sp),d0 /* carry */
|
||||
#else
|
||||
move.l 12(sp),d0 /* carry */
|
||||
#endif
|
||||
add.l d0,(a0)+
|
||||
bcc done
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 8(sp),d0 /* len */
|
||||
#else
|
||||
move.w 10(sp),d0 /* len */
|
||||
#endif
|
||||
subq.w #2,d0
|
||||
bcs done
|
||||
loop:
|
||||
addq.l #1,(a0)+
|
||||
dbcc d0,loop
|
||||
done:
|
||||
moveq.l #0,d0
|
||||
addx.w d0,d0
|
||||
rts
|
||||
}
|
||||
|
||||
asm void
|
||||
lbnMulN1_32(BNWORD32 *out, BNWORD32 const *in, unsigned len, BNWORD32 k)
|
||||
{
|
||||
machine 68020
|
||||
|
||||
movem.l d3-d5,-(sp) /* 12 bytes of extra data */
|
||||
moveq.l #0,d4
|
||||
move.l 16(sp),a1 /* out */
|
||||
move.l 20(sp),a0 /* in */
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 24(sp),d5 /* len */
|
||||
move.l 26(sp),d2 /* k */
|
||||
#else
|
||||
move.w 26(sp),d5 /* len */
|
||||
move.l 28(sp),d2 /* k */
|
||||
#endif
|
||||
|
||||
move.l (a0)+,d3 /* First multiply */
|
||||
mulu.l d2,d1:d3 /* dc.w 0x4c02, 0x3401 */
|
||||
move.l d3,(a1)+
|
||||
|
||||
subq.w #1,d5 /* Setup for loop unrolling */
|
||||
lsr.w #1,d5
|
||||
bcs.s m32_even
|
||||
beq.s m32_short
|
||||
|
||||
subq.w #1,d5 /* Set up software pipeline properly */
|
||||
move.l d1,d0
|
||||
|
||||
m32_loop:
|
||||
move.l (a0)+,d3
|
||||
mulu.l d2,d1:d3 /* dc.w 0x4c02, 0x3401 */
|
||||
add.l d0,d3
|
||||
addx.l d4,d1
|
||||
move.l d3,(a1)+
|
||||
m32_even:
|
||||
|
||||
move.l (a0)+,d3
|
||||
mulu.l d2,d0:d3 /* dc.w 0x4c02, 0x3400 */
|
||||
add.l d1,d3
|
||||
addx.l d4,d0
|
||||
move.l d3,(a1)+
|
||||
|
||||
dbra d5,m32_loop
|
||||
|
||||
move.l d0,(a1)
|
||||
movem.l (sp)+,d3-d5
|
||||
rts
|
||||
m32_short:
|
||||
move.l d1,(a1)
|
||||
movem.l (sp)+,d3-d5
|
||||
rts
|
||||
}
|
||||
|
||||
|
||||
asm BNWORD32
|
||||
lbnMulAdd1_32(BNWORD32 *out, BNWORD32 const *in, unsigned len, BNWORD32 k)
|
||||
{
|
||||
machine 68020
|
||||
movem.l d3-d5,-(sp) /* 12 bytes of extra data */
|
||||
moveq.l #0,d4
|
||||
move.l 16(sp),a1 /* out */
|
||||
move.l 20(sp),a0 /* in */
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 24(sp),d5 /* len */
|
||||
move.l 26(sp),d2 /* k */
|
||||
#else
|
||||
move.w 26(sp),d5 /* len */
|
||||
move.l 28(sp),d2 /* k */
|
||||
#endif
|
||||
|
||||
move.l (a0)+,d3 /* First multiply */
|
||||
mulu.l d2,d1:d3 /* dc.w 0x4c02, 0x3401 */
|
||||
add.l d3,(a1)+
|
||||
addx.l d4,d1
|
||||
|
||||
subq.w #1,d5 /* Setup for loop unrolling */
|
||||
lsr.w #1,d5
|
||||
bcs.s ma32_even
|
||||
beq.s ma32_short
|
||||
|
||||
subq.w #1,d5 /* Set up software pipeline properly */
|
||||
move.l d1,d0
|
||||
|
||||
ma32_loop:
|
||||
move.l (a0)+,d3
|
||||
mulu.l d2,d1:d3 /* dc.w 0x4c02, 0x3401 */
|
||||
add.l d0,d3
|
||||
addx.l d4,d1
|
||||
add.l d3,(a1)+
|
||||
addx.l d4,d1
|
||||
ma32_even:
|
||||
|
||||
move.l (a0)+,d3
|
||||
mulu.l d2,d0:d3 /* dc.w 0x4c02, 0x3400 */
|
||||
add.l d1,d3
|
||||
addx.l d4,d0
|
||||
add.l d3,(a1)+
|
||||
addx.l d4,d0
|
||||
|
||||
dbra d5,ma32_loop
|
||||
|
||||
movem.l (sp)+,d3-d5
|
||||
rts
|
||||
ma32_short:
|
||||
move.l d1,d0
|
||||
movem.l (sp)+,d3-d5
|
||||
rts
|
||||
}
|
||||
|
||||
|
||||
asm BNWORD32
|
||||
lbnMulSub1_32(BNWORD32 *out, BNWORD32 const *in, unsigned len, BNWORD32 k)
|
||||
{
|
||||
machine 68020
|
||||
movem.l d3-d5,-(sp) /* 12 bytes of extra data */
|
||||
moveq.l #0,d4
|
||||
move.l 16(sp),a1 /* out */
|
||||
move.l 20(sp),a0 /* in */
|
||||
#if UINT_MAX == 0xffff
|
||||
move.w 24(sp),d5 /* len */
|
||||
move.l 26(sp),d2 /* k */
|
||||
#else
|
||||
move.w 26(sp),d5 /* len */
|
||||
move.l 28(sp),d2 /* k */
|
||||
#endif
|
||||
|
||||
move.l (a0)+,d3 /* First multiply */
|
||||
mulu.l d2,d1:d3 /* dc.w 0x4c02, 0x3401 */
|
||||
sub.l d3,(a1)+
|
||||
addx.l d4,d1
|
||||
|
||||
subq.w #1,d5 /* Setup for loop unrolling */
|
||||
lsr.w #1,d5
|
||||
bcs.s ms32_even
|
||||
beq.s ms32_short
|
||||
|
||||
subq.w #1,d5 /* Set up software pipeline properly */
|
||||
move.l d1,d0
|
||||
|
||||
ms32_loop:
|
||||
move.l (a0)+,d3
|
||||
mulu.l d2,d1:d3 /* dc.w 0x4c02, 0x3401 */
|
||||
add.l d0,d3
|
||||
addx.l d4,d1
|
||||
sub.l d3,(a1)+
|
||||
addx.l d4,d1
|
||||
ms32_even:
|
||||
|
||||
move.l (a0)+,d3
|
||||
mulu.l d2,d0:d3 /* dc.w 0x4c02, 0x3400 */
|
||||
add.l d1,d3
|
||||
addx.l d4,d0
|
||||
sub.l d3,(a1)+
|
||||
addx.l d4,d0
|
||||
|
||||
dbra d5,ms32_loop
|
||||
|
||||
movem.l (sp)+,d3-d5
|
||||
rts
|
||||
|
||||
ms32_short:
|
||||
move.l d1,d0
|
||||
movem.l (sp)+,d3-d5
|
||||
rts
|
||||
}
|
||||
|
||||
|
||||
asm BNWORD32
|
||||
lbnDiv21_32(BNWORD32 *q, BNWORD32 nh, BNWORD32 nl, BNWORD32 d)
|
||||
{
|
||||
machine 68020
|
||||
move.l 8(sp),d0
|
||||
move.l 12(sp),d1
|
||||
move.l 4(sp),a0
|
||||
divu.l 16(sp),d0:d1 /* dc.w 0x4c6f, 0x1400, 16 */
|
||||
move.l d1,(a0)
|
||||
rts
|
||||
}
|
||||
|
||||
asm unsigned
|
||||
lbnModQ_32(BNWORD32 const *n, unsigned len, unsigned d)
|
||||
{
|
||||
machine 68020
|
||||
move.l 4(sp),a0 /* n */
|
||||
move.l d3,a1
|
||||
#if UINT_MAX == 0xffff
|
||||
moveq.l #0,d2
|
||||
move.w 8(sp),d1 /* len */
|
||||
move.w 10(sp),d2 /* d */
|
||||
#else
|
||||
move.w 10(sp),d1 /* len */
|
||||
move.l 12(sp),d2 /* d */
|
||||
#endif
|
||||
dc.w 0x41f0, 0x1cfc /* lea -4(a0,d1.L*4),a0 */
|
||||
|
||||
/* First time, divide 32/32 - may be faster than 64/32 */
|
||||
move.l (a0),d3
|
||||
divul.l d2,d0:d3 /* dc.w 0x4c02, 0x3000 */
|
||||
subq.w #2,d1
|
||||
bmi mq32_done
|
||||
|
||||
mq32_loop:
|
||||
move.l -(a0),d3
|
||||
divu.l d2,d0:d3 /* dc.w 0x4c02,0x3400 */
|
||||
dbra d1,mq32_loop
|
||||
|
||||
mq32_done:
|
||||
move.l a1,d3
|
||||
rts
|
||||
}
|
||||
|
||||
/* 45678901234567890123456789012345678901234567890123456789012345678901234567 */
|
||||
|
|
@ -1,69 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* lbn68020.h - 32-bit bignum primitives for the 68020 (or 683xx) processors.
|
||||
*
|
||||
* These primitives use little-endian word order.
|
||||
* (The order of bytes within words is irrelevant.)
|
||||
*/
|
||||
#define BN_LITTLE_ENDIAN 1
|
||||
|
||||
typedef unsigned long bnword32
|
||||
#define BNWORD32 bnword32
|
||||
|
||||
bnword32 lbnSub1_32(bnword32 *num, unsigned len, bnword32 borrow);
|
||||
bnword32 lbnAdd1_32(bnword32 *num, unsigned len, bnword32 carry);
|
||||
void lbnMulN1_32(bnword32 *out, bnword32 const *in, unsigned len, bnword32 k);
|
||||
bnword32
|
||||
lbnMulAdd1_32(bnword32 *out, bnword32 const *in, unsigned len, bnword32 k);
|
||||
bnword32
|
||||
lbnMulSub1_32(bnword32 *out, bnword32 const *in, unsigned len, bnword32 k);
|
||||
bnword32 lbnDiv21_32(bnword32 *q, bnword32 nh, bnword32 nl, bnword32 d);
|
||||
unsigned lbnModQ_32(bnword32 const *n, unsigned len, unsigned d);
|
||||
|
||||
/* #define the values to exclude the C versions */
|
||||
#define lbnSub1_32 lbnSub1_32
|
||||
#define lbnAdd1_32 lbnAdd1_32
|
||||
#define lbnMulN1_32 lbnMulN1_32
|
||||
#define lbnMulAdd1_32 lbnMulAdd1_32
|
||||
#define lbnMulSub1_32 lbnMulSub1_32
|
||||
#define lbnDiv21_32 lbnDiv21_32
|
||||
#define lbnModQ_32 lbnModQ_32
|
||||
|
|
@ -1,169 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* lbn80386.h - This file defines the interfaces to the 80386
|
||||
* assembly primitives. It is intended to be included in "lbn.h"
|
||||
* via the "#include BNINCLUDE" mechanism.
|
||||
*/
|
||||
|
||||
#define BN_LITTLE_ENDIAN 1
|
||||
|
||||
typedef unsigned long bnword32;
|
||||
#define BNWORD32 bnword32
|
||||
|
||||
/* MS-DOS needs the calling convention described to it. */
|
||||
#ifndef MSDOS
|
||||
#ifdef __MSDOS__
|
||||
#define MSDOS 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef MSDOS
|
||||
#define CDECL __cdecl
|
||||
#else
|
||||
#define CDECL /*nothing*/
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
/* These assembly-language primitives use C names */
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Function prototypes for the asm routines */
|
||||
void CDECL
|
||||
lbnMulN1_32(bnword32 *out, bnword32 const *in, unsigned len, bnword32 k);
|
||||
#define lbnMulN1_32 lbnMulN1_32
|
||||
|
||||
bnword32 CDECL
|
||||
lbnMulAdd1_32(bnword32 *out, bnword32 const *in, unsigned len, bnword32 k);
|
||||
#define lbnMulAdd1_32 lbnMulAdd1_32
|
||||
|
||||
bnword32 CDECL
|
||||
lbnMulSub1_32(bnword32 *out, bnword32 const *in, unsigned len, bnword32 k);
|
||||
#define lbnMulSub1_32 lbnMulSub1_32
|
||||
|
||||
bnword32 CDECL
|
||||
lbnDiv21_32(bnword32 *q, bnword32 nh, bnword32 nl, bnword32 d);
|
||||
#define lbnDiv21_32 lbnDiv21_32
|
||||
|
||||
unsigned CDECL
|
||||
lbnModQ_32(bnword32 const *n, unsigned len, bnword32 d);
|
||||
#define lbnModQ_32 lbnModQ_32
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if __GNUC__
|
||||
/*
|
||||
* Use the (massively cool) GNU inline-assembler extension to define
|
||||
* inline expansions for various operations.
|
||||
*
|
||||
* The massively cool part is that the assembler can have inputs
|
||||
* and outputs, and you specify the operands and which effective
|
||||
* addresses are legal and they get substituted into the code.
|
||||
* (For example, some of the code requires a zero. Rather than
|
||||
* specify an immediate constant, the expansion specifies an operand
|
||||
* of zero which can be in various places. This lets GCC use an
|
||||
* immediate zero, or a register which contains zero if it's available.)
|
||||
*
|
||||
* The syntax is asm("asm_code" : outputs : inputs : trashed)
|
||||
* %0, %1 and so on in the asm code are substituted by the operands
|
||||
* in left-to-right order (outputs, then inputs).
|
||||
* The operands contain constraint strings and values to use.
|
||||
* Outputs must be lvalues, inputs may be rvalues. In the constraints:
|
||||
* "a" means that the operand must be in eax.
|
||||
* "d" means that the operand must be in edx.
|
||||
* "g" means that the operand may be any effective address.
|
||||
* "=" means that the operand is assigned to.
|
||||
* "%" means that this operand and the following one may be
|
||||
* interchanged if desirable.
|
||||
* "bcDSmn" means that the operand must be in ebx, ecx, esi, edi, memory,
|
||||
* or an immediate constant. (This is almost the same as "g"
|
||||
* but allowing it in eax wouldn't help because x is already
|
||||
* assigned there, and it must not be in edx, since edx is
|
||||
* overwritten by the multiply before a and b are read.)
|
||||
*
|
||||
* Note that GCC uses AT&T assembler syntax, which is rather
|
||||
* different from Intel syntax. The length (b, w or l) of the
|
||||
* operation is appended to the opcode, and the *second* operand
|
||||
* is the destination, not the first. Finally, the register names
|
||||
* are all preceded with "%". (Doubled here because % is a
|
||||
* magic character.)
|
||||
*/
|
||||
|
||||
/* (ph<<32) + pl = x*y */
|
||||
#define mul32_ppmm(ph,pl,x,y) \
|
||||
__asm__("mull %3" : "=d"(ph), "=a"(pl) : "%a"(x), "g"(y))
|
||||
|
||||
/* (ph<<32) + pl = x*y + a */
|
||||
#define mul32_ppmma(ph,pl,x,y,a) \
|
||||
__asm__("mull %3\n\t" \
|
||||
"addl %4,%%eax\n\t" \
|
||||
"adcl %5,%%edx" \
|
||||
: "=&d"(ph), "=a"(pl) \
|
||||
: "%a"(x), "g"(y), "bcDSmn"(a), "bcDSmn"(0))
|
||||
|
||||
/* (ph<<32) + pl = x*y + a + b */
|
||||
#define mul32_ppmmaa(ph,pl,x,y,a,b) \
|
||||
__asm__("mull %3\n\t" \
|
||||
"addl %4,%%eax\n\t" \
|
||||
"adcl %6,%%edx\n\t" \
|
||||
"addl %5,%%eax\n\t" \
|
||||
"adcl %6,%%edx" \
|
||||
: "=&d"(ph), "=a"(pl) \
|
||||
: "%a"(x), "g"(y), "%bcDSmn"(a), "bcDSmn"(b), "bcDSmn"(0))
|
||||
|
||||
/* q = ((nh<<32) + nl) / d, return remainder. nh guaranteed < d. */
|
||||
#undef lbnDiv21_32
|
||||
#define lbnDiv21_32(q,nh,nl,d) \
|
||||
({unsigned _; \
|
||||
__asm__("divl %4" : "=d"(_), "=a"(*q) : "d"(nh), "a"(nl), "g"(d)); \
|
||||
_;})
|
||||
|
||||
/* No quotient, just return remainder ((nh<<32) + nl) % d */
|
||||
#define lbnMod21_32(nh,nl,d) \
|
||||
({unsigned _; \
|
||||
__asm__("divl %3" : "=d"(_) : "d"(nh), "a"(nl), "g"(d) : "ax"); \
|
||||
_;})
|
||||
|
||||
#endif /* __GNUC__ */
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* lbn8086.h - This file defines the interfaces to the 8086
|
||||
* assembly primitives for 16-bit MS-DOS environments.
|
||||
* It is intended to be included in "lbn.h"
|
||||
* via the "#include BNINCLUDE" mechanism.
|
||||
*/
|
||||
|
||||
#define BN_LITTLE_ENDIAN 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
/* These assembly-language primitives use C names */
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Set up the appropriate types */
|
||||
typedef unsigned short bnword16;
|
||||
#define BNWORD16 bnword16
|
||||
typedef unsigned long bnword32;
|
||||
#define BNWORD32 bnword32
|
||||
|
||||
void __cdecl __far
|
||||
lbnMulN1_16(bnword16 __far *out, bnword16 const __far *in,
|
||||
unsigned len, bnword16 k);
|
||||
#define lbnMulN1_16 lbnMulN1_16
|
||||
|
||||
bnword16 __cdecl __far
|
||||
lbnMulAdd1_16(bnword16 __far *out, bnword16 const __far *in,
|
||||
unsigned len, bnword16 k);
|
||||
#define lbnMulAdd1_16 lbnMulAdd1_16
|
||||
|
||||
bnword16 __cdecl __far
|
||||
lbnMulSub1_16(bnword16 __far *out, bnword16 const __far *in,
|
||||
unsigned len, bnword16 k);
|
||||
#define lbnMulSub1_16 lbnMulSub1_16
|
||||
|
||||
bnword16 __cdecl __far
|
||||
lbnDiv21_16(bnword16 __far *q, bnword16 nh, bnword16 nl, bnword16 d);
|
||||
#define lbnDiv21_16 lbnDiv21_16
|
||||
|
||||
bnword16 __cdecl __far
|
||||
lbnModQ_16(bnword16 const __far *n, unsigned len, bnword16 d);
|
||||
#define lbnModQ_16 lbnModQ_16
|
||||
|
||||
|
||||
|
||||
void __cdecl __far
|
||||
lbnMulN1_32(bnword32 __far *out, bnword32 const __far *in,
|
||||
unsigned len, bnword32 k);
|
||||
#define lbnMulN1_32 lbnMulN1_32
|
||||
|
||||
bnword32 __cdecl __far
|
||||
lbnMulAdd1_32(bnword32 __far *out, bnword32 const __far *in,
|
||||
unsigned len, bnword32 k);
|
||||
#define lbnMulAdd1_32 lbnMulAdd1_32
|
||||
|
||||
bnword32 __cdecl __far
|
||||
lbnMulSub1_32(bnword32 __far *out, bnword32 const __far *in,
|
||||
unsigned len, bnword32 k);
|
||||
#define lbnMulSub1_32 lbnMulSub1_32
|
||||
|
||||
bnword32 __cdecl __far
|
||||
lbnDiv21_32(bnword32 __far *q, bnword32 nh, bnword32 nl, bnword32 d);
|
||||
#define lbnDiv21_32 lbnDiv21_32
|
||||
|
||||
bnword16 __cdecl __far
|
||||
lbnModQ_32(bnword32 const __far *n, unsigned len, bnword32 d);
|
||||
#define lbnModQ_32 lbnModQ_32
|
||||
|
||||
int __cdecl __far not386(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
@ -1,195 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* lbnmem.c - low-level bignum memory handling.
|
||||
*
|
||||
* Copyright (c) 1995 Colin Plumb. All rights reserved.
|
||||
* For licensing and other legal details, see the file legal.c.
|
||||
*
|
||||
* Note that in all cases, the pointers passed around
|
||||
* are pointers to the *least* significant end of the word.
|
||||
* On big-endian machines, these are pointers to the *end*
|
||||
* of the allocated range.
|
||||
*
|
||||
* BNSECURE is a simple level of security; for more security
|
||||
* change these function to use locked unswappable memory.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
|
||||
#ifndef HAVE_CONFIG_H
|
||||
#define HAVE_CONFIG_H 0
|
||||
#endif
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Some compilers complain about #if FOO if FOO isn't defined,
|
||||
* so do the ANSI-mandated thing explicitly...
|
||||
*/
|
||||
#ifndef NO_STDLIB_H
|
||||
#define NO_STDLIB_H 0
|
||||
#endif
|
||||
#ifndef NO_STRING_H
|
||||
#define NO_STRING_H 0
|
||||
#endif
|
||||
#ifndef HAVE_STRINGS_H
|
||||
#define HAVE_STRINGS_H 0
|
||||
#endif
|
||||
#ifndef NEED_MEMORY_H
|
||||
#define NEED_MEMORY_H 0
|
||||
#endif
|
||||
|
||||
#if !NO_STDLIB_H
|
||||
#include <stdlib.h> /* For malloc() & co. */
|
||||
#else
|
||||
void *malloc();
|
||||
void *realloc();
|
||||
void free();
|
||||
#endif
|
||||
|
||||
#if !NO_STRING_H
|
||||
#include <string.h> /* For memset */
|
||||
#elif HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#if NEED_MEMORY_H
|
||||
#include <memory.h>
|
||||
#endif
|
||||
|
||||
#ifndef DBMALLOC
|
||||
#define DBMALLOC 0
|
||||
#endif
|
||||
#if DBMALLOC
|
||||
/* Development debugging */
|
||||
#include "../dbmalloc/malloc.h"
|
||||
#endif
|
||||
|
||||
#include "lbn.h"
|
||||
#include "lbnmem.h"
|
||||
|
||||
#include "kludge.h"
|
||||
|
||||
#ifndef lbnMemWipe
|
||||
void
|
||||
lbnMemWipe(void *ptr, unsigned bytes)
|
||||
{
|
||||
memset(ptr, 0, bytes);
|
||||
}
|
||||
#define lbnMemWipe(ptr, bytes) memset(ptr, 0, bytes)
|
||||
#endif
|
||||
|
||||
#ifndef lbnMemAlloc
|
||||
void *
|
||||
lbnMemAlloc(unsigned bytes)
|
||||
{
|
||||
return malloc(bytes);
|
||||
}
|
||||
#define lbnMemAlloc(bytes) malloc(bytes)
|
||||
#endif
|
||||
|
||||
#ifndef lbnMemFree
|
||||
void
|
||||
lbnMemFree(void *ptr, unsigned bytes)
|
||||
{
|
||||
lbnMemWipe(ptr, bytes);
|
||||
free(ptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef lbnRealloc
|
||||
#if defined(lbnMemRealloc) || !BNSECURE
|
||||
void *
|
||||
lbnRealloc(void *ptr, unsigned oldbytes, unsigned newbytes)
|
||||
{
|
||||
if (ptr) {
|
||||
BIG(ptr = (char *)ptr - oldbytes;)
|
||||
if (newbytes < oldbytes)
|
||||
memmove(ptr, (char *)ptr + oldbytes-newbytes, oldbytes);
|
||||
}
|
||||
#ifdef lbnMemRealloc
|
||||
ptr = lbnMemRealloc(ptr, oldbytes, newbytes);
|
||||
#else
|
||||
ptr = realloc(ptr, newbytes);
|
||||
#endif
|
||||
if (ptr) {
|
||||
if (newbytes > oldbytes)
|
||||
memmove((char *)ptr + newbytes-oldbytes, ptr, oldbytes);
|
||||
BIG(ptr = (char *)ptr + newbytes;)
|
||||
}
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
#else /* BNSECURE */
|
||||
|
||||
void *
|
||||
lbnRealloc(void *oldptr, unsigned oldbytes, unsigned newbytes)
|
||||
{
|
||||
void *newptr = lbnMemAlloc(newbytes);
|
||||
|
||||
if (!newptr)
|
||||
return newptr;
|
||||
if (!oldptr)
|
||||
return BIGLITTLE((char *)newptr+newbytes, newptr);
|
||||
|
||||
/*
|
||||
* The following copies are a bit non-obvious in the big-endian case
|
||||
* because one of the pointers points to the *end* of allocated memory.
|
||||
*/
|
||||
if (newbytes > oldbytes) { /* Copy all of old into part of new */
|
||||
BIG(newptr = (char *)newptr + newbytes;)
|
||||
BIG(oldptr = (char *)oldptr - oldbytes;)
|
||||
memcpy(BIGLITTLE((char *)newptr-oldbytes, newptr), oldptr,
|
||||
oldbytes);
|
||||
} else { /* Copy part of old into all of new */
|
||||
memcpy(newptr, BIGLITTLE((char *)oldptr-newbytes, oldptr),
|
||||
newbytes);
|
||||
BIG(newptr = (char *)newptr + newbytes;)
|
||||
BIG(oldptr = (char *)oldptr - oldbytes;)
|
||||
}
|
||||
|
||||
lbnMemFree(oldptr, oldbytes);
|
||||
return newptr;
|
||||
}
|
||||
#endif /* BNSECURE */
|
||||
#endif /* !lbnRealloc */
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Operations on the usual buffers of bytes
|
||||
*/
|
||||
#ifndef BNSECURE
|
||||
#define BNSECURE 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* These operations act on buffers of memory, just like malloc & free.
|
||||
* One exception: it is not legal to pass a NULL pointer to lbnMemFree.
|
||||
*/
|
||||
|
||||
#ifndef lbnMemAlloc
|
||||
void *lbnMemAlloc(unsigned bytes);
|
||||
#endif
|
||||
|
||||
#ifndef lbnMemFree
|
||||
void lbnMemFree(void *ptr, unsigned bytes);
|
||||
#endif
|
||||
|
||||
/* This wipes out a buffer of bytes if necessary needed. */
|
||||
|
||||
#ifndef lbnMemWipe
|
||||
#if BNSECURE
|
||||
void lbnMemWipe(void *ptr, unsigned bytes);
|
||||
#else
|
||||
#define lbnMemWipe(ptr, bytes) (void)(ptr,bytes)
|
||||
#endif
|
||||
#endif /* !lbnMemWipe */
|
||||
|
||||
/*
|
||||
* lbnRealloc is NOT like realloc(); it's endian-sensitive!
|
||||
* If lbnMemRealloc is #defined, lbnRealloc will be defined in terms of it.
|
||||
* It is legal to pass a NULL pointer to lbnRealloc, although oldbytes
|
||||
* will always be sero.
|
||||
*/
|
||||
#ifndef lbnRealloc
|
||||
void *lbnRealloc(void *ptr, unsigned oldbytes, unsigned newbytes);
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* These macros are the ones actually used most often in the math library.
|
||||
* They take and return pointers to the *end* of the given buffer, and
|
||||
* take sizes in terms of words, not bytes.
|
||||
*
|
||||
* Note that LBNALLOC takes the pointer as an argument instead of returning
|
||||
* the value.
|
||||
*
|
||||
* Note also that these macros are only useable if you have included
|
||||
* lbn.h (for the BIG and BIGLITTLE macros), which this file does NOT include.
|
||||
*/
|
||||
|
||||
#define LBNALLOC(p,words) BIGLITTLE( \
|
||||
if ( ((p) = lbnMemAlloc((words)*sizeof*(p))) != 0) (p) += (words), \
|
||||
(p) = lbnMemAlloc((words) * sizeof*(p)) \
|
||||
)
|
||||
#define LBNFREE(p,words) lbnMemFree((p) BIG(-(words)), (words) * sizeof*(p))
|
||||
#define LBNREALLOC(p,old,new) \
|
||||
lbnRealloc(p, (old) * sizeof*(p), (new) * sizeof*(p))
|
||||
#define LBNWIPE(p,words) lbnMemWipe((p) BIG(-(words)), (words) * sizeof*(p))
|
||||
|
||||
|
|
@ -1,358 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
#include "lbnppc.h"
|
||||
|
||||
/*
|
||||
* lbnppc.c - Assembly primitives for the bignum library, PowerPC version.
|
||||
*
|
||||
* Copyright (c) 1995 Colin Plumb. All rights reserved.
|
||||
* For licensing and other legal details, see the file legal.c
|
||||
*
|
||||
* Register usage during function calls is:
|
||||
* r0 - volatile
|
||||
* r1 - stack pointer, preserved
|
||||
* r2 - TOC pointer, preserved
|
||||
* r3 - First argument and return value register
|
||||
* r4-r10 - More argument registers, volatile
|
||||
* r11-r12 - Volatile
|
||||
* r13-r31 - Preserved
|
||||
* LR, CTR, XER and MQ are all volatile.
|
||||
* LR holds return address on entry.
|
||||
*
|
||||
* On the PPC 601, unrolling the loops more doesn't seem to speed things
|
||||
* up at all. I'd be curious if other chips differed.
|
||||
*/
|
||||
#if __MWERKS__ < 0x800
|
||||
|
||||
#include "ppcasm.h" /* PowerPC assembler */
|
||||
|
||||
/*
|
||||
* MulN1 expects (*out, *in, len, k), count >= 1
|
||||
* r3 r4 r5 r6
|
||||
*/
|
||||
static const unsigned mulN1[] = {
|
||||
PPC_LWZ(7,4,0), /* Load first word of in in r7 */
|
||||
PPC_MULLW(8,7,6), /* Low half of multiply in r8 */
|
||||
PPC_MTCTR(5), /* Move len into CTR */
|
||||
PPC_ADDIC(0,0,0), /* Clear carry bit for loop */
|
||||
PPC_MULHWU(5,7,6), /* High half of multiply in r5 */
|
||||
PPC_STW(8,3,0),
|
||||
PPC_BC(18,31,7), /* Branch to Label if --ctr == 0 */
|
||||
/* Loop: */
|
||||
PPC_LWZU(7,4,4), /* r7 = *++in */
|
||||
PPC_MULLW(8,7,6), /* r8 = low word of product */
|
||||
PPC_ADDE(8,8,5), /* Add carry word r5 and bit CF to r8 */
|
||||
PPC_STWU(8,3,4), /* *++out = r8 */
|
||||
PPC_MULHWU(5,7,6), /* r5 is high word of product, for carry word */
|
||||
PPC_BC(16,31,-5), /* Branch to Loop if --ctr != 0 */
|
||||
/* Label: */
|
||||
PPC_ADDZE(5,5), /* Add carry flag to r5 */
|
||||
PPC_STW(5,3,4), /* out[1] = r5 */
|
||||
PPC_BLR()
|
||||
};
|
||||
|
||||
/*
|
||||
* MulAdd1 expects (*out, *in, len, k), count >= 1
|
||||
* r3 r4 r5 r6
|
||||
*/
|
||||
static unsigned const mulAdd1[] = {
|
||||
PPC_LWZ(7,4,0), /* Load first word of in in r7 */
|
||||
PPC_LWZ(0,3,0), /* Load first word of out into r0 */
|
||||
PPC_MULLW(8,7,6), /* Low half of multiply in r8 */
|
||||
PPC_MTCTR(5), /* Move len into CTR */
|
||||
PPC_MULHWU(5,7,6), /* High half of multiply in r5 */
|
||||
PPC_ADDC(8,8,0), /* r8 = r8 + r0 */
|
||||
PPC_STW(8,3,0), /* Store result to memory */
|
||||
PPC_BC(18,31,10), /* Branch to Label if --ctr == 0 */
|
||||
/* Loop: */
|
||||
PPC_LWZU(7,4,4), /* r7 = *++in */
|
||||
PPC_LWZU(0,3,4), /* r0 = *++out */
|
||||
PPC_MULLW(8,7,6), /* r8 = low word of product */
|
||||
PPC_ADDE(8,8,5), /* Add carry word r5 and carry bit CF to r8 */
|
||||
PPC_MULHWU(5,7,6), /* r5 is high word of product, for carry word */
|
||||
PPC_ADDZE(5,5), /* Add carry bit from low add to r5 */
|
||||
PPC_ADDC(8,8,0), /* r8 = r8 + r0 */
|
||||
PPC_STW(8,3,0), /* *out = r8 */
|
||||
PPC_BC(16,31,-8), /* Branch to Loop if --ctr != 0 */
|
||||
/* Label: */
|
||||
PPC_ADDZE(3,5), /* Add carry flag to r5 and move to r3 */
|
||||
PPC_BLR()
|
||||
};
|
||||
|
||||
/*
|
||||
* MulSub1 expects (*out, *in, len, k), count >= 1
|
||||
* r3 r4 r5 r6
|
||||
*
|
||||
* Multiply and subtract is rather a pain. If the subtract of the
|
||||
* low word of the product from out[i] generates a borrow, we want to
|
||||
* increment the carry word (initially in the range 0..0xfffffffe).
|
||||
* However, the PPC's carry bit CF is *clear* after a subtract, so
|
||||
* we want to add (1-CF) to the carry word. This is done using two
|
||||
* instructions:
|
||||
*
|
||||
* SUBFME, subtract from minus one extended. This computes
|
||||
* rD = ~rS + 0xffffffff + CF. Since rS is from 0 to 0xfffffffe,
|
||||
* ~rS is from 1 through 0xffffffff, and the sum with 0xffffffff+CF is
|
||||
* from 0 through 0xfffffffff, setting the carry flag unconditionally, and
|
||||
* NOR, which is used as a bitwise invert NOT instruction.
|
||||
*
|
||||
* The SUBFME performs the computation rD = ~rS + 0xffffffff + CF,
|
||||
* = (-rS - 1) + (CF - 1) = -(rS - CF + 1) - 1 = ~(rS + 1-CF),
|
||||
* which is the bitwise complement of the value we want.
|
||||
* We want to add the complement of that result to the low word of the
|
||||
* product, which is just what a subtract would do, if only we could get
|
||||
* the carry flag clear. But it's always set, except for SUBFE, and the
|
||||
* operation we just performed unconditionally *sets* the carry flag. Ugh.
|
||||
* So find the complement in a separate instruction.
|
||||
*/
|
||||
static unsigned const mulSub1[] = {
|
||||
PPC_LWZ(7,4,0), /* Load first word of in in r7 */
|
||||
PPC_LWZ(0,3,0), /* Load first word of out into r0 */
|
||||
PPC_MTCTR(5), /* Move len into CTR */
|
||||
PPC_MULLW(8,7,6), /* Low half of multiply in r8 */
|
||||
PPC_MULHWU(5,7,6), /* High half of multiply in r5 */
|
||||
PPC_SUBFC(8,8,0), /* r8 = r0 - r8, setting CF */
|
||||
PPC_STW(8,3,0), /* Store result to memory */
|
||||
PPC_SUBFME(5,5), /* First of two insns to add (1-CF) to r5 */
|
||||
PPC_BC(18,31,12), /* Branch to Label if --ctr == 0 */
|
||||
/* Loop: */
|
||||
PPC_LWZU(7,4,4), /* r7 = *++in */
|
||||
PPC_LWZU(0,3,4), /* r0 = *++out */
|
||||
PPC_NOR(5,5,5), /* Second of two insns to add (1-CF) to r5 */
|
||||
PPC_MULLW(8,7,6), /* r8 = low word of product */
|
||||
PPC_ADDC(8,8,5), /* Add carry word r5 to r8 */
|
||||
PPC_MULHWU(5,7,6), /* r5 is high word of product, for carry word */
|
||||
PPC_ADDZE(5,5), /* Add carry bit from low add to r5 */
|
||||
PPC_SUBFC(8,8,0), /* r8 = r0 - r8, setting CF */
|
||||
PPC_STW(8,3,0), /* *out = r8 */
|
||||
PPC_SUBFME(5,5), /* First of two insns to add (1-CF) to r5 */
|
||||
PPC_BC(16,31,-10), /* Branch to Loop if --ctr != 0 */
|
||||
/* Label: */
|
||||
PPC_NOR(3,5,5), /* Finish adding (1-CF) to r5, store in r3 */
|
||||
PPC_BLR()
|
||||
};
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* Args: BNWORD32 *n, BNWORD32 const *mod, unsigned mlen, BNWORD32 inv)
|
||||
* r3 r4 r5 r6
|
||||
* r7, r8 and r9 are the triple-width accumulator.
|
||||
* r0 and r10 are temporary registers.
|
||||
* r11 and r12 are temporary pointers into n and mod, respectively.
|
||||
* r2 (!) is another temporary register.
|
||||
*/
|
||||
static unsigned const montReduce[] = {
|
||||
PPC_MTCTR(5), /* ??? */
|
||||
PPC_LWZ(7,3,0), /* Load low word of n into r7 */
|
||||
PPC_LWZ(10,4,0), /* Fetch low word of mod */
|
||||
PPC_MULLW(0,7,6), /* Invert r7 into r0 */
|
||||
PPC_STW(0,3,0), /* Store back for future use */
|
||||
PPC_MULHWU(8,10,7), /* Get high word of whatnot */
|
||||
PPC_MULLW(10,10,7), /* Get low word of it */
|
||||
PPC_ADDC(7,7,10), /* Add low word of product to r7 */
|
||||
PPC_ADDZE(8,8), /* Add carry to high word */
|
||||
PPC_
|
||||
|
||||
|
||||
PPC_MULHW(8,7,6),
|
||||
PPC_ADDC(7,7,0), /* Add inverse back to r7 */
|
||||
PPC_ADDZE(8,8),
|
||||
PPC_
|
||||
|
||||
PPC_LWZU(
|
||||
/* Loop: */
|
||||
PPC_LWZU(0,11,4),
|
||||
PPC_LWZU(10,23,-4),
|
||||
PPC_MULLW(2,0,10),
|
||||
PPC_ADDC(7,7,2),
|
||||
PPC_MULHWU(0,0,10),
|
||||
PPC_ADDE(8,8,0),
|
||||
PPC_ADDZE(9,9),
|
||||
PPC_BC(16,31,-7), /* Branch to Loop if --ctr != 0 */
|
||||
|
||||
PPC_ADDIC_(count,-1),
|
||||
PPC_LWZU(0,x,4),
|
||||
PPC_ADDC(0,7,0),
|
||||
PPC_STW(0,x,0),
|
||||
PPC_ADDZE(7,8),
|
||||
PPC_ADDZE(8,9),
|
||||
PPC_LI(9,0),
|
||||
PPC_BC(xx,2,yy),
|
||||
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Three overlapped transition vectors for three functions.
|
||||
* A PowerPC transition vector for a (potentially) inter-module
|
||||
* jump or call consists of two words, an instruction address
|
||||
* and a Table Of Contents (TOC) pointer, which is loaded into
|
||||
* r1. Since none of the routines here have global variables,
|
||||
* they don't need a TOC pointer, so the value is unimportant.
|
||||
* This array places an unintersting 32-bit value after each address.
|
||||
*/
|
||||
unsigned const * const lbnPPC_tv[] = {
|
||||
mulN1,
|
||||
mulAdd1,
|
||||
mulSub1,
|
||||
0
|
||||
};
|
||||
|
||||
#else /* __MWERKS >= 0x800 */
|
||||
|
||||
/*
|
||||
* MulN1 expects (*out, *in, len, k), count >= 1
|
||||
* r3 r4 r5 r6
|
||||
*/
|
||||
asm void
|
||||
lbnMulN1_32(register unsigned *out, register unsigned const *in,
|
||||
register unsigned len, register unsigned k)
|
||||
{
|
||||
lwz r7,0(in) /* Load first word of in in r7 */
|
||||
mtctr len /* Move len into CTR */
|
||||
mullw r8,r7,k /* Low half of multiply in r8 */
|
||||
addic r0,r0,0 /* Clear carry bit for loop */
|
||||
mulhwu len,r7,k /* High half of multiply in len */
|
||||
stw r8,0(out) /* *out = r8 */
|
||||
mulhwu len,r7,k /* len is high word of product, for carry */
|
||||
bdz- label /* Branch to Label if --ctr == 0 */
|
||||
loop:
|
||||
lwzu r7,4(in) /* r7 = *++in */
|
||||
mullw r8,r7,k /* Low half of multiply in r8 */
|
||||
adde r8,r8,len /* Add carry word len and bit CF to r8 */
|
||||
stwu r8,4(out) /* *++out = r8 */
|
||||
mulhwu len,r7,k /* len is high word of product, for carry */
|
||||
bdnz+ loop /* Branch to Loop if --ctr != 0 */
|
||||
label:
|
||||
addze len,len /* Add carry flag to carry word */
|
||||
stw len,4(out)
|
||||
blr
|
||||
}
|
||||
|
||||
/*
|
||||
* MulAdd1 expects (*out, *in, len, k), count >= 1
|
||||
* r3 r4 r5 r6
|
||||
*/
|
||||
asm unsigned
|
||||
lbnMulAdd1_32(register unsigned *out, register unsigned const *in,
|
||||
register unsigned len, register unsigned k)
|
||||
{
|
||||
lwz r7,0(in) /* Load first word of in in r7 */
|
||||
lwz r0,0(out) /* Load first word of out into r0 */
|
||||
mullw r8,r7,k /* Low half of multiply in r8 */
|
||||
mtctr len /* Move len into CTR */
|
||||
mulhwu len,r7,k /* High half of multiply in len */
|
||||
addc r8,r8,r0 /* r8 = r8 + r0 */
|
||||
stw r8,0(out) /* Store result to memory */
|
||||
bdz- label /* Branch to Label if --ctr == 0 */
|
||||
loop:
|
||||
lwzu r7,4(in) /* r7 = *++in */
|
||||
lwzu r0,4(out) /* r0 = *++out */
|
||||
mullw r8,r7,k /* r8 = low word of product */
|
||||
adde r8,r8,len /* Add carry word len and carry bit CF to r8 */
|
||||
mulhwu len,r7,k /* len is high word of product, for carry */
|
||||
addze len,len /* Add carry bit from low add to r5 */
|
||||
addc r8,r8,r0 /* r8 = r8 + r0 */
|
||||
stw r8,0(out) /* *out = r8 */
|
||||
bdnz+ loop /* Branch to Loop if --ctr != 0 */
|
||||
label:
|
||||
addze r3,r5 /* Add carry flag to r5 and move to r3 */
|
||||
blr
|
||||
}
|
||||
|
||||
/*
|
||||
* MulSub1 expects (*out, *in, len, k), count >= 1
|
||||
* r3 r4 r5 r6
|
||||
*
|
||||
* Multiply and subtract is rather a pain. If the subtract of the
|
||||
* low word of the product from out[i] generates a borrow, we want to
|
||||
* increment the carry word (initially in the range 0..0xfffffffe).
|
||||
* However, the PPC's carry bit CF is *clear* after a subtract, so
|
||||
* we want to add (1-CF) to the carry word. This is done using two
|
||||
* instructions:
|
||||
*
|
||||
* SUBFME, subtract from minus one extended. This computes
|
||||
* rD = ~rS + 0xffffffff + CF. Since rS is from 0 to 0xfffffffe,
|
||||
* ~rS is from 1 through 0xffffffff, and the sum with 0xffffffff+CF is
|
||||
* from 0 through 0xfffffffff, setting the carry flag unconditionally, and
|
||||
* NOR, which is used as a bitwise invert NOT instruction.
|
||||
*
|
||||
* The SUBFME performs the computation rD = ~rS + 0xffffffff + CF,
|
||||
* = (-rS - 1) + (CF - 1) = -(rS - CF + 1) - 1 = ~(rS + 1-CF),
|
||||
* which is the bitwise complement of the value we want.
|
||||
* We want to add the complement of that result to the low word of the
|
||||
* product, which is just what a subtract would do, if only we could get
|
||||
* the carry flag clear. But it's always set, except for SUBFE, and the
|
||||
* operation we just performed unconditionally *sets* the carry flag. Ugh.
|
||||
* So find the complement in a separate instruction.
|
||||
*/
|
||||
asm unsigned
|
||||
lbnMulSub1_32(register unsigned *out, register unsigned const *in,
|
||||
register unsigned len, register unsigned k)
|
||||
{
|
||||
lwz r7,0(in) /* Load first word of in in r7 */
|
||||
lwz r0,0(out) /* Load first word of out into r0 */
|
||||
mtctr len /* Move len into CTR */
|
||||
mullw r8,r7,k /* Low half of multiply in r8 */
|
||||
mulhwu len,r7,k /* High half of multiply in len */
|
||||
subfc r8,r8,r0 /* r8 = r0 - r8, setting CF */
|
||||
stw r8,0(out) /* Store result to memory */
|
||||
subfme len,len /* First of two insns to add (1-CF) to len */
|
||||
bdz- label /* Branch to Label if --ctr == 0 */
|
||||
loop:
|
||||
lwzu r7,4(in) /* r7 = *++in */
|
||||
lwzu r0,4(out) /* r0 = *++out */
|
||||
nor len,len,len /* Second of two insns to add (1-CF) to len */
|
||||
mullw r8,r7,k /* r8 = low word of product */
|
||||
addc r8,r8,len /* Add carry word len to r8 */
|
||||
mulhwu len,r7,k /* len is high word of product, for carry */
|
||||
addze len,len /* Add carry bit from low add to len */
|
||||
subfc r8,r8,r0 /* r8 = r0 - r8 */
|
||||
stw r8,0(out) /* *out = r8 */
|
||||
subfme len,len /* First of two insns to add (1-CF) to len */
|
||||
bdnz+ loop /* Branch to Loop if --ctr != 0 */
|
||||
label:
|
||||
nor r3,r5,r5 /* Finish adding (1-CF) to len, store in r3 */
|
||||
blr
|
||||
}
|
||||
|
||||
#endif /* __MWERKS >= 0x800 */
|
||||
/* 45678901234567890123456789012345678901234567890123456789012345678901234567 */
|
||||
|
|
@ -1,98 +0,0 @@
|
|||
#ifndef LBNPPC_H
|
||||
#define LBNPPC_H
|
||||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Assembly-language routines for the Power PC processor.
|
||||
* Annoyingly, the Power PC does not have 64/32->32 bit divide,
|
||||
* so the C code should be reasonably fast. But it does have
|
||||
* 32x32->64-bit multiplies, and these routines provide access
|
||||
* to that.
|
||||
*
|
||||
* In versions of CodeWarrior before 8.0, there was no PPC assembler,
|
||||
* so a kludged-up one in CPP is used. This requires casting an
|
||||
* array of unsigneds to function pointer type, and a function pointer
|
||||
* is not a pointer to the code, but rather a pointer to a (code,TOC)
|
||||
* pointer pair which we fake up.
|
||||
*
|
||||
* CodeWarrior 8.0 supports PCC assembly, which is used directly.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Bignums are stored in arrays of 32-bit words, and the least
|
||||
* significant 32-bit word has the lowest address, thus "little-endian".
|
||||
* The C code is slightly more efficient this way, so unless the
|
||||
* processor cares (the PowerPC, like most RISCs, doesn't), it is
|
||||
* best to use BN_LITTLE_ENDIAN.
|
||||
* Note that this has NOTHING to do with the order of bytes within a 32-bit
|
||||
* word; the math library is insensitive to that.
|
||||
*/
|
||||
#define BN_LITTLE_ENDIAN 1
|
||||
|
||||
typedef unsigned bnword32;
|
||||
#define BNWORD32 bnword32
|
||||
|
||||
#if __MWERKS__ < 0x800
|
||||
|
||||
/* Shared transition vector array */
|
||||
extern unsigned const * const lbnPPC_tv[];
|
||||
|
||||
/* A function pointer on the PowerPC is a pointer to a transition vector */
|
||||
#define lbnMulN1_32 \
|
||||
((void (*)(bnword32 *, bnword32 const *, unsigned, bnword32))(lbnPPC_tv+0))
|
||||
#define lbnMulAdd1_32 \
|
||||
((bnword32 (*)(bnword32 *, bnword32 const *, unsigned, bnword32))(lbnPPC_tv+1))
|
||||
#define lbnMulSub1_32 \
|
||||
((bnword32 (*)(bnword32 *, bnword32 const *, unsigned, bnword32))(lbnPPC_tv+2))
|
||||
|
||||
#else /* __MWERKS__ >= 0x800 */
|
||||
|
||||
void lbnMulN1_32(bnword32 *, bnword32 const *, unsigned, bnword32);
|
||||
#define lbnMulN1_32 lbnMulN1_32
|
||||
bnword32 lbnMulAdd1_32(bnword32 *, bnword32 const *, unsigned, bnword32);
|
||||
#define lbnMulAdd1_32 lbnMulAdd1_32
|
||||
bnword32 lbnMulSub1_32(bnword32 *, bnword32 const *, unsigned, bnword32);
|
||||
#define lbnMulSub1_32 lbnMulSub1_32
|
||||
|
||||
#endif /* __MWERKS__ >= 0x800 */
|
||||
|
||||
#endif /* LBNPPC_H */
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
|
||||
/* Force inclusion of this... */
|
||||
#include "legal.h"
|
||||
volatile const char bnCopyright[] =
|
||||
"bnlib 1.0.1 Copyright (c) 1995,1996 Colin Plumb.";
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* ANSI C standard, section 3.5.3: "An object that has volatile-qualified
|
||||
* type may be modified in ways unknown to the implementation or have
|
||||
* other unknown side effects." Yes, we can't expect a compiler to
|
||||
* understand law...
|
||||
*/
|
||||
extern volatile const char bnCopyright[];
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,575 +0,0 @@
|
|||
#ifndef PPCASM_H
|
||||
#define PPCASM_H
|
||||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/*
|
||||
* A PowerPC assembler in the C preprocessor.
|
||||
* This assumes that ints are 32 bits, and uses them for the values.
|
||||
*
|
||||
* An assembly-language routine is simply an array of unsigned ints,
|
||||
* initialized with the macros defined here.
|
||||
*
|
||||
* In the PowerPC, a generic function pointer does *not* point to the
|
||||
* first word of code, but to a two (or possibly more) word "transition
|
||||
* vector." The first word of the TV points to the function's code.
|
||||
* The second word is the function's TOC (Table Of Contents) pointer,
|
||||
* which is loaded into r2. The function's global variables are
|
||||
* accessed via the TOC pointed to by r2. TOC pointers are changed,
|
||||
* for example, when a dynamically linked library is called, so the
|
||||
* library can have private global variables.
|
||||
*
|
||||
* Saving r2 and reloading r2 each function call is a hassle that
|
||||
* I'd really rather avoid, since a lot of useful assembly language routines
|
||||
* can be written without global variables at all, so they don't need a TOC
|
||||
* pointer. But I haven't figured out how to persuade CodeWarrior 7 to
|
||||
* generate an intra-TOC call to an array. (CodeWarrior 8 supports
|
||||
* PowerPC asm, which obviates the need to do the cast-to-function-pointer
|
||||
* trick, which obviates the need for cross-TOC calls.)
|
||||
*
|
||||
* The basic PowerPC calling conventions for integers are:
|
||||
* r0 - scratch. May be modified by function calls.
|
||||
* r1 - stack pointer. Must be preserved across function calls.
|
||||
* See IMPORTANT notes on stack frame format below.
|
||||
* This must *ALWAYS*, at every instruction boundary, be 16-byte
|
||||
* aligned and point to a valid stack frame. If a procedure
|
||||
* needs to create a stack frame, the recommended way is to do:
|
||||
* stwu r1,-frame_size(r1)
|
||||
* and on exit, recover with one of:
|
||||
* addi r1,r1,frame_size, OR
|
||||
* lwz r1,0(r1)
|
||||
* r2 - TOC pointer. Points to the current table of contents.
|
||||
* Must be preserved across function calls.
|
||||
* r3 - First argument register and return value register.
|
||||
* Arguments are passed in r3 through r10, and values returned in
|
||||
* r3 through r6, as needed. (Usually only r3 for single word.)
|
||||
* r4-r10 - More argument registers
|
||||
* r11 - Scratch, may be modified by function calls.
|
||||
* On entry to indirect function calls, this points to the
|
||||
* transition vector, and additional words may be loaded
|
||||
* at offsets from it. Some conventions use r12 instead.
|
||||
* r12 - Scratch, may be modified by function calls.
|
||||
* r13-r31 - Callee-save registers, may not be modified by function
|
||||
* calls.
|
||||
* The LR, CTR and XER may be modified by function calls, as may the MQ
|
||||
* register, on those processors for which it is implemented.
|
||||
* CR fields 0, 1, 5, 6 and 7 are scratch and may be modified by function
|
||||
* calls. CR fields 2, 3 and 4 must be preserved across function calls.
|
||||
*
|
||||
* Stack frame format - READ
|
||||
*
|
||||
* r1 points to a stack frame, which must *ALWAYS*, meaning after each and
|
||||
* every instruction, without excpetion, point to a valid 16-byte-aligned
|
||||
* stack frame, defined as follows:
|
||||
* - The 296 bytes below r1 (from -296(r1) to -1(r1)) are the so-called Red
|
||||
* Zone reserved for leaf procedures, which may use it without allocating
|
||||
* a stack frame and without decrementing r1. The size comes from the room
|
||||
* needed to store all the callee-save registers: 19 64-bit integer registers
|
||||
* and 18 64-bit floating-point registers. (18+19)*8 = 296. So any
|
||||
* procedure can save all the registers it needs to save before creating
|
||||
* a stack frame and moving r1.
|
||||
* The bytes at -297(r1) and below may be used by interrupt and exception
|
||||
* handlers *at any time*. Anything placed there may disappear before
|
||||
* the next instruction.
|
||||
* The word at 0(r1) is the previous r1, and so on in a linked list.
|
||||
* This is the minimum needed to be a valid stack frame, but some other
|
||||
* offsets from r1 are preallocated by the calling procedure for the called
|
||||
* procedure's use. These are:
|
||||
* Offset 0: Link to previous stack frame - saved r1, if the called
|
||||
* procedure alters it.
|
||||
* Offset 4: Saved CR, if the called procedure alters the callee-save
|
||||
* fields. There's no important reason to save it here,
|
||||
* but the space is reserved and you might as well use it
|
||||
* for its intended purpose unless you have good reason to
|
||||
* do otherwise. (This may help some debuggers.)
|
||||
* Offset 8: Saved LR, if the called procedure needs to save it for
|
||||
* later function return. Saving the LR here helps a debugger
|
||||
* track the chain of return addresses on the stack.
|
||||
* Note that a called procedure does not need to preserve the
|
||||
* LR for it's caller's sake, but it uually wants to preserve
|
||||
* the value for its own sake until it finishes and it's
|
||||
* time to return. At that point, this is usually loaded
|
||||
* back into the LR and the branch accomplished with BLR.
|
||||
* However, if you want to be preverse, you could load it
|
||||
* into the CTR and use BCTR instead.
|
||||
* Offset 12: Reserved to compiler. I can't find what this is for.
|
||||
* Offset 16: Reserved to compiler. I can't find what this is for.
|
||||
* Offset 20: Saved TOC pointer. In a cross-TOC call, the old TOC (r2)
|
||||
* is saved here before r2 is loaded with the new TOC value.
|
||||
* Again, it's not important to use this slot for this, but
|
||||
* you might as well.
|
||||
* Beginning at offset 24 is the argument area. This area is at least 8 words
|
||||
* (32 bytes; I don't know what happens with 64 bits) long, and may be longer,
|
||||
* up to the length of the longest argument list in a function called by
|
||||
* the function which allocated this stack frame. Generally, arguments
|
||||
* to functions are passed in registers, but if those functions notice
|
||||
* the address of the arguments being taken, the registers are stored
|
||||
* into the space reserved for them in this area and then used from memory.
|
||||
* Additional arguments that will not fit into registers are also stored
|
||||
* here. Variadic functions (like printf) generally start by saving
|
||||
* all the integer argument registers from the "..." onwards to this space.
|
||||
* For that reason, the space must be large enough to store all the argument
|
||||
* registers, even if they're never used.
|
||||
* (It could probably be safely shrunk if you're not calling any variadic
|
||||
* functions, but be careful!)
|
||||
*
|
||||
* Offsets above that are private to the calling function and shouldn't
|
||||
* be messed with. Generally, what appears there is locals, then saved
|
||||
* registers.
|
||||
*
|
||||
*
|
||||
* The floating-point instruction set isn't implemented yet (I'm too
|
||||
* lazy, as I don't need it yet), but for when it is, the register
|
||||
* usage convention is:
|
||||
* FPSCR - Scratch, except for floating point exception enable fields,
|
||||
* which should only be modified by functions defined to do so.
|
||||
* fr0 - scratch
|
||||
* fr1 - first floating point parameter and return value, scratch
|
||||
* fr2 - second floating point parameter and return value (if needed), scratch
|
||||
* fr3 - third floating point parameter and return value (if needed), scratch
|
||||
* fr4 - fourth floating point parameter and return value (if needed), scratch
|
||||
* fr5-fr13 - More floating point argument registers, scratch
|
||||
* fr14-fr31 - Callee-save registers, may not be modified across a function call
|
||||
*
|
||||
* Complex values store the real part in the lower-numberd register of a pair.
|
||||
* When mixing floating-point and integer arguments, reserve space (one register
|
||||
* for single-precision, two for double-precision values) in the integer
|
||||
* argument list for the floating-point values. Those integer registers
|
||||
* generally have undefined values, UNLESS there is no prototype for the call,
|
||||
* in which case they should contain a copy of the floating-point value's
|
||||
* bit pattern to cope with wierd software.
|
||||
* If the floating point arguments go past the end of the integer registers,
|
||||
* they are stored in the argument area as well as being passed in here.
|
||||
*
|
||||
* After the argument area comes the calling function's private storage.
|
||||
* Typically, there are locals, followed by saved GP rgisters, followed
|
||||
* by saved FP registers.
|
||||
*
|
||||
* Suggested instruction for allocating a stack frame:
|
||||
* stwu r1,-frame_size(r1)
|
||||
* Suggested instructions for deallocating a stack frame:
|
||||
* addi r1,r1,frame_size
|
||||
* or
|
||||
* lwz r1,0(r1)
|
||||
* If frame_size is too big, you'll have to load the offset into a temp
|
||||
* register, but be sure that r1 is updated atomically.
|
||||
*
|
||||
*
|
||||
* Basic PowerPC instructions look like this:
|
||||
*
|
||||
* 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
|
||||
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* | Opcode | | | | | | | | | | | | | | | | | | | | | | | | | | |
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*
|
||||
* Branch instructions look like this:
|
||||
*
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* | Opcode | Branch offset |A|L|
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*
|
||||
* The L, or LK, or Link bit indicates that the return address for the
|
||||
* branch should be copied to the link register (LR).
|
||||
* The A, or AA, or absolute address bit, indicates that the address
|
||||
* of the current instruction (NOTE: not next instruction!) should NOT
|
||||
* be added to the branch offset; it is relative to address 0.
|
||||
*
|
||||
* Conditional branches looks like this:
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* | Opcode | BO | BI | Branch offset |A|L|
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*
|
||||
* The BI field specifies the condition bit of interest (from the CR).
|
||||
* The BO field specifies what's interesting. You can branch on a
|
||||
* combination of a bit of the condition register and --ctr, the CTR
|
||||
* register. Two bits encode the branch condition to use:
|
||||
* BRANCH IF
|
||||
* 00--- = Bit BI is 0
|
||||
* 01--- = Bit BI is 1
|
||||
* 1z--- = don't care about bit BI (always true)
|
||||
* AND
|
||||
* --00- = --ctr != 0
|
||||
* --01- = --ctr == 0
|
||||
* --1z- = don't decrement ctr (always true)
|
||||
* The last bit us used as a branch prediction bit. If set, it reverses
|
||||
* the usual backward-branch-taken heuristic.
|
||||
*
|
||||
* y = branch prediction bit. z = unused, must be 0
|
||||
* 0000y - branch if --ctr != 0 && BI == 0
|
||||
* don't branch if --ctr == 0 || BI != 0
|
||||
* 0001y - branch if --ctr == 0 && BI == 0
|
||||
* don't branch if --ctr != 0 || BI != 0
|
||||
* 001zy - branch if BI == 0
|
||||
* don't branch if BI != 0
|
||||
* 0100y - branch if --ctr != 0 && BI != 0
|
||||
* don't branch if --ctr == 0 || BI == 0
|
||||
* 0101y - branch if --ctr == 0 && BI != 0
|
||||
* don't branch if --ctr != 0 || BI == 0
|
||||
* 011zy - branch if BI != 0
|
||||
* don't branch if BI == 0
|
||||
* 1z00y - branch if --ctr != 0
|
||||
* don't branch if --ctr == 0
|
||||
* 1z01y - branch if --ctr == 0
|
||||
* don't branch if --ctr != 0
|
||||
* 1z1zz - branch always
|
||||
* If y is 1, the usual branch prediction (usually not taken, taken for
|
||||
* backwards branches with immediate offsets) is reversed.
|
||||
*
|
||||
* Instructions with 2 operands and a 16-bit immediate field look like this:
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* | Opcode | D | A | 16-bit immediate value |
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*
|
||||
* Now, there are three variations of note. In some instructions, the 16-bit
|
||||
* value is sign-extended. In others, it's zero-extended. These are noted
|
||||
* below as "simm" (signed immediate) and "uimm", respectively. Also, which
|
||||
* field is the destination and which is the source sometimes switches.
|
||||
* Sometimes it's d = a OP imm, and sometimes it's a = s OP imm. In the
|
||||
* latter cases, the "d" field is referred to as "s" ("source" instead of
|
||||
* "destination". These are logical and shift instructions. (Store also
|
||||
* refers to the s register, but that's the source of the value to be stored.)
|
||||
* The assembly mnemonics, however, always lists the destination first,
|
||||
* swapping the order in the instruction if necessary.
|
||||
* Third, quite often, if r0 is specified for the source a, then the constant
|
||||
* value 0 is used instead. Thus, r0 is of limited use - it can be used for
|
||||
* some things, but not all.
|
||||
*
|
||||
* Instructions with three register operands look like this:
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* | Opcode | D | A | B | Subopcode |C|
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*
|
||||
* For most of the instructions of interest the Opcode is 31 and the subopcode
|
||||
* determines what the instruction does. For a few instructions (mostly loads
|
||||
* and stores), if the A field is 0, the constant 0 is used. The "C"
|
||||
* bit (also known as the "RC" bit) controls whether or not the condition
|
||||
* codes are updated. If it is set (indicated by a "." suffix on the official
|
||||
* PowerPC opcodes, and a "_" suffix on these macros), condition code register
|
||||
* field 0 (for integer instructions; field 1 for floating point) is updated
|
||||
* to reflect the result of the operation.
|
||||
* Some arithmetic instructions use the most significant bit of the subopcode
|
||||
* field as an overflow enable bit (o suffix).
|
||||
*
|
||||
* Then there are the rotate and mask instructions, which have 5 operands, and
|
||||
* fill the subopcode field with 2 more 5-bit fields. See below for them.
|
||||
*
|
||||
* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
|
||||
* These macros fully parenthesize their arguments, but are not themselves
|
||||
* fully parenthesized. They are intended to be used for initializer lists,
|
||||
* and if you want to do tricks with their numeric values, wrap them in
|
||||
* parentheses.
|
||||
*/
|
||||
|
||||
#define PPC_MAJOR(x) ((x)<<26) /* Major opcode (0..63) */
|
||||
#define PPC_MINOR(x) ((x)<<1) /* Minor opcode (0..1023) */
|
||||
#define PPC_RC 1 /* Record carry (. suffix, represented as _) */
|
||||
#define PPC_OE 1024 /* Overflow enable (o suffix) */
|
||||
#define PPC_DEST(reg) ((reg)<<21) /* Dest register field */
|
||||
#define PPC_SRCA(reg) ((reg)<<16) /* First source register field */
|
||||
#define PPC_SRCB(reg) ((reg)<<11) /* Second source register field */
|
||||
#define PPC_AA 2 /* Branch is absolute, relative to address 0 */
|
||||
#define PPC_LK 1 /* Branch with link (L suffix) */
|
||||
|
||||
/* Unconditional branch (dest is 26 bits, +/- 2^25 bytes) */
|
||||
#define PPC_B(dest) PPC_MAJOR(18)|(((dest)<<2) & 0x03fffffc)
|
||||
#define PPC_BA(dest) PPC_B(dest)|PPC_AA
|
||||
#define PPC_BL(dest) PPC_B(dest)|PPC_LK
|
||||
#define PPC_BLA(dest) PPC_B(dest)|PPC_AA|PPC_LK
|
||||
|
||||
/* Three-operand instructions */
|
||||
#define PPC_TYPE31(minor,d,a,b) \
|
||||
PPC_MAJOR(31)|PPC_DEST(d)|PPC_SRCA(a)|PPC_SRCB(b)|PPC_MINOR(minor)
|
||||
#define PPC_ADD(d,a,b) PPC_TYPE31(266,d,a,b)
|
||||
#define PPC_ADD_(d,a,b) PPC_TYPE31(266,d,a,b)|PPC_RC
|
||||
#define PPC_ADDO(d,a,b) PPC_TYPE31(266,d,a,b)|PPC_OE
|
||||
#define PPC_ADDO_(d,a,b) PPC_TYPE31(266,d,a,b)|PPC_OE|PPC_RC
|
||||
#define PPC_ADDC(d,a,b) PPC_TYPE31(10,d,a,b)
|
||||
#define PPC_ADDC_(d,a,b) PPC_TYPE31(10,d,a,b)|PPC_RC
|
||||
#define PPC_ADDCO(d,a,b) PPC_TYPE31(10,d,a,b)|PPC_OE
|
||||
#define PPC_ADDCO_(d,a,b) PPC_TYPE31(10,d,a,b)|PPC_OE|PPC_RC
|
||||
#define PPC_ADDE(d,a,b) PPC_TYPE31(138,d,a,b)
|
||||
#define PPC_ADDE_(d,a,b) PPC_TYPE31(138,d,a,b)|PPC_RC
|
||||
#define PPC_ADDEO(d,a,b) PPC_TYPE31(138,d,a,b)|PPC_OE
|
||||
#define PPC_ADDEO_(d,a,b) PPC_TYPE31(138,d,a,b)|PPC_OE|PPC_RC
|
||||
#define PPC_ADDME(d,a) PPC_TYPE31(234,d,a,0)
|
||||
#define PPC_ADDME_(d,a) PPC_TYPE31(234,d,a,0)|PPC_RC
|
||||
#define PPC_ADDMEO(d,a) PPC_TYPE31(234,d,a,0)|PPC_OE
|
||||
#define PPC_ADDMEO_(d,a) PPC_TYPE31(234,d,a,0)|PPC_OE|PPC_RC
|
||||
#define PPC_ADDZE(d,a) PPC_TYPE31(202,d,a,0)
|
||||
#define PPC_ADDZE_(d,a) PPC_TYPE31(202,d,a,0)|PPC_RC
|
||||
#define PPC_ADDZEO(d,a) PPC_TYPE31(202,d,a,0)|PPC_OE
|
||||
#define PPC_ADDZEO_(d,a) PPC_TYPE31(202,d,a,0)|PPC_OE|PPC_RC
|
||||
#define PPC_AND(a,s,b) PPC_TYPE31(28,s,a,b)
|
||||
#define PPC_AND_(a,s,b) PPC_TYPE31(28,s,a,b)|PPC_RC
|
||||
#define PPC_ANDC(a,s,b) PPC_TYPE31(60,s,a,b)
|
||||
#define PPC_ANDC_(a,s,b) PPC_TYPE31(60,s,a,b)|PPC_RC
|
||||
#define PPC_CMP(cr,a,b) PPC_TYPE31(0,(cr)<<2,a,b)
|
||||
#define PPC_CMPL(cr,a,b) PPC_TYPE31(32,(cr)<<2,a,b)
|
||||
#define PPC_CNTLZW(a,s) PPC_TYPE31(26,s,a,0)
|
||||
#define PPC_CNTLZW_(a,s) PPC_TYPE31(26,s,a,0)|PPC_RC
|
||||
#define PPC_DCBF(a,b) PPC_TYPE31(86,0,a,b)
|
||||
#define PPC_DCBI(a,b) PPC_TYPE31(470,0,a,b)
|
||||
#define PPC_DCBST(a,b) PPC_TYPE31(54,0,a,b)
|
||||
#define PPC_DCBT(a,b) PPC_TYPE31(278,0,a,b)
|
||||
#define PPC_DCBTST(a,b) PPC_TYPE31(246,0,a,b)
|
||||
#define PPC_DCBZ(a,b) PPC_TYPE31(1014,0,a,b)
|
||||
#define PPC_DIVW(d,a,b) PPC_TYPE31(491,d,a,b)
|
||||
#define PPC_DIVW_(d,a,b) PPC_TYPE31(491,d,a,b)|PPC_RC
|
||||
#define PPC_DIVWO(d,a,b) PPC_TYPE31(491,d,a,b)|PPC_OE
|
||||
#define PPC_DIVWO_(d,a,b) PPC_TYPE31(491,d,a,b)|PPC_OE|PPC_RC
|
||||
#define PPC_DIVWU(d,a,b) PPC_TYPE31(459,d,a,b)
|
||||
#define PPC_DIVWU_(d,a,b) PPC_TYPE31(459,d,a,b)|PPC_RC
|
||||
#define PPC_DIVWUO(d,a,b) PPC_TYPE31(459,d,a,b)|PPC_OE
|
||||
#define PPC_DIVWUO_(d,a,b) PPC_TYPE31(459,d,a,b)|PPC_OE|PPC_RC
|
||||
#define PPC_EIEIO() PPC_TYPE31(854,0,0,0)
|
||||
#define PPC_EQV(a,s,b) PPC_TYPE31(284,s,a,b)
|
||||
#define PPC_EQV_(a,s,b) PPC_TYPE31(284,s,a,b)|PPC_RC
|
||||
#define PPC_EXTSB(a,s,b) PPC_TYPE31(954,s,a,b)
|
||||
#define PPC_EXTSB_(a,s,b) PPC_TYPE31(954,s,a,b)|PPC_RC
|
||||
#define PPC_EXTSH(a,s,b) PPC_TYPE31(922,s,a,b)
|
||||
#define PPC_EXTSH_(a,s,b) PPC_TYPE31(922,s,a,b)|PPC_RC
|
||||
#define PPC_ICBI(a,b) PPC_TYPE31(982,0,a,b)
|
||||
#define PPC_ISYNC() PPC_TYPE31(150,0,0,0)
|
||||
#define PPC_LBZUX(d,a,b) PPC_TYPE31(119,d,a,b)
|
||||
#define PPC_LBZX(d,a,b) PPC_TYPE31(87,d,a,b)
|
||||
#define PPC_LHAUX(d,a,b) PPC_TYPE31(375,d,a,b)
|
||||
#define PPC_LHAX(d,a,b) PPC_TYPE31(343,d,a,b)
|
||||
#define PPC_LHBRX(d,a,b) PPC_TYPE31(790,d,a,b)
|
||||
#define PPC_LHZUX(d,a,b) PPC_TYPE31(311,d,a,b)
|
||||
#define PPC_LHZX(d,a,b) PPC_TYPE31(279,d,a,b)
|
||||
#define PPC_LSWI(d,a,nb) PPC_TYPE31(597,d,a,nb)
|
||||
#define PPC_LSWX(d,a,b) PPC_TYPE31(533,d,a,b)
|
||||
#define PPC_LSARX(d,a,b) PPC_TYPE31(20,d,a,b)
|
||||
#define PPC_LSBRX(d,a,b) PPC_TYPE31(534,d,a,b)
|
||||
#define PPC_MCRXR(crd) PPC_TYPE31(512,(crd)<<2,0,0)
|
||||
#define PPC_MFCR(d) PPC_TYPE31(19,d,0,0)
|
||||
#define PPC_MFSPR(d,spr) PPC_TYPE31(339,d,(spr)&31,(spr)>>5)
|
||||
#define PPC_MFTB(d) PPC_TYPE31(371,d,12,8)
|
||||
#define PPC_MFTBU(d) PPC_TYPE31(371,d,13,8)
|
||||
#define PPC_MTCRF(mask,s) PPC_TYPE31(144,s,0,(mask)&0xff)
|
||||
#define PPC_MTSPR(s,spr) PPC_TYPE31(467,s,(spr)&31,(spr)>>5)
|
||||
#define PPC_MULHW(d,a,b) PPC_TYPE31(75,d,a,b)
|
||||
#define PPC_MULHW_(d,a,b) PPC_TYPE31(75,d,a,b)|PPC_RC
|
||||
#define PPC_MULHWU(d,a,b) PPC_TYPE31(11,d,a,b)
|
||||
#define PPC_MULHWU_(d,a,b) PPC_TYPE31(11,d,a,b)|PPC_RC
|
||||
#define PPC_MULLW(d,a,b) PPC_TYPE31(235,d,a,b)
|
||||
#define PPC_MULLW_(d,a,b) PPC_TYPE31(235,d,a,b)|PPC_RC
|
||||
#define PPC_MULLWO(d,a,b) PPC_TYPE31(235,d,a,b)|PPC_OE
|
||||
#define PPC_MULLWO_(d,a,b) PPC_TYPE31(235,d,a,b)|PPC_OE|PPC_RC
|
||||
#define PPC_NAND(a,s,b) PPC_TYPE31(476,s,a,b)
|
||||
#define PPC_NAND_(a,s,b) PPC_TYPE31(476,s,a,b)|PPC_RC
|
||||
#define PPC_NEG(d,a) PPC_TYPE31(104,d,a,b)
|
||||
#define PPC_NEG_(d,a) PPC_TYPE31(104,d,a,b)|PPC_RC
|
||||
#define PPC_NEGO(d,a) PPC_TYPE31(104,d,a,b)|PPC_OE
|
||||
#define PPC_NEGO_(d,a) PPC_TYPE31(104,d,a,b)|PPC_OE|PPC_RC
|
||||
#define PPC_NOR(a,s,b) PPC_TYPE31(124,s,a,b)
|
||||
#define PPC_NOR_(a,s,b) PPC_TYPE31(124,s,a,b)|PPC_RC
|
||||
#define PPC_OR(a,s,b) PPC_TYPE31(444,s,a,b)
|
||||
#define PPC_OR_(a,s,b) PPC_TYPE31(444,s,a,b)|PPC_RC
|
||||
#define PPC_ORC(a,s,b) PPC_TYPE31(412,s,a,b)
|
||||
#define PPC_ORC_(a,s,b) PPC_TYPE31(412,s,a,b)|PPC_RC
|
||||
#define PPC_SLW(a,s,b) PPC_TYPE31(24,s,a,b)
|
||||
#define PPC_SLW_(a,s,b) PPC_TYPE31(24,s,a,b)|PPC_RC
|
||||
#define PPC_SRAW(a,s,b) PPC_TYPE31(792,s,a,b)
|
||||
#define PPC_SRAW_(a,s,b) PPC_TYPE31(792,s,a,b)|PPC_RC
|
||||
#define PPC_SRAWI(a,s,sh) PPC_TYPE31(824,s,a,sh)
|
||||
#define PPC_SRAWI_(a,s,sh) PPC_TYPE31(824,s,a,sh)|PPC_RC
|
||||
#define PPC_SRW(a,s,b) PPC_TYPE31(536,s,a,b)
|
||||
#define PPC_SRW_(a,s,b) PPC_TYPE31(536,s,a,b)|PPC_RC
|
||||
#define PPC_STBUX(s,a,b) PPC_TYPE31(247,s,a,b)
|
||||
#define PPC_STBX(s,a,b) PPC_TYPE31(215,s,a,b)
|
||||
#define PPC_STHBRX(s,a,b) PPC_TYPE31(918,s,a,b)
|
||||
#define PPC_STHUX(s,a,b) PPC_TYPE31(439,s,a,b)
|
||||
#define PPC_STHX(s,a,b) PPC_TYPE31(407,s,a,b)
|
||||
#define PPC_STSWI(s,a,nb) PPC_TYPE31(725,s,a,nb)
|
||||
#define PPC_STSWX(s,a,b) PPC_TYPE31(661,s,a,b)
|
||||
#define PPC_STWBRX(s,a,b) PPC_TYPE31(662,s,a,b)
|
||||
#define PPC_STWCX_(s,a,b) PPC_TYPE31(150,s,a,b)|PPC_RC
|
||||
#define PPC_STWUX(s,a,b) PPC_TYPE31(183,s,a,b)
|
||||
#define PPC_STWX(s,a,b) PPC_TYPE31(151,s,a,b)
|
||||
#define PPC_SUBF(d,a,b) PPC_TYPE31(40,d,a,b)
|
||||
#define PPC_SUBF_(d,a,b) PPC_TYPE31(40,d,a,b)|PPC_RC
|
||||
#define PPC_SUBFO(d,a,b) PPC_TYPE31(40,d,a,b)|PPC_OE
|
||||
#define PPC_SUBFO_(d,a,b) PPC_TYPE31(40,d,a,b)|PPC_OE|PPC_RC
|
||||
#define PPC_SUB(d,b,a) PPC_SUBF(d,a,b)
|
||||
#define PPC_SUB_(d,b,a) PPC_SUBF_(d,a,b)
|
||||
#define PPC_SUBO(d,b,a) PPC_SUBFO(d,a,b)
|
||||
#define PPC_SUBO_(d,b,a) PPC_SUBFO_(d,a,b)
|
||||
#define PPC_SUBFC(d,a,b) PPC_TYPE31(8,d,a,b)
|
||||
#define PPC_SUBFC_(d,a,b) PPC_TYPE31(8,d,a,b)|PPC_RC
|
||||
#define PPC_SUBFCO(d,a,b) PPC_TYPE31(8,d,a,b)|PPC_OE
|
||||
#define PPC_SUBFCO_(d,a,b) PPC_TYPE31(8,d,a,b)|PPC_OE|PPC_RC
|
||||
#define PPC_SUBFE(d,a,b) PPC_TYPE31(136,d,a,b)
|
||||
#define PPC_SUBFE_(d,a,b) PPC_TYPE31(136,d,a,b)|PPC_RC
|
||||
#define PPC_SUBFEO(d,a,b) PPC_TYPE31(136,d,a,b)|PPC_OE
|
||||
#define PPC_SUBFEO_(d,a,b) PPC_TYPE31(136,d,a,b)|PPC_OE|PPC_RC
|
||||
#define PPC_SUBFME(d,a) PPC_TYPE31(232,d,a,0)
|
||||
#define PPC_SUBFME_(d,a) PPC_TYPE31(232,d,a,0)|PPC_RC
|
||||
#define PPC_SUBFMEO(d,a) PPC_TYPE31(232,d,a,0)|PPC_OE
|
||||
#define PPC_SUBFMEO_(d,a) PPC_TYPE31(232,d,a,0)|PPC_OE|PPC_RC
|
||||
#define PPC_SUBFZE(d,a) PPC_TYPE31(200,d,a,0)
|
||||
#define PPC_SUBFZE_(d,a) PPC_TYPE31(200,d,a,0)|PPC_RC
|
||||
#define PPC_SUBFZEO(d,a) PPC_TYPE31(200,d,a,0)|PPC_OE
|
||||
#define PPC_SUBFZEO_(d,a) PPC_TYPE31(200,d,a,0)|PPC_OE|PPC_RC
|
||||
#define PPC_SYNC() PPC_TYPE31(598,0,0,0)
|
||||
#define PPC_TW(to,a,b) PPC_TYPE31(4,to,a,b)
|
||||
#define PPC_XOR(a,s,b) PPC_TYPE31(316,s,a,b)
|
||||
|
||||
/* Immediate-operand instructions. Take a 16-bit immediate operand */
|
||||
#define PPC_IMM(major,d,a,imm) \
|
||||
PPC_MAJOR(major)|PPC_DEST(d)|PPC_SRCA(a)|((imm)&0xffff)
|
||||
/* Trap word immediate */
|
||||
#define PPV_TWI(to,a,simm) PPC_IMM(3,to,a,simm)
|
||||
/* Integer arithmetic */
|
||||
#define PPC_MULLI(d,a,simm) PPC_IMM(7,d,a,simm)
|
||||
#define PPC_SUBFIC(s,a,simm) PPC_IMM(8,s,a,simm)
|
||||
#define PPC_CMPLI(cr,a,uimm) PPC_IMM(10,(cr)<<2,a,uimm)
|
||||
#define PPC_CMPI(cr,a,simm) PPC_IMM(11,(cr)<<2,a,simm)
|
||||
#define PPC_ADDIC(d,a,simm) PPC_IMM(12,d,a,simm)
|
||||
#define PPC_ADDIC_(d,a,simm) PPC_IMM(13,d,a,simm)
|
||||
#define PPC_ADDI(d,a,simm) PPC_IMM(14,d,a,simm)
|
||||
#define PPC_ADDIS(d,a,simm) PPC_IMM(15,d,a,simm)
|
||||
|
||||
/* Conditional branch (dest is 16 bits, +/- 2^15 bytes) */
|
||||
#define PPC_BC(bo,bi,dest) PPC_IMM(16,bo,bi,((dest)<<2)&0xfffc)
|
||||
#define PPC_BCA(bo,bi,dest) PPC_BC(bo,bi,dest)|PPC_AA
|
||||
#define PPC_BCL(bo,bi,dest) PPC_BC(bo,bi,dest)|PPC_LK
|
||||
#define PPC_BCLA(bo,bi,dest) PPC_BC(bo,bi,dest)|PPC_AA|PPC_LK
|
||||
|
||||
/* Logical operations */
|
||||
#define PPC_ORI(a,s,uimm) PPC_IMM(24,s,a,uimm)
|
||||
#define PPC_ORIS(a,s,uimm) PPC_IMM(25,s,a,uimm)
|
||||
#define PPC_XORI(a,s,uimm) PPC_IMM(26,s,a,uimm)
|
||||
#define PPC_XORIS(a,s,uimm) PPC_IMM(27,s,a,uimm)
|
||||
#define PPC_ANDI_(a,s,uimm) PPC_IMM(28,s,a,uimm)
|
||||
#define PPC_ANDIS(a,s,uimm) PPC_IMM(29,s,a,uimm)
|
||||
|
||||
/* Load/store */
|
||||
#define PPC_LWZ(d,a,simm) PPC_IMM(32,d,a,simm)
|
||||
#define PPC_LWZU(d,a,simm) PPC_IMM(33,d,a,simm)
|
||||
#define PPC_LBZ(d,a,simm) PPC_IMM(34,d,a,simm)
|
||||
#define PPC_LBZU(d,a,simm) PPC_IMM(35,d,a,simm)
|
||||
#define PPC_STW(s,a,simm) PPC_IMM(36,s,a,simm)
|
||||
#define PPC_STWU(s,a,simm) PPC_IMM(37,s,a,simm)
|
||||
#define PPC_STB(s,a,simm) PPC_IMM(38,s,a,simm)
|
||||
#define PPC_STBU(s,a,simm) PPC_IMM(39,s,a,simm)
|
||||
#define PPC_LHZ(d,a,simm) PPC_IMM(40,d,a,simm)
|
||||
#define PPC_LHZU(d,a,simm) PPC_IMM(41,d,a,simm)
|
||||
#define PPC_LHA(d,a,simm) PPC_IMM(42,d,a,simm)
|
||||
#define PPC_STH(s,a,simm) PPC_IMM(44,s,a,simm)
|
||||
#define PPC_STHU(s,a,simm) PPC_IMM(45,s,a,simm)
|
||||
#define PPC_LHAU(d,a,simm) PPC_IMM(43,d,a,simm)
|
||||
#define PPC_LMW(d,a,simm) PPC_IMM(46,d,a,simm)
|
||||
#define PPC_STMW(s,a,simm) PPC_IMM(47,s,a,simm)
|
||||
|
||||
/* Major number = 19 - condition register operations. d, a and b are CR bits */
|
||||
#define PPC_TYPE19(minor,d,a,b) \
|
||||
PPC_MAJOR(19)|PPC_DEST(d)|PPC_SRCA(a)|PPC_SRCB(b)|PPC_MINOR(minor)
|
||||
#define PPC_MCRF(d,s) PPC_TYPE19(0,(d)<<2,(s)<<2,0)
|
||||
#define PPC_CRNOR(d,a,b) PPC_TYPE19(33,d,a,b)
|
||||
#define PPC_CRANDC(d,a,b) PPC_TYPE19(129,d,a,b)
|
||||
#define PPC_CRXOR(d,a,b) PPC_TYPE19(193,d,a,b)
|
||||
#define PPC_CRNAND(d,a,b) PPC_TYPE19(225,d,a,b)
|
||||
#define PPC_CRAND(d,a,b) PPC_TYPE19(257,d,a,b)
|
||||
#define PPC_CREQV(d,a,b) PPC_TYPE19(289,d,a,b)
|
||||
#define PPC_CRORC(d,a,b) PPC_TYPE19(417,d,a,b)
|
||||
#define PPC_CROR(d,a,b) PPC_TYPE19(449,d,a,b)
|
||||
|
||||
/* Indirect conditional branch */
|
||||
#define PPC_BCLR(bo,bi) PPC_TYPE19(16,bo,bi,0)
|
||||
#define PPC_BCLRL(bo,bi) PPC_TYPE19(16,bo,bi,0)|PPC_LK
|
||||
#define PPC_BCCTR(bo,bi) PPC_TYPE19(528,bo,bi,0)
|
||||
#define PPC_BCCTRL(bo,bi) PPC_TYPE19(528,bo,bi,0)|PPC_LK
|
||||
#define PPC_BLR() PPC_BCLR(20,31)
|
||||
#define PPC_BCTR() PPC_BCCTR(20,31)
|
||||
|
||||
/* Other */
|
||||
#define PPC_RLWIMI(a,s,sh,mb,me) \
|
||||
PPC_MAJOR(20)|PPC_DEST(s)|PPC_SRCA(A)|PPC_SRCB(sh)|(mb)<<6|(me)<<1
|
||||
#define PPC_RLWIMI_(a,s,sh,mb,me) PPC_RLWIMI(a,s,sh,mb,me)|PPC_RC
|
||||
#define PPC_RLWINM(a,s,sh,mb,me) \
|
||||
PPC_MAJOR(21)|PPC_DEST(s)|PPC_SRCA(A)|PPC_SRCB(sh)|(mb)<<6|(me)<<1
|
||||
#define PPC_RLWINM_(a,s,sh,mb,me) PPC_RLWINM(a,s,sh,mb,me)|PPC_RC
|
||||
#define PPC_RLWNM(a,s,b,mb,me) \
|
||||
PPC_MAJOR(23)|PPC_DEST(s)|PPC_SRCA(A)|PPC_SRCB(b)|(mb)<<6|(me)<<1
|
||||
#define PPC_RLWNM_(a,s,b,mb,me) PPC_RLWNM(a,s,b,mb,me)|PPC_RC
|
||||
|
||||
#define PPC_SC() PPC_MAJOR(17)|2
|
||||
/* Major number = 63 Floating-point operations (not implemented for now) */
|
||||
|
||||
/* Simplified Mnemonics */
|
||||
/* Fabricate immediate subtract out of add negative */
|
||||
#define PPC_SUBI(d,a,simm) PPC_ADDI(d,a,-(simm))
|
||||
#define PPC_SUBIS(d,a,simm) PPC_ADDIS(d,a,-(simm))
|
||||
#define PPC_SUBIC(d,a,simm) PPC_ADDIC(d,a,-(simm))
|
||||
#define PPC_SUBIC_(d,a,simm) PPC_ADDIC_(d,a,-(simm))
|
||||
/* Fabricate subtract out of subtract from */
|
||||
#define PPC_SUBC(d,b,a) PPC_SUBFC(d,a,b)
|
||||
#define PPC_SUBC_(d,b,a) PPC_SUBFC_(d,a,b)
|
||||
#define PPC_SUBCO(d,b,a) PPC_SUBFCO(d,a,b)
|
||||
#define PPC_SUBCO_(d,b,a) PPC_SUBFCO_(d,a,b)
|
||||
/* Messy compare bits omitted */
|
||||
/* Shift and rotate omitted */
|
||||
/* Branch coding omitted */
|
||||
#define PPC_CRSET(d) PPC_CREQV(d,d,d)
|
||||
#define PPC_CRCLR(d) PPC_CRXOR(d,d,d)
|
||||
#define PPC_CRMOVE(d,s) PPC_CROR(d,s,s)
|
||||
#define PPC_CRNOT(d,s) PPC_CRNOR(d,s,s)
|
||||
/* Trap menmonics omitted */
|
||||
/* Menmonics for user-accessible SPRs */
|
||||
#define PPC_MFXER(d) PPC_MFSPR(d,1)
|
||||
#define PPC_MFLR(d) PPC_MFSPR(d,8)
|
||||
#define PPC_MFCTR(d) PPC_MFSPR(d,9)
|
||||
#define PPC_MTXER(s) PPC_MTSPR(s,1)
|
||||
#define PPC_MTLR(s) PPC_MTSPR(s,8)
|
||||
#define PPC_MTCTR(s) PPC_MTSPR(s,9)
|
||||
/* Recommended mnemonics */
|
||||
#define PPC_NOP() PPC_ORI(0,0,0)
|
||||
#define PPC_LI(d,simm) PPC_ADDI(d,0,simm)
|
||||
#define PPC_LIS(d,simm) PPC_ADDIS(d,0,simm)
|
||||
#define PPC_LA(d,a,simm) PPC_ADDI(d,a,simm)
|
||||
#define PPC_MR(d,s) PPC_OR(d,s,s)
|
||||
#define PPC_NOT(d,s) PPC_NOR(d,s,s)
|
||||
#define PPC_MTCR(s) PPC_MTCRF(0xff,s)
|
||||
|
||||
#endif /* PPCASM_H */
|
||||
|
||||
/* 45678901234567890123456789012345678901234567890123456789012345678901234567 */
|
||||
|
|
@ -1,333 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* FILENAME: rand.c PRODUCT NAME: CRYPTOGRAPHIC TOOLKIT
|
||||
*
|
||||
* FILE STATUS:
|
||||
*
|
||||
* DESCRIPTION: Cryptographic Toolkit Functions File
|
||||
* Random Number Generation Files
|
||||
* PUBLIC FUNCTIONS:
|
||||
* int InitRand( u_int16_t SEED_bytes, uchar *SEED,
|
||||
* uchar *RVAL )
|
||||
* int GenRand( u_int16_t A_bytes, uchar *A,
|
||||
* uchar *RVAL )
|
||||
* int MyGenRand( u_int16_t A_bytes,
|
||||
* ord *A,
|
||||
* ord *RVAL )
|
||||
|
||||
* Copyright (c) Cylink Corporation 1994. All rights reserved.
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 10 Oct 94 KPZ Added Shamir Key Sharing functions
|
||||
* 10 Oct 94 KPZ Modified SHA functions for arbitrary message length
|
||||
* 12 Oct 94 KPZ Modified SHA functions (new standard)
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
* 26 Oct 94 GKL (alignment for big endian support & ERR_ALLOC)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* INCLUDE FILES
|
||||
****************************************************************************/
|
||||
|
||||
#include "port_before.h"
|
||||
|
||||
/* system files */
|
||||
#ifdef VXD
|
||||
#include <vtoolsc.h>
|
||||
#else
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
/* program files */
|
||||
#ifdef VXD
|
||||
#include "tkvxd.h"
|
||||
#endif
|
||||
#include "cylink.h"
|
||||
#include "ctk_endian.h"
|
||||
#include "toolkit.h"
|
||||
#include "cencrint.h"
|
||||
#include "sha.h"
|
||||
|
||||
#include "port_after.h"
|
||||
extern u_int16_t DataOrder;
|
||||
/****************************************************************************
|
||||
* PUBLIC FUNCTIONS DEFINITIONS
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: int InitRand( u_int16_t SEED_bytes,
|
||||
* uchar *SEED,
|
||||
* uchar *RVAL)
|
||||
*
|
||||
* DESCRIPTION: Initialize Random number Generator
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* u_int16_t SEED_bytes Length of SEED
|
||||
* uchar *SEED Pointer to SEED value
|
||||
*
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* uchar *RVAL Pointer to RVAL
|
||||
*
|
||||
* RETURN:
|
||||
* SUCCESS No errors
|
||||
* ERR_INPUT_LEN Invalid length for input data
|
||||
* ERR_DATA Generic data error
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int InitRand( u_int16_t SEED_bytes,
|
||||
uchar *SEED,
|
||||
uchar *RVAL )
|
||||
{
|
||||
int status = SUCCESS; /* function return status */
|
||||
if ( SEED_bytes == 0 )
|
||||
{
|
||||
status = ERR_INPUT_LEN;
|
||||
return status;
|
||||
}
|
||||
if ( SEED_bytes < SHA_LENGTH )
|
||||
{
|
||||
status = ERR_DATA;
|
||||
return status;
|
||||
}
|
||||
memcpy( RVAL, SEED, SHA_LENGTH);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: int GenRand( u_int16_t A_bytes,
|
||||
* uchar *A,
|
||||
* uchar *RVAL)
|
||||
*
|
||||
* DESCRIPTION: Generate random number.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* u_int16_t A_bytes Length of A
|
||||
* uchar *A Pointer to A value
|
||||
*
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* uchar *RVAL Pointer to RVAL
|
||||
*
|
||||
* RETURN:
|
||||
* SUCCESS No errors
|
||||
* ERR_INPUT_LEN Invalid length for input data
|
||||
* ERR_DATA Generic data error
|
||||
* ERR_ALLOC Insufficient memory
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
* 26 Oct 94 GKL (alignment for big endian support & ERR_ALLOC)
|
||||
*
|
||||
****************************************************************************/
|
||||
int GenRand( u_int16_t A_bytes,
|
||||
uchar *A,
|
||||
uchar *RVAL )
|
||||
{
|
||||
int status = SUCCESS; /* function return status */
|
||||
ord *RVAL_a;
|
||||
SHA_context hash_context; /* SHA context structure */
|
||||
uchar M[DSS_LENGTH_MIN]; /* message block */
|
||||
uchar hash_result[SHA_LENGTH];
|
||||
u_int16_t i;
|
||||
u_int16_t sha_block; /* number of sha blocks */
|
||||
u_int16_t sha_rem; /* size of last block */
|
||||
if ( A_bytes == 0 )
|
||||
{
|
||||
status = ERR_INPUT_LEN;
|
||||
return status;
|
||||
}
|
||||
sha_block = (u_int16_t) (A_bytes / SHA_LENGTH); /* number of sha blocks */
|
||||
sha_rem = (u_int16_t) (A_bytes % SHA_LENGTH); /* size of last block */
|
||||
if ( sha_rem == 0 ) /* last block = SHA_LENGTH */
|
||||
{
|
||||
sha_block--;
|
||||
}
|
||||
for ( i = 0; i <= sha_block; i++)
|
||||
{
|
||||
SHAInit ( &hash_context );
|
||||
memcpy( M, RVAL, SHA_LENGTH);
|
||||
memset( M + SHA_LENGTH, 0, DSS_LENGTH_MIN - SHA_LENGTH );
|
||||
if ( (status = SHAUpdate( &hash_context, M, DSS_LENGTH_MIN ))
|
||||
!= SUCCESS )
|
||||
{
|
||||
return status; /* error */
|
||||
}
|
||||
if ( (status=MySHAFinal (&hash_context, hash_result )) != SUCCESS )
|
||||
{
|
||||
return status; /* error */
|
||||
}
|
||||
|
||||
BigSwap(RVAL, SHA_LENGTH);
|
||||
ALIGN_CALLOC_COPY(RVAL, RVAL_a, SHA_LENGTH);
|
||||
if ( status != SUCCESS )
|
||||
{
|
||||
ALIGN_COPY_FREE(RVAL_a,RVAL,SHA_LENGTH);
|
||||
BigSwap(RVAL, SHA_LENGTH);
|
||||
return status; /* ERR_ALLOC insufficient memory */
|
||||
}
|
||||
Sum_Q( RVAL_a, 1, SHA_LENGTH / sizeof(ord) );
|
||||
Sum_big( RVAL_a, /* RVAL=RVAL+hash_result*/
|
||||
(ord *)hash_result,
|
||||
RVAL_a, SHA_LENGTH / sizeof(ord) );
|
||||
ALIGN_COPY_FREE(RVAL_a,RVAL,SHA_LENGTH);
|
||||
BigSwap(RVAL, SHA_LENGTH);
|
||||
#ifdef CTK_BIG_ENDIAN
|
||||
ByteSwap(hash_result,SHA_LENGTH);
|
||||
#endif
|
||||
BigSwap(hash_result, SHA_LENGTH);
|
||||
if ( i == sha_block && sha_rem != 0 ) /* last block < SHA_LENGTH*/
|
||||
{
|
||||
memcpy( A + i * SHA_LENGTH, hash_result,
|
||||
sha_rem * sizeof (uchar));
|
||||
}
|
||||
else /* last block = SHA_LENGTH*/
|
||||
{
|
||||
memcpy( A + i * SHA_LENGTH, hash_result,
|
||||
SHA_LENGTH * sizeof (uchar));
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: int MyGenRand( u_int16_t A_bytes,
|
||||
* ord *A,
|
||||
* ord *RVAL)
|
||||
*
|
||||
* DESCRIPTION: Generate random number.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* u_int16_t A_bytes Length of A
|
||||
* ord *A Pointer to A value
|
||||
*
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* ord *RVAL Pointer to RVAL
|
||||
*
|
||||
* RETURN:
|
||||
* SUCCESS No errors
|
||||
* ERR_INPUT_LEN Invalid length for input data
|
||||
* ERR_DATA Generic data error
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
int MyGenRand( u_int16_t A_bytes,
|
||||
ord *A,
|
||||
ord *RVAL )
|
||||
{
|
||||
int status = SUCCESS; /* function return status */
|
||||
SHA_context hash_context; /* SHA context structure */
|
||||
uchar M[DSS_LENGTH_MIN]; /* message block */
|
||||
uchar hash_result[SHA_LENGTH];
|
||||
u_int16_t i;
|
||||
u_int16_t sha_block; /* number of sha blocks */
|
||||
u_int16_t sha_rem; /* size of last block */
|
||||
if ( A_bytes == 0 )
|
||||
{
|
||||
status = ERR_INPUT_LEN;
|
||||
return status;
|
||||
}
|
||||
sha_block = (u_int16_t) (A_bytes / SHA_LENGTH); /* number of sha blocks */
|
||||
sha_rem = (u_int16_t) (A_bytes % SHA_LENGTH); /* size of last block */
|
||||
if ( sha_rem == 0 ) /* last block = SHA_LENGTH */
|
||||
{
|
||||
sha_block--;
|
||||
}
|
||||
for ( i = 0; i <= sha_block; i++)
|
||||
{
|
||||
SHAInit ( &hash_context );
|
||||
memcpy( M, RVAL, SHA_LENGTH);
|
||||
memset( M + SHA_LENGTH, 0, DSS_LENGTH_MIN - SHA_LENGTH );
|
||||
if ( (status = SHAUpdate( &hash_context, M, DSS_LENGTH_MIN ))
|
||||
!= SUCCESS )
|
||||
{
|
||||
return status; /* error */
|
||||
}
|
||||
if ( (status=MySHAFinal (&hash_context, hash_result )) != SUCCESS )
|
||||
{
|
||||
return status; /* error */
|
||||
}
|
||||
#ifdef CTK_BIG_ENDIAN
|
||||
ByteSwap((uchar*)RVAL,SHA_LENGTH);
|
||||
#endif
|
||||
BigSwap((uchar*)RVAL, SHA_LENGTH);
|
||||
Sum_Q(RVAL, 1,SHA_LENGTH / sizeof(ord));
|
||||
Sum_big( RVAL, /* RVAL=RVAL+hash_result*/
|
||||
(ord*)hash_result,
|
||||
RVAL, SHA_LENGTH / sizeof(ord) );
|
||||
BigSwap((uchar*)RVAL, SHA_LENGTH);
|
||||
#ifdef CTK_BIG_ENDIAN
|
||||
ByteSwap((uchar*)RVAL,SHA_LENGTH);
|
||||
#endif
|
||||
if ( i == sha_block && sha_rem != 0 ) /* last block < SHA_LENGTH*/
|
||||
{
|
||||
memcpy( &A[ i*SHA_LENGTH / sizeof(ord)], hash_result,
|
||||
sha_rem * sizeof (uchar));
|
||||
}
|
||||
else /* last block = SHA_LENGTH*/
|
||||
{
|
||||
memcpy( &A[ i*SHA_LENGTH / sizeof(ord)], hash_result,
|
||||
SHA_LENGTH * sizeof (uchar));
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1,698 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* FILENAME: cencrint.c PRODUCT NAME: CRYPTOGRAPHIC TOOLKIT
|
||||
*
|
||||
* FILE STATUS:
|
||||
*
|
||||
* DESCRIPTION: Cryptographic Toolkit Internal Functions File
|
||||
*
|
||||
* PRIVATE FUNCTIONS:
|
||||
*
|
||||
*
|
||||
* void shaTransform( u_int32_t *state, uchar *block )
|
||||
* void SHAInitK( SHA_context *hash_context )
|
||||
* int MySHA( uchar *message, u_int16_t message_bytes,
|
||||
* uchar *hash_result )
|
||||
* int MySHAFinal( SHA_context *hash_context, uchar *hash_result )
|
||||
*
|
||||
*
|
||||
* Copyright (c) Cylink Corporation 1994. All rights reserved.
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 10 Oct 94 KPZ Fixed bugs in Add(), DivRem()
|
||||
* 12 Oct 94 KPZ Modified shaTransform()
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
* 26 Oct 94 GKL (alignment for big endian support & ERR_ALLOC)
|
||||
* 08 Nov 94 GKL Added input parameters check to Inverse
|
||||
* 08 Dec 94 GKL Added YIELD_context to Expo, VerPrime and GenPrime
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* INCLUDE FILES
|
||||
****************************************************************************/
|
||||
|
||||
#include "port_before.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
/* system files */
|
||||
#ifdef VXD
|
||||
#include <vtoolsc.h>
|
||||
#else
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
/* program files */
|
||||
#include "cylink.h"
|
||||
#include "ctk_endian.h"
|
||||
#include "toolkit.h"
|
||||
#include "cencrint.h"
|
||||
#include "sha.h"
|
||||
#include "port_after.h"
|
||||
extern u_int16_t DataOrder;
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: int SHA( uchar *message,
|
||||
* u_int16_t message_bytes,
|
||||
* uchar *hash_result )
|
||||
*
|
||||
* DESCRIPTION: Compute a Secure Hash Function.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* uchar *message Pointer to message
|
||||
* u_int16_t message_bytes Number of bytes in message
|
||||
* uchar *hash_result Pointer to message digest
|
||||
*
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* uchar *hash_result Message digest
|
||||
*
|
||||
* RETURN:
|
||||
* SUCCESS No errors
|
||||
* ERR_INPUT_LEN Invalid length for input data(zero bytes)
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int SHA( uchar *message,
|
||||
u_int16_t message_bytes,
|
||||
uchar *hash_result )
|
||||
{
|
||||
SHA_context hash_context; /* SHA context structure */
|
||||
int status = SUCCESS; /* function return status */
|
||||
if (message_bytes == 0 )
|
||||
{
|
||||
status = ERR_INPUT_LEN;
|
||||
return status; /* invalid length for input data */
|
||||
}
|
||||
SHAInit ( &hash_context ); /* initialize SHA */
|
||||
if ( (status = SHAUpdate( &hash_context, message, message_bytes ))
|
||||
!= SUCCESS )
|
||||
{
|
||||
return status; /* error */
|
||||
}
|
||||
if ((status=SHAFinal (&hash_context, hash_result)) != SUCCESS )
|
||||
{
|
||||
return status; /* error */
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* PRIVATE FUNCTIONS DEFINITIONS
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: void shaTransform( u_int32_t *state,
|
||||
* uchar *block )
|
||||
*
|
||||
* DESCRIPTION: Perform SHS transformation.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* SHA_context *hash_context Pointer to SHA_context structure
|
||||
* OUTPUT:
|
||||
*
|
||||
* SHA_context *hash_context Pointer to SHA_context structure
|
||||
* (updated)
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 sep 94 KPZ Initial release
|
||||
* 12 Oct 94 KPZ Modified buffers copy
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
* 1 Sep 95 AAB Speedup the function
|
||||
****************************************************************************/
|
||||
|
||||
void shaTransform( u_int32_t *state,
|
||||
const uchar *block )
|
||||
{
|
||||
u_int32_t W[80];
|
||||
u_int32_t A,B,C,D,E; /*,temp;*/
|
||||
memcpy( W, block, 64); /*TKL00201*/
|
||||
#ifdef CTK_LITTLE_ENDIAN /*TKL00201*/
|
||||
ByteSwap32( (uchar *)W, 64); /*TKL00201*/
|
||||
#endif /*TKL00201*/
|
||||
/* Expand the 16 words into 80 words */
|
||||
expand(16);expand(17);expand(18);expand(19);expand(20);expand(21);
|
||||
expand(22);expand(23);expand(24);expand(25);expand(26);expand(27);
|
||||
expand(28);expand(29);expand(30);expand(31);expand(32);expand(33);
|
||||
expand(34);expand(35);expand(36);expand(37);expand(38);expand(39);
|
||||
expand(40);expand(41);expand(42);expand(43);expand(44);expand(45);
|
||||
expand(46);expand(47);expand(48);expand(49);expand(50);expand(51);
|
||||
expand(52);expand(53);expand(54);expand(55);expand(56);expand(57);
|
||||
expand(58);expand(59);expand(60);expand(61);expand(62);expand(63);
|
||||
expand(64);expand(65);expand(66);expand(67);expand(68);expand(69);
|
||||
expand(70);expand(71);expand(72);expand(73);expand(74);expand(75);
|
||||
expand(76);expand(77);expand(78);expand(79);
|
||||
/*Set up first buffer*/
|
||||
A = state[0];
|
||||
B = state[1];
|
||||
C = state[2];
|
||||
D = state[3];
|
||||
E = state[4];
|
||||
|
||||
/* Heavy mangling, in 4 sub-rounds of 20 iterations each. */
|
||||
subRound( A, B, C, D, E, f1, k1SHA, W[ 0] );
|
||||
subRound( E, A, B, C, D, f1, k1SHA, W[ 1] );
|
||||
subRound( D, E, A, B, C, f1, k1SHA, W[ 2] );
|
||||
subRound( C, D, E, A, B, f1, k1SHA, W[ 3] );
|
||||
subRound( B, C, D, E, A, f1, k1SHA, W[ 4] );
|
||||
subRound( A, B, C, D, E, f1, k1SHA, W[ 5] );
|
||||
subRound( E, A, B, C, D, f1, k1SHA, W[ 6] );
|
||||
subRound( D, E, A, B, C, f1, k1SHA, W[ 7] );
|
||||
subRound( C, D, E, A, B, f1, k1SHA, W[ 8] );
|
||||
subRound( B, C, D, E, A, f1, k1SHA, W[ 9] );
|
||||
subRound( A, B, C, D, E, f1, k1SHA, W[10] );
|
||||
subRound( E, A, B, C, D, f1, k1SHA, W[11] );
|
||||
subRound( D, E, A, B, C, f1, k1SHA, W[12] );
|
||||
subRound( C, D, E, A, B, f1, k1SHA, W[13] );
|
||||
subRound( B, C, D, E, A, f1, k1SHA, W[14] );
|
||||
subRound( A, B, C, D, E, f1, k1SHA, W[15] );
|
||||
subRound( E, A, B, C, D, f1, k1SHA, W[16] );
|
||||
subRound( D, E, A, B, C, f1, k1SHA, W[17] );
|
||||
subRound( C, D, E, A, B, f1, k1SHA, W[18] );
|
||||
subRound( B, C, D, E, A, f1, k1SHA, W[19] );
|
||||
|
||||
subRound( A, B, C, D, E, f2, k2SHA, W[20]);
|
||||
subRound( E, A, B, C, D, f2, k2SHA, W[21]);
|
||||
subRound( D, E, A, B, C, f2, k2SHA, W[22]);
|
||||
subRound( C, D, E, A, B, f2, k2SHA, W[23]);
|
||||
subRound( B, C, D, E, A, f2, k2SHA, W[24]);
|
||||
subRound( A, B, C, D, E, f2, k2SHA, W[25]);
|
||||
subRound( E, A, B, C, D, f2, k2SHA, W[26]);
|
||||
subRound( D, E, A, B, C, f2, k2SHA, W[27]);
|
||||
subRound( C, D, E, A, B, f2, k2SHA, W[28]);
|
||||
subRound( B, C, D, E, A, f2, k2SHA, W[29]);
|
||||
subRound( A, B, C, D, E, f2, k2SHA, W[30]);
|
||||
subRound( E, A, B, C, D, f2, k2SHA, W[31]);
|
||||
subRound( D, E, A, B, C, f2, k2SHA, W[32]);
|
||||
subRound( C, D, E, A, B, f2, k2SHA, W[33]);
|
||||
subRound( B, C, D, E, A, f2, k2SHA, W[34]);
|
||||
subRound( A, B, C, D, E, f2, k2SHA, W[35]);
|
||||
subRound( E, A, B, C, D, f2, k2SHA, W[36]);
|
||||
subRound( D, E, A, B, C, f2, k2SHA, W[37]);
|
||||
subRound( C, D, E, A, B, f2, k2SHA, W[38]);
|
||||
subRound( B, C, D, E, A, f2, k2SHA, W[39]);
|
||||
|
||||
subRound( A, B, C, D, E, f3, k3SHA, W[40]);
|
||||
subRound( E, A, B, C, D, f3, k3SHA, W[41]);
|
||||
subRound( D, E, A, B, C, f3, k3SHA, W[42]);
|
||||
subRound( C, D, E, A, B, f3, k3SHA, W[43]);
|
||||
subRound( B, C, D, E, A, f3, k3SHA, W[44]);
|
||||
subRound( A, B, C, D, E, f3, k3SHA, W[45]);
|
||||
subRound( E, A, B, C, D, f3, k3SHA, W[46]);
|
||||
subRound( D, E, A, B, C, f3, k3SHA, W[47]);
|
||||
subRound( C, D, E, A, B, f3, k3SHA, W[48]);
|
||||
subRound( B, C, D, E, A, f3, k3SHA, W[49]);
|
||||
subRound( A, B, C, D, E, f3, k3SHA, W[50]);
|
||||
subRound( E, A, B, C, D, f3, k3SHA, W[51]);
|
||||
subRound( D, E, A, B, C, f3, k3SHA, W[52]);
|
||||
subRound( C, D, E, A, B, f3, k3SHA, W[53]);
|
||||
subRound( B, C, D, E, A, f3, k3SHA, W[54]);
|
||||
subRound( A, B, C, D, E, f3, k3SHA, W[55]);
|
||||
subRound( E, A, B, C, D, f3, k3SHA, W[56]);
|
||||
subRound( D, E, A, B, C, f3, k3SHA, W[57]);
|
||||
subRound( C, D, E, A, B, f3, k3SHA, W[58]);
|
||||
subRound( B, C, D, E, A, f3, k3SHA, W[59]);
|
||||
|
||||
subRound( A, B, C, D, E, f4, k4SHA, W[60]);
|
||||
subRound( E, A, B, C, D, f4, k4SHA, W[61]);
|
||||
subRound( D, E, A, B, C, f4, k4SHA, W[62]);
|
||||
subRound( C, D, E, A, B, f4, k4SHA, W[63]);
|
||||
subRound( B, C, D, E, A, f4, k4SHA, W[64]);
|
||||
subRound( A, B, C, D, E, f4, k4SHA, W[65]);
|
||||
subRound( E, A, B, C, D, f4, k4SHA, W[66]);
|
||||
subRound( D, E, A, B, C, f4, k4SHA, W[67]);
|
||||
subRound( C, D, E, A, B, f4, k4SHA, W[68]);
|
||||
subRound( B, C, D, E, A, f4, k4SHA, W[69]);
|
||||
subRound( A, B, C, D, E, f4, k4SHA, W[70]);
|
||||
subRound( E, A, B, C, D, f4, k4SHA, W[71]);
|
||||
subRound( D, E, A, B, C, f4, k4SHA, W[72]);
|
||||
subRound( C, D, E, A, B, f4, k4SHA, W[73]);
|
||||
subRound( B, C, D, E, A, f4, k4SHA, W[74]);
|
||||
subRound( A, B, C, D, E, f4, k4SHA, W[75]);
|
||||
subRound( E, A, B, C, D, f4, k4SHA, W[76]);
|
||||
subRound( D, E, A, B, C, f4, k4SHA, W[77]);
|
||||
subRound( C, D, E, A, B, f4, k4SHA, W[78]);
|
||||
subRound( B, C, D, E, A, f4, k4SHA, W[79]);
|
||||
|
||||
state[0] += A;
|
||||
state[1] += B;
|
||||
state[2] += C;
|
||||
state[3] += D;
|
||||
state[4] += E;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: void SHAInitK( SHA_context *hash_context )
|
||||
*
|
||||
* DESCRIPTION: Initialize Secure Hash Function for generate
|
||||
* random number for DSS.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* SHA_context *hash_context SHA context structure
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* SHA_context *hash_context Initialized SHA context structure
|
||||
*
|
||||
* RETURN:
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void SHAInitK( SHA_context *hash_context )
|
||||
{
|
||||
/*Set up first buffer*/
|
||||
hash_context->state[0] = 0xEFCDAB89L;
|
||||
hash_context->state[1] = 0x98BADCFEL;
|
||||
hash_context->state[2] = 0x10325476L;
|
||||
hash_context->state[3] = 0xC3D2E1F0L;
|
||||
hash_context->state[4] = 0x67452301L;
|
||||
/*Initialise buffer */
|
||||
memset( hash_context->buffer, 0, sizeof(hash_context->buffer));
|
||||
memset( hash_context->count, 0, sizeof(hash_context->count));
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: int MySHA( uchar *message,
|
||||
* u_int16_t message_bytes,
|
||||
* uchar *hash_result )
|
||||
*
|
||||
* DESCRIPTION: Compute a Secure Hash Function.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* uchar *message Pointer to message
|
||||
* u_int16_t message_bytes Number of bytes in message
|
||||
* uchar *hash_result Pointer to message digest
|
||||
*
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* uchar *hash_result Message digest
|
||||
*
|
||||
* RETURN:
|
||||
* SUCCESS No errors
|
||||
* ERR_INPUT_LEN Invalid length for input data(zero bytes)
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
*
|
||||
****************************************************************************/
|
||||
int MySHA( uchar *message,
|
||||
u_int16_t message_bytes,
|
||||
uchar *hash_result )
|
||||
{
|
||||
SHA_context hash_context; /* SHA context structure */
|
||||
int status = SUCCESS; /* function return status */
|
||||
if (message_bytes == 0 )
|
||||
{
|
||||
status = ERR_INPUT_LEN;
|
||||
return status; /* invalid length for input data */
|
||||
}
|
||||
SHAInit ( &hash_context ); /* initialize SHA */
|
||||
#ifdef CTK_BIG_ENDIAN
|
||||
ByteSwap(message,message_bytes);
|
||||
#endif
|
||||
status = SHAUpdate( &hash_context, message, message_bytes );
|
||||
#ifdef CTK_BIG_ENDIAN
|
||||
ByteSwap(message,message_bytes);
|
||||
#endif
|
||||
if ( status != SUCCESS )
|
||||
{
|
||||
return status; /* error */
|
||||
}
|
||||
if ((status=MySHAFinal (&hash_context, hash_result)) != SUCCESS )
|
||||
{
|
||||
return status; /* error */
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: int MySHAFinal( SHA_context *hash_context,
|
||||
* uchar *hash_result )
|
||||
* DESCRIPTION: Finalize Secure Hash Function
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* SHA_context *hash_context SHA context structure
|
||||
* uchar *hash_result Pointer to hash
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* uchar *hash_result Final value
|
||||
* RETURN:
|
||||
* SUCCESS No errors
|
||||
* ERR_INPUT_LEN Invalid length for input data (zero bytes)
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 10 Oct 94 KPZ Modified for arbitrary message length
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
int MySHAFinal( SHA_context *hash_context,
|
||||
uchar *hash_result )
|
||||
{
|
||||
int status = SUCCESS; /* function return status */
|
||||
uchar bits[8];
|
||||
u_int16_t index, padLen;
|
||||
u_int32_t ex;
|
||||
uchar PADDING[64] = { /* padding string */
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
if ( hash_context->count[0] == 0 && hash_context->count[1] == 0 )
|
||||
{
|
||||
status= ERR_INPUT_LEN;
|
||||
return status;
|
||||
}
|
||||
/* Save number of bits */
|
||||
LongByte( &hash_context->count[1] , 4, bits );
|
||||
LongByte( &hash_context->count[0] , 4, bits + 4 );
|
||||
ByteSwap32( bits, 8 );
|
||||
/* Pad out to 56 mod 64.*/
|
||||
index = (u_int16_t )((hash_context->count[0] >> 3) & 0x3f);
|
||||
padLen = (u_int16_t) ((index < 56) ? (56 - index) : (120 - index));
|
||||
SHAUpdate( hash_context, PADDING, padLen );
|
||||
|
||||
/* Append length (before padding) */
|
||||
SHAUpdate (hash_context, bits, 8);
|
||||
|
||||
/* Set order of hash_context */
|
||||
ex = hash_context->state[0];
|
||||
hash_context->state[0] = hash_context->state[4];
|
||||
hash_context->state[4] = ex;
|
||||
ex = hash_context->state[1];
|
||||
hash_context->state[1] = hash_context->state[3];
|
||||
hash_context->state[3] = ex;
|
||||
/* Store state in digest */
|
||||
memcpy(hash_result,hash_context->state,SHA_LENGTH);
|
||||
/* Zeroize sensitive information.*/
|
||||
memset( hash_context, 0, sizeof(hash_context) );
|
||||
#if defined ( ORD_16 ) && defined( CTK_BIG_ENDIAN )
|
||||
WordSwap(hash_result,SHA_LENGTH);
|
||||
#endif
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: int SHAUpdate( SHA_context *hash_context,
|
||||
* uchar *message,
|
||||
* u_int16_t message_bytes )
|
||||
* DESCRIPTION: Update Secure Hash Function
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* SHA_context *hash_context SHA context structure
|
||||
* uchar *message Pointer to message
|
||||
* u_int16_t message_bytes Number of bytes
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* SHA_context *hash_context Updated SHA context structure
|
||||
*
|
||||
* RETURN:
|
||||
* SUCCESS No errors
|
||||
* ERR_INPUT_LEN Invalid length for input data (zero bytes)
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 10 Oct 94 KPZ Modified for arbitrary message length
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int SHAUpdate( SHA_context *hash_context,
|
||||
const uchar *message,
|
||||
u_int16_t message_bytes )
|
||||
|
||||
{
|
||||
int status = SUCCESS; /* function return status */
|
||||
u_int16_t i, index, partLen;
|
||||
if ( message_bytes == 0 )
|
||||
{
|
||||
status = ERR_INPUT_LEN; /*invalid length for input data (zero bytes)*/
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Compute number of bytes mod 64 */
|
||||
index = (u_int16_t)((hash_context->count[0] >> 3) & 0x3F);
|
||||
|
||||
/* Update number of bits */
|
||||
if ( (hash_context->count[0] += ((u_int32_t )message_bytes << 3))
|
||||
< ((u_int32_t )message_bytes << 3) )
|
||||
{
|
||||
hash_context->count[1]++;
|
||||
}
|
||||
hash_context->count[1] += ((u_int32_t )message_bytes >> 29);
|
||||
|
||||
partLen = (u_int16_t) (64 - index);
|
||||
/* Transform as many times as possible.*/
|
||||
if ( message_bytes >= partLen )
|
||||
{
|
||||
memcpy( &hash_context->buffer[index], message, partLen );
|
||||
shaTransform( hash_context->state, hash_context->buffer );
|
||||
|
||||
for ( i = partLen; (u_int16_t)(i + 63) < message_bytes; i += 64 )
|
||||
{
|
||||
shaTransform ( hash_context->state, &message[i] );
|
||||
}
|
||||
index = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
i = 0;
|
||||
}
|
||||
/* Buffer remaining input */
|
||||
memcpy( &hash_context->buffer[index], &message[i],
|
||||
message_bytes - i );
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: void SHAInit( SHA_context *hash_context )
|
||||
*
|
||||
* DESCRIPTION: Initialize Secure Hash Function
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* SHA_context *hash_context SHA context structure
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* SHA_context *hash_context Initialized SHA context structure
|
||||
*
|
||||
* RETURN:
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void SHAInit( SHA_context *hash_context )
|
||||
{
|
||||
/*Set up first buffer*/
|
||||
hash_context->state[0] = h0SHA;
|
||||
hash_context->state[1] = h1SHA;
|
||||
hash_context->state[2] = h2SHA;
|
||||
hash_context->state[3] = h3SHA;
|
||||
hash_context->state[4] = h4SHA;
|
||||
|
||||
/* Initialise buffer */
|
||||
memset( hash_context->buffer, 0, sizeof(hash_context->buffer));
|
||||
/*Initialize bit count*/
|
||||
hash_context->count[0] = hash_context->count[1] = 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: int SHAFinal( SHA_context *hash_context,
|
||||
* uchar *hash_result )
|
||||
* DESCRIPTION: Finalize Secure Hash Function
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* SHA_context *hash_context SHA context structure
|
||||
* uchar *hash_result Pointer to hash
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* uchar *hash_result Final value
|
||||
* RETURN:
|
||||
* SUCCESS No errors
|
||||
* ERR_INPUT_LEN Invalid length for input data (zero bytes)
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 10 Oct 94 KPZ Modified for arbitrary message length
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
int SHAFinal( SHA_context *hash_context,
|
||||
uchar *hash_result )
|
||||
{
|
||||
int status = SUCCESS; /* function return status */
|
||||
status = MySHAFinal( hash_context, hash_result );
|
||||
#ifdef CTK_BIG_ENDIAN
|
||||
if (status == SUCCESS)
|
||||
{
|
||||
ByteSwap(hash_result, SHA_LENGTH);
|
||||
}
|
||||
#endif
|
||||
if (DataOrder)
|
||||
{
|
||||
BigSwap(hash_result, SHA_LENGTH);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: int GetPasswordKeySHA( u_int16_t Password_bytes,
|
||||
* uchar *Password,
|
||||
* uchar *salt,
|
||||
* u_int16_t Count,
|
||||
* uchar *K,
|
||||
* uchar *IV )
|
||||
*
|
||||
* DESCRIPTION: Get Password-Based DES/KAPPA Key by SHA
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* u_int16_t Password_bytes Number of bytes in password
|
||||
* uchar *Password Pointer to password
|
||||
* uchar *salt Pointer to salt(8-byte)
|
||||
* u_int16_t Count Number of iteration
|
||||
* OUTPUT:
|
||||
* PARAMETERS:
|
||||
* uchar *K Pointer to DES/KAPPA key
|
||||
* uchar *IV Pointer to initialization vector
|
||||
* RETURN:
|
||||
* SUCCESS No errors
|
||||
* ERR_COUNT Invalid iteration count (zero)
|
||||
* ERR_INPUT_LEN Invalid length for input data(zero bytes)
|
||||
* ERR_ALLOC Insufficient memory
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 26 Oct 94 GKL (ERR_ALLOC)
|
||||
*
|
||||
****************************************************************************/
|
||||
int GetPasswordKeySHA( u_int16_t Password_bytes,
|
||||
uchar *Password,
|
||||
uchar *salt,
|
||||
u_int16_t Count,
|
||||
uchar *K,
|
||||
uchar *IV )
|
||||
|
||||
{
|
||||
int status = SUCCESS; /* function return status */
|
||||
uchar digest[SHA_LENGTH];
|
||||
uchar *buf;
|
||||
if ( Count == 0 ) /* invalid iteration count (zero) */
|
||||
{
|
||||
status = ERR_COUNT;
|
||||
return status;
|
||||
}
|
||||
CALLOC(buf,uchar,Password_bytes + 8);
|
||||
if ( status != SUCCESS )
|
||||
{
|
||||
return status; /* ERR_ALLOC insufficient memory */
|
||||
}
|
||||
if ( Password_bytes != 0 ) /* if number of bytes password non equals zero */
|
||||
{
|
||||
memcpy( buf, Password, Password_bytes );
|
||||
}
|
||||
memcpy( buf + Password_bytes, salt, 8);
|
||||
/* Compute message digest */
|
||||
status = SHA( buf, (u_int16_t)(Password_bytes + 8), digest);
|
||||
if (!DataOrder)
|
||||
{
|
||||
BigSwap(digest, SHA_LENGTH);
|
||||
}
|
||||
|
||||
if ( status != SUCCESS )
|
||||
{
|
||||
free ( buf );
|
||||
return status;
|
||||
}
|
||||
Count --; /* decrement Count */
|
||||
/* Count times compute message digest */
|
||||
while ( Count != 0 )
|
||||
{
|
||||
if ( (status = SHA( digest, SHA_LENGTH, digest)) != SUCCESS )
|
||||
{
|
||||
free ( buf );
|
||||
return status;
|
||||
}
|
||||
if (!DataOrder)
|
||||
{
|
||||
BigSwap(digest, SHA_LENGTH);
|
||||
}
|
||||
Count --;
|
||||
}
|
||||
memcpy( K, digest, 8 );
|
||||
memcpy( IV, digest + SHA_LENGTH -8, 8 );
|
||||
free ( buf );
|
||||
return status;
|
||||
}
|
||||
|
|
@ -1,148 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* FILENAME: sha.h PRODUCT NAME: CRYPTOGRAPHIC TOOLKIT
|
||||
*
|
||||
* FILE STATUS:
|
||||
*
|
||||
* DESCRIPTION: Cryptographic Toolkit Internal Functions Header File
|
||||
*
|
||||
* USAGE: File should be included in Toolkit functions files
|
||||
*
|
||||
*
|
||||
* Copyright (c) Cylink Corporation 1994. All rights reserved.
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef SHA_H
|
||||
#define SHA_H
|
||||
#include "cylink.h"
|
||||
|
||||
#define SHS_BLOCKSIZE 64
|
||||
/*
|
||||
#define FSHA(x,y,z) ( ( x & y ) | ( ~x & z ) )
|
||||
#define GSHA(x,y,z) ( x ^ y ^ z )
|
||||
#define HSHA(x,y,z) ( ( x & y ) | ( x & z ) | ( y & z ) )
|
||||
#define ISHA(x,y,z) (x ^ y ^ z)
|
||||
*/
|
||||
/*#define f1(x,y,z) ( (x & y) | (~x & z) ) // Rounds 0-19 */
|
||||
#define f1(x,y,z) ( z ^ (x & (y ^ z) ) ) /* Rounds 0-19 */
|
||||
#define f2(x,y,z) ( x ^ y ^ z ) /* Rounds 20-39 */
|
||||
/*#define f3(x,y,z) ( (x & y) | (x & z) | (y & z) ) // Rounds 40-59 */
|
||||
#define f3(x,y,z) ( (x & y) | (z & (x | y) ) ) /* Rounds 40-59 */
|
||||
#define f4(x,y,z) ( x ^ y ^ z ) /* Rounds 60-79 */
|
||||
|
||||
|
||||
#define RotateLeft(x,n) (( x << n )|( x >> (32-n) ) ) /*Circular left shift operation*/
|
||||
|
||||
/*SHS Constants */
|
||||
#define k1SHA 0x5a827999L
|
||||
#define k2SHA 0x6ed9eba1L
|
||||
#define k3SHA 0x8f1bbcdcL
|
||||
#define k4SHA 0xca62c1d6L
|
||||
|
||||
/*SHS initial value */
|
||||
#define h0SHA 0x67452301L
|
||||
#define h1SHA 0xefcdab89L
|
||||
#define h2SHA 0x98badcfeL
|
||||
#define h3SHA 0x10325476L
|
||||
#define h4SHA 0xc3d2e1f0L
|
||||
|
||||
/*The initial expanding function*/
|
||||
#define expand(count) \
|
||||
{\
|
||||
W[count] = W[count-3] ^ W[count-8] ^ W[count-14] ^ W[count-16];\
|
||||
W[count] = RotateLeft( W[count], 1 );\
|
||||
}
|
||||
|
||||
/*New variant */
|
||||
#define subRound(a, b, c, d, e, f, k, data) \
|
||||
( e += RotateLeft(a,5) + f(b, c, d) + k + data, b = RotateLeft( b,30) )
|
||||
|
||||
|
||||
|
||||
/*The four sub_rounds*/
|
||||
/*
|
||||
#define subR1(count) \
|
||||
{\
|
||||
temp=RotateLeft(A,5) + FSHA(B,C,D) + E +W[count] +k1SHA;\
|
||||
E = D; \
|
||||
D = C; \
|
||||
C = RotateLeft(B,30); \
|
||||
B = A; \
|
||||
A = temp; \
|
||||
}
|
||||
|
||||
#define subR2(count) \
|
||||
{\
|
||||
temp=RotateLeft(A,5) + GSHA(B,C,D) + E +W[count] +k2SHA;\
|
||||
E = D; \
|
||||
D = C; \
|
||||
C = RotateLeft(B,30);\
|
||||
B = A; \
|
||||
A = temp; \
|
||||
}
|
||||
|
||||
#define subR3(count) \
|
||||
{\
|
||||
temp=RotateLeft(A,5) + HSHA(B,C,D) + E +W[count] +k3SHA;\
|
||||
E = D; \
|
||||
D = C; \
|
||||
C = RotateLeft(B,30);\
|
||||
B = A; \
|
||||
A = temp; \
|
||||
}
|
||||
|
||||
#define subR4(count) \
|
||||
{\
|
||||
temp=RotateLeft(A,5) + ISHA(B,C,D) + E + W[count] +k4SHA;\
|
||||
E = D; \
|
||||
D = C; \
|
||||
C = RotateLeft(B,30);\
|
||||
B = A; \
|
||||
A = temp; \
|
||||
}
|
||||
*/
|
||||
#endif /* SHA_H */
|
||||
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
#include "bnsize00.h"
|
||||
|
||||
#if BNSIZE16
|
||||
#error Using 16-bit math library
|
||||
#elif BNSIZE32
|
||||
#error Using 32-bit math library
|
||||
#elif BNSIZE64
|
||||
#error Using 64-bit math library
|
||||
#else
|
||||
#error No math library size defined
|
||||
#endif
|
||||
|
|
@ -1,211 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* FILENAME: swap.c PRODUCT NAME: CRYPTOGRAPHIC TOOLKIT
|
||||
*
|
||||
* FILE STATUS:
|
||||
*
|
||||
* DESCRIPTION: Byte and Word Swap functions
|
||||
*
|
||||
* PUBLIC FUNCTIONS:
|
||||
*
|
||||
*
|
||||
* PRIVATE FUNCTIONS:
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 14 Oct 94 GKL Initial release
|
||||
* 26 Oct 94 GKL (alignment for big endian support )
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* INCLUDE FILES
|
||||
****************************************************************************/
|
||||
/* system files */
|
||||
|
||||
#include "port_before.h"
|
||||
#ifdef VXD
|
||||
#include <vtoolsc.h>
|
||||
#else
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#endif
|
||||
/* program files */
|
||||
#include "cylink.h"
|
||||
#include "ctk_endian.h"
|
||||
#include "toolkit.h"
|
||||
#include "port_after.h"
|
||||
|
||||
u_int16_t DataOrder = 0;
|
||||
|
||||
/*Reset bytes in long*/
|
||||
/*extern void ByteSwap32_asm( uchar *X, u_int16_t X_len );*/ /*kz*/
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: void ByteSwap32 (uchar *array,
|
||||
* u_int16_t X_len )
|
||||
*
|
||||
* DESCRIPTION: Perform byte reversal on an array of longword.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* uchar *X Pointer to array
|
||||
* u_int16_t X_len Number of bytes
|
||||
* OUTPUT:
|
||||
* uchar *X Pointer to array
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
void ByteSwap32( uchar *X, u_int16_t X_len )
|
||||
{
|
||||
u_int16_t i; /*counter*/
|
||||
uchar a; /*temporary char*/
|
||||
for ( i = 0; i < X_len; i += 4)
|
||||
{
|
||||
a = X[i];
|
||||
X[i] = X[i+3];
|
||||
X[i+3] = a;
|
||||
a = X[i+1];
|
||||
X[i+1] = X[i+2];
|
||||
X[i+2] = a;
|
||||
}
|
||||
/*#endif*/ /*kz*/
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: void ByteSwap (uchar *array,
|
||||
* u_int16_t X_len )
|
||||
*
|
||||
* DESCRIPTION: Perform byte reversal on an array of longword or shortword.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* uchar *X Pointer to array
|
||||
* u_int16_t X_len Number of bytes
|
||||
* OUTPUT:
|
||||
* uchar *X Pointer to array
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 24 Sep 94 KPZ Initial release
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void ByteSwap( uchar *X,
|
||||
u_int16_t X_len )
|
||||
{
|
||||
#ifdef ORD_16
|
||||
u_int16_t i; /*counter*/
|
||||
uchar a; /*tempriory char for revers*/
|
||||
for ( i = 0; i < X_len; i += 2)
|
||||
{
|
||||
a = X[i];
|
||||
X[i] = X[i+1];
|
||||
X[i+1] = a;
|
||||
}
|
||||
#endif
|
||||
#ifdef ORD_32
|
||||
ByteSwap32(X,X_len);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*kz longbyte deleted */
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: void WordSwap (uchar *array,
|
||||
* u_int16_t X_len )
|
||||
*
|
||||
* DESCRIPTION: Perform short reversal on an array of longword.
|
||||
*
|
||||
* INPUTS:
|
||||
* PARAMETERS:
|
||||
* uchar *X Pointer to array
|
||||
* u_int16_t X_len Number of bytes
|
||||
* OUTPUT:
|
||||
* uchar *X Pointer to array
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 14 Oct 94 GKL Initial release
|
||||
*
|
||||
****************************************************************************/
|
||||
void WordSwap( uchar *X,
|
||||
u_int16_t X_len )
|
||||
{
|
||||
u_int16_t i; /*counter*/
|
||||
u_int16_t a; /*tempriory u_int16_t*/
|
||||
|
||||
for ( i = 0; i < X_len; i += 4)
|
||||
{
|
||||
a = *(u_int16_t*)(&X[i]);
|
||||
*(u_int16_t*)(&X[i])=*(u_int16_t*)(&X[i+2]);
|
||||
*(u_int16_t*)(&X[i+2])=a;
|
||||
}
|
||||
}
|
||||
|
||||
void BigSwap( uchar *buffer,
|
||||
u_int16_t bufferLength)
|
||||
{
|
||||
uchar temp;
|
||||
u_int16_t i;
|
||||
|
||||
for (i = 0; i < (u_int16_t)(bufferLength/2); i++)
|
||||
{
|
||||
temp = buffer[i];
|
||||
buffer[i] = buffer[bufferLength - 1 - i];
|
||||
buffer[bufferLength - 1 - i] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
void SetDataOrder ( u_int16_t dataOrder)
|
||||
{
|
||||
DataOrder = dataOrder;
|
||||
}
|
||||
|
|
@ -1,393 +0,0 @@
|
|||
/*
|
||||
* Cylink Corporation © 1998
|
||||
*
|
||||
* This software is licensed by Cylink to the Internet Software Consortium to
|
||||
* promote implementation of royalty free public key cryptography within IETF
|
||||
* standards. Cylink wishes to expressly thank the contributions of Dr.
|
||||
* Martin Hellman, Whitfield Diffie, Ralph Merkle and Stanford University for
|
||||
* their contributions to Internet Security. In accordance with the terms of
|
||||
* this license, ISC is authorized to distribute and sublicense this software
|
||||
* for the practice of IETF standards.
|
||||
*
|
||||
* The software includes BigNum, written by Colin Plumb and licensed by Philip
|
||||
* R. Zimmermann for royalty free use and distribution with Cylink's
|
||||
* software. Use of BigNum as a stand alone product or component is
|
||||
* specifically prohibited.
|
||||
*
|
||||
* Disclaimer of All Warranties. THIS SOFTWARE IS BEING PROVIDED "AS IS",
|
||||
* WITHOUT ANY EXPRESSED OR IMPLIED WARRANTY OF ANY KIND WHATSOEVER. IN
|
||||
* PARTICULAR, WITHOUT LIMITATION ON THE GENERALITY OF THE FOREGOING, CYLINK
|
||||
* MAKES NO REPRESENTATION OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
|
||||
* PURPOSE.
|
||||
*
|
||||
* Cylink or its representatives shall not be liable for tort, indirect,
|
||||
* special or consequential damages such as loss of profits or loss of
|
||||
* goodwill from the use or inability to use the software for any purpose or
|
||||
* for any reason whatsoever.
|
||||
*
|
||||
* EXPORT LAW: Export of the Foundations Suite may be subject to compliance
|
||||
* with the rules and regulations promulgated from time to time by the Bureau
|
||||
* of Export Administration, United States Department of Commerce, which
|
||||
* restrict the export and re-export of certain products and technical data.
|
||||
* If the export of the Foundations Suite is controlled under such rules and
|
||||
* regulations, then the Foundations Suite shall not be exported or
|
||||
* re-exported, directly or indirectly, (a) without all export or re-export
|
||||
* licenses and governmental approvals required by any applicable laws, or (b)
|
||||
* in violation of any applicable prohibition against the export or re-export
|
||||
* of any part of the Foundations Suite. All export licenses for software
|
||||
* containing the Foundations Suite are the sole responsibility of the licensee.
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* FILENAME: toolkit.h PRODUCT NAME: CRYPTOGRAPHIC TOOLKIT
|
||||
*
|
||||
* FILE STATUS:
|
||||
*
|
||||
* DESCRIPTION: Cryptographic Toolkit Functions Header File
|
||||
*
|
||||
* USAGE: File should be included to use Toolkit Functions
|
||||
*
|
||||
*
|
||||
* Copyright (c) Cylink Corporation 1994. All rights reserved.
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
*
|
||||
* 23 Aug 94 KPZ Initial release
|
||||
* 24 Sep 94 KPZ Added prototypes of Toolkit functions
|
||||
* 14 Oct 94 GKL Second version (big endian support)
|
||||
* 08 Dec 94 GKL Added YIELD_context to GenDSSParameters
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef TOOLKIT_H /* Prevent multiple inclusions of same header file */
|
||||
#define TOOLKIT_H
|
||||
|
||||
|
||||
/* Error types */
|
||||
|
||||
#define SUCCESS 0 /* no errors */
|
||||
#define ERR_DATA -1 /* generic data error */
|
||||
#define ERR_ALLOC -2 /* insufficient memory */
|
||||
#define ERR_INPUT_LEN -3 /* invalid length for input data (zero bytes) */
|
||||
#define ERR_DSS_LEN -4 /* invalid length for dss_p */
|
||||
#define ERR_DH_LEN -5 /* invalid length for DH_modulus */
|
||||
#define ERR_BLOCK_LEN -7 /* invalid length for input block for ECB/CBC */
|
||||
#define ERR_HASH_LEN -8 /* invalid length for hash_result */
|
||||
#define ERR_MODE -9 /* invalid value of encryption mode */
|
||||
#define ERR_NUMBER -10 /* invalid number of testings (zero) */
|
||||
#define ERR_POSITION -11 /* invalid value of triplet_position */
|
||||
#define ERR_COUNT -12 /* invalid iteration count (zero) */
|
||||
#define ERR_SIGNATURE -21 /* signature is not valid */
|
||||
#define ERR_PRIME -22 /* number is not prime */
|
||||
#define ERR_WEAK -23 /* weak key */
|
||||
#define ERR_INPUT_VALUE -24 /* invalid input value */
|
||||
/* additional error types for CEPA */
|
||||
#define ERR_KEY_LENGTH -25 /* invalid value of key length */
|
||||
#define ERR_ROUNDS -26 /* invalid value of rounds number */
|
||||
#define ERR_CANCEL -30 /* canceled by user */
|
||||
#define ERR_MODULUS_ZERO -31 /* invalid modulo */
|
||||
#define ERR_UNSUPPORTED -40 /* unsupported crypto method */
|
||||
#define ERR_OP_CODE -41 /*invalid operation code*/
|
||||
|
||||
|
||||
|
||||
/* Lengths of variables */
|
||||
#define DH_LENGTH_MIN 64 /* 512-bit minimal length for DH functions */
|
||||
#define DSS_LENGTH_MIN 64 /* 512-bit minimal length for DSS functions */
|
||||
#define DSS_LENGTH_MAX 128 /* 1024-bit maximal length for DSS functions */
|
||||
#define SHA_LENGTH 20 /* 160-bit length for SHA hash result */
|
||||
|
||||
/* Number of random bases for Miller test */
|
||||
#define TEST_COUNT 40
|
||||
|
||||
#define LITTLE_ORDER 0
|
||||
#define BIG_ORDER 1
|
||||
|
||||
/* Key lengths */ /* add to toolkit.h */
|
||||
#define KEY_40BIT 40 /* 40-bit key */
|
||||
#define KEY_64BIT 64 /* 64-bit key */
|
||||
#define KEY_128BIT 128 /* 128-bit key */
|
||||
#define CEPA_MAX_ROUNDS 12
|
||||
|
||||
/* Operation codes for MultiPrecArithm() */
|
||||
#define EXPO 0x21
|
||||
#define MUL 0x22
|
||||
/*#define ADD 0x23*/
|
||||
|
||||
/****************************************************************************
|
||||
* INCLUDE FILES
|
||||
****************************************************************************/
|
||||
|
||||
/* system files */
|
||||
#include "cylink.h"
|
||||
#include "ctk_endian.h"
|
||||
/* callback function */
|
||||
#ifdef VXD
|
||||
typedef int (* YIELD_PROC)( void );
|
||||
#else
|
||||
typedef int (* YIELD_PROC)(int ); /*TKL00601*/
|
||||
#endif
|
||||
|
||||
typedef struct { /*TKL00601*/
|
||||
YIELD_PROC yield_proc;
|
||||
void * handle; /* Application specific information */
|
||||
}YIELD_context;
|
||||
|
||||
|
||||
/* Secure Hash Algorithm structure */
|
||||
typedef struct
|
||||
{
|
||||
u_int32_t state[ 5 ]; /* state */
|
||||
u_int32_t count[ 2 ]; /* number of bits */
|
||||
uchar buffer[ 64 ]; /* input buffer */
|
||||
} SHA_context;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/* Copy Cylink DSS Common Parameters */ /*TKL01201*/
|
||||
int GetDSSPQG(u_int16_t dss_p_bytes,
|
||||
uchar *dss_p,
|
||||
uchar *dss_q,
|
||||
uchar *dss_g);
|
||||
|
||||
/* Compute a Secure Hash Function */
|
||||
int SHA( uchar *message, u_int16_t message_bytes,
|
||||
uchar *hash_result );
|
||||
/* Initialize Secure Hash Function */
|
||||
void SHAInit( SHA_context *hash_context );
|
||||
|
||||
/* Update Secure Hash Function */
|
||||
int SHAUpdate( SHA_context *hash_context,
|
||||
const uchar *message,
|
||||
u_int16_t message_bytes );
|
||||
/* Finalize Secure Hash Function */
|
||||
int SHAFinal( SHA_context *hash_context,
|
||||
uchar *hash_result );
|
||||
/* Compute a DSS Signature */
|
||||
int GenDSSSignature( u_int16_t dss_p_bytes, uchar *dss_p,
|
||||
uchar *dss_q, uchar *dss_g,
|
||||
uchar *dss_x, uchar *dss_k,
|
||||
uchar *r, uchar *s,
|
||||
uchar *hash_result );
|
||||
/* Verify a DSS Signature */
|
||||
int VerDSSSignature( u_int16_t dss_p_bytes, uchar *dss_p,
|
||||
uchar *dss_q, uchar *dss_g,
|
||||
uchar *dss_y, uchar *r,
|
||||
uchar *s, uchar *hash_result);
|
||||
/* Initialize Random number Generator */
|
||||
int InitRand( u_int16_t SEED_bytes, uchar *SEED,
|
||||
uchar *RVAL );
|
||||
/* Generate random number */
|
||||
int GenRand( u_int16_t A_bytes, uchar *A,
|
||||
uchar *RVAL );
|
||||
/* Compute DSS public/secret number pair */
|
||||
int GenDSSKey( u_int16_t dss_p_bytes, uchar *dss_p,
|
||||
uchar *dss_q, uchar *dss_g,
|
||||
uchar *dss_x, uchar *dss_y,
|
||||
uchar *XKEY );
|
||||
/* Generate secret number */
|
||||
int GenDSSNumber( uchar *dss_k, uchar *dss_q,
|
||||
uchar *KKEY );
|
||||
|
||||
/* Compute a Diffie-Hellman Shared number */
|
||||
int GetDHSharedNumber( u_int16_t DH_modulus_bytes, uchar *DH_secret,
|
||||
uchar *DH_public, uchar *DH_shared,
|
||||
uchar *DH_modulus );
|
||||
/* Set Key by Diffie_Hellman shared number */
|
||||
int SetDESKAPPAKey( u_int16_t DH_modulus_bytes, uchar *DH_shared,
|
||||
uchar *K );
|
||||
/* Expand DES key */
|
||||
void DESKeyExpand( uchar *key, uchar *K1 );
|
||||
|
||||
/* Encrypt a block of data with single DES */
|
||||
int DESEncrypt( uchar *des_iv, uchar *des_key,
|
||||
u_int16_t des_mode, uchar *input_array,
|
||||
uchar *output_array, u_int16_t input_array_bytes );
|
||||
|
||||
/* Decrypt a block of data with single DES */
|
||||
int DESDecrypt( uchar *des_iv, uchar *des_key,
|
||||
u_int16_t des_mode, uchar *data_array,
|
||||
u_int16_t data_array_bytes );
|
||||
|
||||
/* One-Time-Pad Signature with a Diffie-Hellman shared number */
|
||||
int DHOneTimePad( u_int16_t DH_modulus_bytes, uchar *DH_shared,
|
||||
uchar *X, uchar *Y );
|
||||
|
||||
/* Compute a Diffie-Hellman pair */
|
||||
int GenDHPair( u_int16_t DH_modulus_bytes, uchar *DH_secret,
|
||||
uchar *DH_public, uchar *DH_base,
|
||||
uchar *DH_modulus, uchar *RVAL );
|
||||
|
||||
int GetPasswordKeySHA( u_int16_t Password_bytes, uchar *Password,
|
||||
uchar *salt, u_int16_t Count,
|
||||
uchar *K, uchar *IV );
|
||||
|
||||
/* Generate DSS Common Parameters */
|
||||
int GenDSSParameters( u_int16_t dss_p_bytes, uchar *dss_p,
|
||||
uchar *dss_q, uchar *dss_g,
|
||||
uchar *RVAL, YIELD_context *yield_cont ); /*TKL00701*/
|
||||
|
||||
/* Produce a Shamir Key-Sharing Triplet for Secret Number */
|
||||
int GenShamirTriplet( u_int16_t SecretNumber_bytes, uchar *SecretNumber,
|
||||
uchar *first_value, uchar *second_value,
|
||||
uchar *third_value, uchar *RVAL );
|
||||
|
||||
/* Reconstract a Secret Number from Shamir Key-Sharing Duplex */
|
||||
int GetNumberShamirDuplex( u_int16_t SecretNumber_bytes,
|
||||
uchar *value_A,
|
||||
u_int16_t A_position, uchar *value_B,
|
||||
u_int16_t B_position,
|
||||
uchar *SecretNumber );
|
||||
int SFDHEncrypt( u_int16_t DH_modulus_bytes,
|
||||
uchar *DH_modulus,
|
||||
uchar *DH_base,
|
||||
uchar *DH_public,
|
||||
uchar *DH_random_public,
|
||||
uchar *DH_shared,
|
||||
uchar *RVAL );
|
||||
int SFDHDecrypt( u_int16_t DH_modulus_bytes,
|
||||
uchar *DH_modulus,
|
||||
uchar *DH_secret,
|
||||
uchar *DH_random_public,
|
||||
uchar *DH_shared );
|
||||
/* Check DES key weakness */
|
||||
int CheckDESKeyWeakness( uchar *key );
|
||||
|
||||
int SetCipherKey( u_int16_t DH_shared_bytes,
|
||||
uchar *DH_shared,
|
||||
uchar *Key,
|
||||
u_int16_t cryptoMethod );
|
||||
/* Non-Pipelined Triple DES encrypt*/
|
||||
int TDESEncrypt( uchar *des_iv,
|
||||
uchar *des_key1,uchar *des_key2, uchar *des_key3,
|
||||
u_int16_t des_mode,
|
||||
uchar *input_array,
|
||||
uchar *output_array,
|
||||
u_int16_t input_array_bytes );
|
||||
/* Non-Pipelined Triple DES decrypt*/
|
||||
int TDESDecrypt( uchar *des_iv,
|
||||
uchar *des_key1,uchar *des_key2, uchar *des_key3,
|
||||
u_int16_t des_mode,
|
||||
uchar *data_array,
|
||||
u_int16_t data_array_bytes );
|
||||
/*Pipeline Triple DES encrypt*/
|
||||
int PTDESEncrypt( uchar *iv1, uchar *iv2, uchar *iv3,
|
||||
uchar *des_key1,uchar *des_key2, uchar *des_key3,
|
||||
u_int16_t des_mode,
|
||||
uchar *input_array,
|
||||
uchar *output_array,
|
||||
u_int16_t input_array_bytes );
|
||||
/*Pipeline Triple DES decrypt*/
|
||||
int PTDESDecrypt( uchar *iv1, uchar *iv2, uchar *iv3,
|
||||
uchar *des_key1,uchar *des_key2, uchar *des_key3,
|
||||
u_int16_t des_mode,
|
||||
uchar *data_array,
|
||||
u_int16_t input_array_bytes );
|
||||
int PCBC1Encrypt( uchar *iv1, uchar *iv2, uchar *iv3,
|
||||
uchar *des_key1,uchar *des_key2, uchar *des_key3,
|
||||
uchar *msg1,uchar *msg2, uchar *msg3,
|
||||
uchar *out1,uchar *out2, uchar *out3,
|
||||
u_int16_t input_array_bytes );
|
||||
int PCBC1Decrypt( uchar *iv1, uchar *iv2, uchar *iv3,
|
||||
uchar *des_key1,uchar *des_key2, uchar *des_key3,
|
||||
uchar *out1,uchar *out2, uchar *out3,
|
||||
u_int16_t input_array_bytes );
|
||||
|
||||
/*CEPA enc/dec */
|
||||
int CepaKeyExpand( uchar *key,
|
||||
u_int16_t key_length,
|
||||
u_int16_t number_of_rounds,
|
||||
uchar *expanded_key );
|
||||
|
||||
int CepaCsp( u_int16_t key_length,
|
||||
uchar *csp);
|
||||
|
||||
int CepaEncrypt( uchar *iv,
|
||||
uchar *key,
|
||||
u_int16_t mode,
|
||||
uchar *csp,
|
||||
u_int16_t r,
|
||||
uchar *input_array,
|
||||
uchar *output_array,
|
||||
u_int16_t input_array_bytes );
|
||||
|
||||
int CepaDecrypt( uchar *iv,
|
||||
uchar *key,
|
||||
u_int16_t mode,
|
||||
uchar *csp,
|
||||
u_int16_t r,
|
||||
uchar *data_array,
|
||||
u_int16_t data_array_bytes );
|
||||
void BigNumInit(void);
|
||||
void SetDataOrder ( u_int16_t dataOrder);
|
||||
|
||||
int GetDHSecretShared( u_int16_t DH_modulus_bytes, u_int16_t DH_secret_bytes, uchar *DH_secret,
|
||||
uchar *DH_public, uchar *DH_shared,
|
||||
uchar *DH_modulus);
|
||||
int GenDHKey( u_int16_t DH_modulus_bytes, u_int16_t DH_secret_bytes, uchar *DH_secret,
|
||||
uchar *DH_public, uchar *DH_base,
|
||||
uchar *DH_modulus, uchar *RVAL );
|
||||
int SFDHInitiate( u_int16_t DH_modulus_bytes, u_int16_t DH_secret_bytes,
|
||||
uchar *DH_modulus, uchar *DH_base,
|
||||
uchar *DH_public, uchar *DH_random_public,
|
||||
uchar *DH_shared, uchar *RVAL );
|
||||
int SFDHComplete( u_int16_t DH_modulus_bytes, u_int16_t DH_secret_bytes,
|
||||
uchar *DH_modulus,
|
||||
uchar *DH_secret, uchar *DH_random_public,
|
||||
uchar *DH_shared );
|
||||
|
||||
int SplitKey( u_int16_t Secretnumber_bytes, uchar *SecretNumber,
|
||||
uchar *first_value, uchar *second_value,
|
||||
uchar *third_value, uchar *RVAL );
|
||||
int UnsplitKey( u_int16_t Secretnumber_bytes, uchar *value_A,
|
||||
u_int16_t A_position, uchar *value_B,
|
||||
u_int16_t B_position, uchar *SecretNumber );
|
||||
int SAFERKeyExpand( uchar *key, u_int16_t key_length,
|
||||
uchar *expanded_key );
|
||||
int SAFEREncrypt( uchar *iv, uchar *key, u_int16_t mode, u_int16_t key_length,
|
||||
uchar *input_array, uchar *output_array, u_int16_t input_array_bytes );
|
||||
int SAFERDecrypt( uchar *iv, uchar *key, u_int16_t mode, u_int16_t r_length,
|
||||
uchar *data_array, u_int16_t data_array_bytes );
|
||||
|
||||
|
||||
void ByteSwap( uchar *X, u_int16_t X_len);
|
||||
void ByteSwap32( uchar *X, u_int16_t X_len);
|
||||
void WordSwap( uchar *X, u_int16_t X_len);
|
||||
void BigSwap( uchar *buffer, u_int16_t bufferLength);
|
||||
int Sum_big (ord *X, ord *Y, ord *Z, u_int16_t len_X);
|
||||
int Sum_Q(ord *X, u_int16_t src, u_int16_t len_X);
|
||||
void LShiftL_big( ord *X, u_int32_t len_X, u_int32_t n_bit );
|
||||
int Sub_big (ord *X, ord *Y, ord *Z, u_int16_t len_X);
|
||||
int DivRem( u_int16_t X_bytes, ord *X, u_int16_t P_bytes, ord *P,
|
||||
ord *Z, ord *D);
|
||||
int SteinGCD (ord *m, ord *n, u_int16_t len);
|
||||
int Add( ord *X, ord *Y, u_int16_t P_len, ord *P);
|
||||
int Inverse(u_int16_t X_bytes, ord *X, u_int16_t P_bytes, ord *P,
|
||||
ord *Z);
|
||||
int DoubleExpo(u_int16_t X1_bytes, ord *X1, u_int16_t Y1_bytes,
|
||||
ord *Y1, u_int16_t X2_bytes, ord *X2,
|
||||
u_int16_t Y2_bytes, ord *Y2, u_int16_t P_bytes,
|
||||
ord *P, ord *Z);
|
||||
int Sum (ord *X, ord *Y, u_int16_t len_X);
|
||||
void Mul_big_1( ord X, ord *Y, ord *XY, u_int16_t ly);
|
||||
int Mul( u_int16_t X_bytes, ord *X, u_int16_t Y_bytes, ord *Y,
|
||||
u_int16_t P_bytes, ord *P, ord *Z );
|
||||
|
||||
int Square(u_int16_t X_bytes, ord *X, u_int16_t P_bytes, ord *P,
|
||||
ord *Z);
|
||||
|
||||
int PartReduct(u_int16_t X_bytes, ord *X, u_int16_t P_bytes, ord *P,
|
||||
ord *Z);
|
||||
int Expo(u_int16_t X_bytes, ord *X, u_int16_t Y_bytes, ord *Y,
|
||||
u_int16_t P_bytes, ord *P, ord *Z);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* TOOLKIT_H */
|
||||
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
OBJS= ahcbcpad.@O@ ahchdig.@O@ ahchencr.@O@ ahchgen.@O@ ahchrand.@O@ \
|
||||
ahdigest.@O@ ahencryp.@O@ ahgen.@O@ ahrandom.@O@ ahrsaenc.@O@ \
|
||||
ahrsaepr.@O@ ahrsaepu.@O@ aichdig.@O@ aichenc8.@O@ aichencn.@O@ \
|
||||
aichencr.@O@ aichgen.@O@ aichrand.@O@ aimd5.@O@ aimd5ran.@O@ \
|
||||
ainfotyp.@O@ ainull.@O@ airsaepr.@O@ airsaepu.@O@ airsakgn.@O@ \
|
||||
airsaprv.@O@ airsapub.@O@ algchoic.@O@ algobj.@O@ amcrte.@O@ \
|
||||
ammd5.@O@ ammd5r.@O@ amrkg.@O@ amrsae.@O@ balg.@O@ bgclrbit.c \
|
||||
bgmdmpyx.@O@ bgmdsqx.@O@ bgmodexp.@O@ bgpegcd.@O@ big2exp.@O@ \
|
||||
bigabs.@O@ bigacc.@O@ bigarith.@O@ bigcmp.@O@ bigconst.@O@ \
|
||||
biginv.@O@ biglen.@O@ bigmodx.@O@ bigmpy.@O@ bigpdiv.@O@ \
|
||||
bigpmpy.@O@ bigpmpyh.@O@ bigpmpyl.@O@ bigpsq.@O@ bigqrx.@O@ \
|
||||
bigsmod.@O@ bigtocan.@O@ bigu.@O@ bigunexp.@O@ binfocsh.@O@ \
|
||||
bkey.@O@ bmempool.@O@ cantobig.@O@ crt2.@O@ digest.@O@ \
|
||||
digrand.@O@ encrypt.@O@ generate.@O@ intbits.@O@ intitem.@O@ \
|
||||
keyobj.@O@ ki8byte.@O@ kifulprv.@O@ kiitem.@O@ kinfotyp.@O@ \
|
||||
kipkcrpr.@O@ kirsacrt.@O@ kirsapub.@O@ md5.@O@ md5rand.@O@ \
|
||||
prime.@O@ random.@O@ rsa.@O@ rsakeygn.@O@ seccbcd.@O@ \
|
||||
seccbce.@O@ surrendr.@O@
|
||||
|
||||
SRCS= ahcbcpad.c ahchdig.c ahchencr.c ahchgen.c ahchrand.c ahdigest.c \
|
||||
ahencryp.c ahgen.c ahrandom.c ahrsaenc.c ahrsaepr.c ahrsaepu.c \
|
||||
aichdig.c aichenc8.c aichencn.c aichencr.c aichgen.c aichrand.c \
|
||||
aimd5.c aimd5ran.c ainfotyp.c ainull.c airsaepr.c airsaepu.c \
|
||||
airsakgn.c airsaprv.c airsapub.c algchoic.c algobj.c amcrte.c \
|
||||
ammd5.c ammd5r.c amrkg.c amrsae.c balg.c bgclrbit.c bgmdmpyx.c \
|
||||
bgmdsqx.c bgmodexp.c bgpegcd.c big2exp.c bigabs.c bigacc.c \
|
||||
bigarith.c bigcmp.c bigconst.c biginv.c biglen.c bigmodx.c \
|
||||
bigmpy.c bigpdiv.c bigpmpy.c bigpmpyh.c bigpmpyl.c bigpsq.c \
|
||||
bigqrx.c bigsmod.c bigtocan.c bigu.c bigunexp.c binfocsh.c \
|
||||
bkey.c bmempool.c cantobig.c crt2.c digest.c digrand.c encrypt.c \
|
||||
generate.c intbits.c intitem.c keyobj.c ki8byte.c kifulprv.c \
|
||||
kiitem.c kinfotyp.c kipkcrpr.c kirsacrt.c kirsapub.c md5.c \
|
||||
md5rand.c prime.c random.c rsa.c rsakeygn.c seccbcd.c seccbce.c \
|
||||
surrendr.c
|
||||
|
||||
TARGETS= ${OBJS}
|
||||
|
||||
CINCLUDES= -I.. -I../include
|
||||
CWARNINGS= -Werror
|
||||
|
||||
@BIND9_MAKE_RULES@
|
||||
|
|
@ -1,176 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
/* Define this so that the type of the 'this' pointer in the
|
||||
virtual functions will be correct for this derived class.
|
||||
*/
|
||||
struct AHSecretCBCPad;
|
||||
#define THIS_ENCRYPT_DECRYPT struct AHSecretCBCPad
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ahcbcpad.h"
|
||||
#include "port_after.h"
|
||||
|
||||
#define GENERATE_BREAK(type) { \
|
||||
status = type; \
|
||||
break; \
|
||||
}
|
||||
|
||||
/* Inherit the base class destructor, block size,
|
||||
and decrypt init and update routines.
|
||||
*/
|
||||
static AHEncryptDecryptVTable V_TABLE = {
|
||||
AHChooseEncryptDestructor, AHChooseEncryptGetBlockLen,
|
||||
AHSecretCBCPadEncryptInit, AHChooseEncryptDecryptInit,
|
||||
AHSecretCBCPadEncryptUpdate, AHChooseEncryptDecryptUpdate,
|
||||
AHSecretCBCPadEncryptFinal, AHSecretCBCPadDecryptFinal
|
||||
};
|
||||
|
||||
AHSecretCBCPad *AHSecretCBCPadConstructor2 (handler, infoType, info)
|
||||
AHSecretCBCPad *handler;
|
||||
struct B_AlgorithmInfoType *infoType;
|
||||
POINTER info;
|
||||
{
|
||||
if (handler == (AHSecretCBCPad *)NULL_PTR) {
|
||||
/* This constructor is being used to do a new */
|
||||
if ((handler = (AHSecretCBCPad *)T_malloc (sizeof (*handler)))
|
||||
== (AHSecretCBCPad *)NULL_PTR)
|
||||
return (handler);
|
||||
}
|
||||
|
||||
/* Construct base class with the infoType and info. */
|
||||
AHChooseEncryptConstructor2
|
||||
(&handler->chooseEncryptDecrypt, infoType, info);
|
||||
|
||||
handler->chooseEncryptDecrypt.encryptDecrypt.vTable = &V_TABLE;
|
||||
return (handler);
|
||||
}
|
||||
|
||||
int AHSecretCBCPadEncryptInit (handler, key, chooser, surrenderContext)
|
||||
AHSecretCBCPad *handler;
|
||||
B_Key *key;
|
||||
B_ALGORITHM_CHOOSER chooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
/* For encryption, we need to track the input length */
|
||||
handler->_inputRemainder = 0;
|
||||
|
||||
return (AHChooseEncryptEncryptInit
|
||||
(handler, key, chooser, surrenderContext));
|
||||
}
|
||||
|
||||
int AHSecretCBCPadEncryptUpdate
|
||||
(handler, partOut, partOutLen, maxPartOutLen, partIn, partInLen,
|
||||
randomAlgorithm, surrenderContext)
|
||||
AHSecretCBCPad *handler;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
const unsigned char *partIn;
|
||||
unsigned int partInLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
/* For encryption, we need to track the input length */
|
||||
handler->_inputRemainder = (handler->_inputRemainder + partInLen) % 8;
|
||||
|
||||
return (AHChooseEncryptEncryptUpdate
|
||||
(handler, partOut, partOutLen, maxPartOutLen, partIn, partInLen,
|
||||
randomAlgorithm, surrenderContext));
|
||||
}
|
||||
|
||||
int AHSecretCBCPadEncryptFinal
|
||||
(handler, partOut, partOutLen, maxPartOutLen, randomAlgorithm,
|
||||
surrenderContext)
|
||||
AHSecretCBCPad *handler;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
unsigned char finalBuffer[8];
|
||||
unsigned int padLen, dummyPartOutLen;
|
||||
|
||||
padLen = 8 - handler->_inputRemainder;
|
||||
T_memset ((POINTER)finalBuffer, padLen, padLen);
|
||||
|
||||
/* Add the pad bytes. This should force the output of the final block.
|
||||
*/
|
||||
if ((status = AHChooseEncryptEncryptUpdate
|
||||
(handler, partOut, partOutLen, maxPartOutLen, finalBuffer, padLen,
|
||||
randomAlgorithm, surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
/* The encrypt final operation should have no output. */
|
||||
if ((status = AHChooseEncryptEncryptFinal
|
||||
(handler, (unsigned char *)NULL_PTR, &dummyPartOutLen, 0,
|
||||
(B_Algorithm *)NULL_PTR, (A_SURRENDER_CTX *)NULL_PTR)) != 0)
|
||||
return (status);
|
||||
|
||||
/* Restart the context. */
|
||||
handler->_inputRemainder = 0;
|
||||
|
||||
/* No need to zeroize the finalBuffer since it only contains pad bytes. */
|
||||
return (0);
|
||||
}
|
||||
|
||||
int AHSecretCBCPadDecryptFinal
|
||||
(handler, partOut, partOutLen, maxPartOutLen, randomAlgorithm,
|
||||
surrenderContext)
|
||||
AHSecretCBCPad *handler;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
unsigned char finalBuffer[16], *padBuffer;
|
||||
unsigned int padLen, localPartOutLen, i;
|
||||
|
||||
do {
|
||||
/* For now, the DecrypyFinal operations is set to output 16 bytes.
|
||||
*/
|
||||
if ((status = AHChooseEncryptDecryptFinal
|
||||
(handler, finalBuffer, &localPartOutLen, sizeof (finalBuffer),
|
||||
randomAlgorithm, surrenderContext)) != 0)
|
||||
break;
|
||||
|
||||
if (localPartOutLen == 8)
|
||||
padBuffer = finalBuffer;
|
||||
else if (localPartOutLen == 16)
|
||||
padBuffer = finalBuffer + 8;
|
||||
else
|
||||
GENERATE_BREAK (BE_INPUT_LEN);
|
||||
|
||||
/* Check that padding is one 1 to eight 8's.
|
||||
*/
|
||||
if ((padLen = (unsigned int)padBuffer[7]) == 0 || padLen > 8)
|
||||
GENERATE_BREAK (BE_INPUT_DATA);
|
||||
for (i = 8 - padLen; i < 8; i++) {
|
||||
if ((unsigned int)padBuffer[i] != padLen)
|
||||
GENERATE_BREAK (BE_INPUT_DATA);
|
||||
}
|
||||
|
||||
if ((*partOutLen = localPartOutLen - padLen) > maxPartOutLen)
|
||||
GENERATE_BREAK (BE_OUTPUT_LEN);
|
||||
|
||||
T_memcpy
|
||||
((POINTER)partOut, (POINTER)finalBuffer, *partOutLen);
|
||||
} while (0);
|
||||
|
||||
T_memset ((POINTER)finalBuffer, 0, sizeof (finalBuffer));
|
||||
return (status);
|
||||
}
|
||||
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AHCBCPAD_H_
|
||||
#define _AHCBCPAD_H_
|
||||
|
||||
#include "ahchencr.h"
|
||||
|
||||
typedef struct AHSecretCBCPad {
|
||||
AHChooseEncryptDecrypt chooseEncryptDecrypt; /* base class */
|
||||
|
||||
unsigned int _inputRemainder; /* Used for encrypt to compute pad length */
|
||||
} AHSecretCBCPad;
|
||||
|
||||
AHSecretCBCPad *AHSecretCBCPadConstructor2 PROTO_LIST
|
||||
((AHSecretCBCPad *, struct B_AlgorithmInfoType *, POINTER));
|
||||
|
||||
int AHSecretCBCPadEncryptInit PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, B_Key *, B_ALGORITHM_CHOOSER,
|
||||
A_SURRENDER_CTX *));
|
||||
int AHSecretCBCPadEncryptUpdate PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *,
|
||||
unsigned int, const unsigned char *, unsigned int, B_Algorithm *,
|
||||
A_SURRENDER_CTX *));
|
||||
int AHSecretCBCPadEncryptFinal PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *,
|
||||
unsigned int, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
int AHSecretCBCPadDecryptFinal PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *,
|
||||
unsigned int, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
|
||||
#endif
|
||||
|
|
@ -1,132 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
/* Define this so that the type of the 'this' pointer in the
|
||||
virtual functions will be correct for this derived class.
|
||||
*/
|
||||
struct AHChooseDigest;
|
||||
#define THIS_DIGEST struct AHChooseDigest
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "algae.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "balgmeth.h"
|
||||
#include "ahchdig.h"
|
||||
#include "amdigest.h"
|
||||
#include "port_after.h"
|
||||
|
||||
static int InitDigestAlga PROTO_LIST
|
||||
((AlgaChoice *, POINTER, B_ALGORITHM_METHOD *, A_SURRENDER_CTX *));
|
||||
|
||||
static AHDigestVTable V_TABLE = {
|
||||
AHChooseDigestDestructor, AHChooseDigestInit, AHChooseDigestUpdate,
|
||||
AHChooseDigestFinal
|
||||
};
|
||||
|
||||
AHChooseDigest *AHChooseDigestConstructor2 (handler, infoType, info)
|
||||
AHChooseDigest *handler;
|
||||
struct B_AlgorithmInfoType *infoType;
|
||||
POINTER info;
|
||||
{
|
||||
if (handler == (AHChooseDigest *)NULL_PTR) {
|
||||
/* This constructor is being used to do a new */
|
||||
if ((handler = (AHChooseDigest *)T_malloc (sizeof (*handler)))
|
||||
== (AHChooseDigest *)NULL_PTR)
|
||||
return (handler);
|
||||
}
|
||||
|
||||
/* Construct base class */
|
||||
AHDigestConstructor (&handler->digest);
|
||||
|
||||
ALGA_CHOICE_Constructor (&handler->algaChoice, InitDigestAlga);
|
||||
handler->algaChoice._algorithmInfoType = infoType;
|
||||
handler->algaChoice._algorithmInfo = info;
|
||||
|
||||
handler->digest.vTable = &V_TABLE;
|
||||
|
||||
return (handler);
|
||||
}
|
||||
|
||||
void AHChooseDigestDestructor (handler)
|
||||
AHChooseDigest *handler;
|
||||
{
|
||||
ALGA_CHOICE_Destructor (&handler->algaChoice);
|
||||
/* There is no desructor to call for the base class. */
|
||||
}
|
||||
|
||||
int AHChooseDigestInit (handler, key, chooser, surrenderContext)
|
||||
AHChooseDigest *handler;
|
||||
B_Key *key;
|
||||
B_ALGORITHM_CHOOSER chooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
return (AlgaChoiceChoose
|
||||
(&handler->algaChoice, 0, key, chooser, surrenderContext));
|
||||
}
|
||||
|
||||
int AHChooseDigestUpdate (handler, partIn, partInLen, surrenderContext)
|
||||
AHChooseDigest *handler;
|
||||
const unsigned char *partIn;
|
||||
unsigned int partInLen;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = (*((A_DIGEST_ALGA *)handler->algaChoice._alga)->Update)
|
||||
(handler->algaChoice.context.z.context, partIn, partInLen,
|
||||
surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
return (0);
|
||||
}
|
||||
|
||||
int AHChooseDigestFinal
|
||||
(handler, partOut, partOutLen, maxPartOutLen, surrenderContext)
|
||||
AHChooseDigest *handler;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = (*((A_DIGEST_ALGA *)handler->algaChoice._alga)->Final)
|
||||
(handler->algaChoice.context.z.context, partOut, partOutLen,
|
||||
maxPartOutLen, surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int InitDigestAlga
|
||||
(algaChoice, keyInfo, algorithmMethod, surrenderContext)
|
||||
AlgaChoice *algaChoice;
|
||||
POINTER keyInfo;
|
||||
B_ALGORITHM_METHOD *algorithmMethod;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
unsigned int contextSize;
|
||||
|
||||
UNUSED_ARG (keyInfo)
|
||||
if ((status = (*((A_DIGEST_ALGA *)algorithmMethod->alga)->Query)
|
||||
(&contextSize, algaChoice->_algorithmInfo)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
|
||||
if ((status = ResizeContextMakeNewContext
|
||||
(&algaChoice->context, contextSize)) != 0)
|
||||
return (status);
|
||||
|
||||
if ((status = (*((A_DIGEST_ALGA *)algorithmMethod->alga)->Init)
|
||||
(algaChoice->context.z.context, algaChoice->_algorithmInfo,
|
||||
surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AHCHDIG_H_
|
||||
#define _AHCHDIG_H_ 1
|
||||
|
||||
#include "ahdigest.h"
|
||||
#include "algchoic.h"
|
||||
|
||||
typedef struct AHChooseDigest {
|
||||
AHDigest digest; /* base class */
|
||||
AlgaChoice algaChoice;
|
||||
} AHChooseDigest;
|
||||
|
||||
AHChooseDigest *AHChooseDigestConstructor2 PROTO_LIST
|
||||
((AHChooseDigest *, struct B_AlgorithmInfoType *, POINTER));
|
||||
void AHChooseDigestDestructor PROTO_LIST ((THIS_DIGEST *));
|
||||
|
||||
int AHChooseDigestInit PROTO_LIST
|
||||
((THIS_DIGEST *, B_Key *, B_ALGORITHM_CHOOSER, A_SURRENDER_CTX *));
|
||||
int AHChooseDigestUpdate PROTO_LIST
|
||||
((THIS_DIGEST *, const unsigned char *, unsigned int, A_SURRENDER_CTX *));
|
||||
int AHChooseDigestFinal PROTO_LIST
|
||||
((THIS_DIGEST *, unsigned char *, unsigned int *, unsigned int,
|
||||
A_SURRENDER_CTX *));
|
||||
|
||||
#endif
|
||||
|
|
@ -1,268 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
/* Define this so that the type of the 'this' pointer in the
|
||||
virtual functions will be correct for this derived class.
|
||||
*/
|
||||
struct AHChooseEncryptDecrypt;
|
||||
#define THIS_ENCRYPT_DECRYPT struct AHChooseEncryptDecrypt
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "algae.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "balgmeth.h"
|
||||
#include "ahchencr.h"
|
||||
#include "amencdec.h"
|
||||
#include "port_after.h"
|
||||
|
||||
static int InitEncryptDecryptAlga PROTO_LIST
|
||||
((AlgaChoice *, POINTER, B_ALGORITHM_METHOD *, A_SURRENDER_CTX *));
|
||||
|
||||
static AHEncryptDecryptVTable V_TABLE = {
|
||||
AHChooseEncryptDestructor, AHChooseEncryptGetBlockLen,
|
||||
AHChooseEncryptEncryptInit, AHChooseEncryptDecryptInit,
|
||||
AHChooseEncryptEncryptUpdate, AHChooseEncryptDecryptUpdate,
|
||||
AHChooseEncryptEncryptFinal, AHChooseEncryptDecryptFinal
|
||||
};
|
||||
|
||||
/* In C++:
|
||||
AHChooseEncryptDecrypt::AHChooseEncryptDecrypt
|
||||
(B_AlgorithmInfoType *infoType, POINTER info)
|
||||
: algaChoice (InitEncryptDecryptAlga)
|
||||
{
|
||||
algaChoice.setAlgorithmInfoType (infoType);
|
||||
algaChoice.setAlgorithmInfo (info);
|
||||
}
|
||||
*/
|
||||
AHChooseEncryptDecrypt *AHChooseEncryptConstructor2 (handler, infoType, info)
|
||||
AHChooseEncryptDecrypt *handler;
|
||||
struct B_AlgorithmInfoType *infoType;
|
||||
POINTER info;
|
||||
{
|
||||
if (handler == (AHChooseEncryptDecrypt *)NULL_PTR) {
|
||||
/* This constructor is being used to do a new */
|
||||
if ((handler = (AHChooseEncryptDecrypt *)T_malloc (sizeof (*handler)))
|
||||
== (AHChooseEncryptDecrypt *)NULL_PTR)
|
||||
return (handler);
|
||||
}
|
||||
|
||||
/* Construct base class */
|
||||
AHEncryptDecryptConstructor (&handler->encryptDecrypt);
|
||||
|
||||
ALGA_CHOICE_Constructor (&handler->algaChoice, InitEncryptDecryptAlga);
|
||||
handler->algaChoice._algorithmInfoType = infoType;
|
||||
handler->algaChoice._algorithmInfo = info;
|
||||
|
||||
handler->encryptDecrypt.vTable = &V_TABLE;
|
||||
|
||||
return (handler);
|
||||
}
|
||||
|
||||
void AHChooseEncryptDestructor (handler)
|
||||
AHChooseEncryptDecrypt *handler;
|
||||
{
|
||||
ALGA_CHOICE_Destructor (&handler->algaChoice);
|
||||
/* There is no desructor to call for the base class. */
|
||||
}
|
||||
|
||||
int AHChooseEncryptGetBlockLen (handler, blockLen)
|
||||
AHChooseEncryptDecrypt *handler;
|
||||
unsigned int *blockLen;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = (*((A_ENCRYPT_DECRYPT_ALGA *)handler->algaChoice._alga)->
|
||||
GetBlockLen)
|
||||
(handler->algaChoice.context.z.context, blockLen)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* In C++:
|
||||
int AHChooseEncryptDecrypt::encryptInit
|
||||
(B_Key *key, B_ALGORITHM_CHOOSER chooser, A_SURRENDER_CTX *surrenderContext)
|
||||
{
|
||||
return (algaChoice.choose (1, key, chooser, surrenderContext));
|
||||
}
|
||||
*/
|
||||
int AHChooseEncryptEncryptInit (handler, key, chooser, surrenderContext)
|
||||
AHChooseEncryptDecrypt *handler;
|
||||
B_Key *key;
|
||||
B_ALGORITHM_CHOOSER chooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
return (AlgaChoiceChoose
|
||||
(&handler->algaChoice, 1, key, chooser, surrenderContext));
|
||||
}
|
||||
|
||||
int AHChooseEncryptDecryptInit (handler, key, chooser, surrenderContext)
|
||||
AHChooseEncryptDecrypt *handler;
|
||||
B_Key *key;
|
||||
B_ALGORITHM_CHOOSER chooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
return (AlgaChoiceChoose
|
||||
(&handler->algaChoice, 0, key, chooser, surrenderContext));
|
||||
}
|
||||
|
||||
/* In C++:
|
||||
int AHChooseEncryptDecrypt::encryptUpdate
|
||||
(unsigned char *partOut, unsigned int *partOutLen,
|
||||
unsigned int maxPartOutLen, unsigned char *partIn, unsigned int partInLen,
|
||||
B_Algorithm *randomAlgorithm, A_SURRENDER_CTX *surrenderContext)
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = (*((A_ENCRYPT_DECRYPT_ALGA *)algaChoice.alga ()) ->Update)
|
||||
(algaChoice.context (), partOut, partOutLen, maxPartOutLen,
|
||||
partIn, partInLen, surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
return (0);
|
||||
}
|
||||
*/
|
||||
int AHChooseEncryptEncryptUpdate
|
||||
(handler, partOut, partOutLen, maxPartOutLen, partIn, partInLen,
|
||||
randomAlgorithm, surrenderContext)
|
||||
AHChooseEncryptDecrypt *handler;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
const unsigned char *partIn;
|
||||
unsigned int partInLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
UNUSED_ARG (randomAlgorithm)
|
||||
|
||||
if ((status = (*((A_ENCRYPT_DECRYPT_ALGA *)handler->algaChoice._alga)->
|
||||
Update)
|
||||
(handler->algaChoice.context.z.context, partOut, partOutLen,
|
||||
maxPartOutLen, partIn, partInLen, surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
return (0);
|
||||
}
|
||||
|
||||
int AHChooseEncryptDecryptUpdate
|
||||
(handler, partOut, partOutLen, maxPartOutLen, partIn, partInLen,
|
||||
randomAlgorithm, surrenderContext)
|
||||
AHChooseEncryptDecrypt *handler;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
const unsigned char *partIn;
|
||||
unsigned int partInLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
UNUSED_ARG (randomAlgorithm)
|
||||
|
||||
if ((status = (*((A_ENCRYPT_DECRYPT_ALGA *)handler->algaChoice._alga)->
|
||||
Update)
|
||||
(handler->algaChoice.context.z.context, partOut, partOutLen,
|
||||
maxPartOutLen, partIn, partInLen, surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
return (0);
|
||||
}
|
||||
|
||||
int AHChooseEncryptEncryptFinal
|
||||
(handler, partOut, partOutLen, maxPartOutLen, randomAlgorithm,
|
||||
surrenderContext)
|
||||
AHChooseEncryptDecrypt *handler;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
UNUSED_ARG (randomAlgorithm)
|
||||
|
||||
if ((status = (*((A_ENCRYPT_DECRYPT_ALGA *)handler->algaChoice._alga)->Final)
|
||||
(handler->algaChoice.context.z.context, partOut, partOutLen,
|
||||
maxPartOutLen, surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
return (0);
|
||||
}
|
||||
|
||||
int AHChooseEncryptDecryptFinal
|
||||
(handler, partOut, partOutLen, maxPartOutLen, randomAlgorithm,
|
||||
surrenderContext)
|
||||
AHChooseEncryptDecrypt *handler;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
UNUSED_ARG (randomAlgorithm)
|
||||
|
||||
if ((status = (*((A_ENCRYPT_DECRYPT_ALGA *)handler->algaChoice._alga)->Final)
|
||||
(handler->algaChoice.context.z.context, partOut, partOutLen,
|
||||
maxPartOutLen, surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* In C++:
|
||||
static int InitEncryptDecryptAlga
|
||||
(AlgaChoice *algaChoice, POINTER keyInfo, POINTER alga,
|
||||
A_SURRENDER_CTX *surrenderContext)
|
||||
{
|
||||
int status;
|
||||
unsigned int contextSize;
|
||||
|
||||
if ((status = (*((A_ENCRYPT_DECRYPT_ALGA *)alga)->Query)
|
||||
(&contextSize, keyInfo, algaChoice->algorithmInfo ())) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
|
||||
if ((status = algaChoice->makeNewContext (contextSize)) != 0)
|
||||
return (status);
|
||||
|
||||
if ((status = (*((A_ENCRYPT_DECRYPT_ALGA *)alga)->Init)
|
||||
(algaChoice->context (), keyInfo, algaChoice->algorithmInfo (),
|
||||
surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
|
||||
return (0);
|
||||
}
|
||||
*/
|
||||
static int InitEncryptDecryptAlga
|
||||
(algaChoice, keyInfo, algorithmMethod, surrenderContext)
|
||||
AlgaChoice *algaChoice;
|
||||
POINTER keyInfo;
|
||||
B_ALGORITHM_METHOD *algorithmMethod;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
unsigned int contextSize;
|
||||
|
||||
if ((status = (*((A_ENCRYPT_DECRYPT_ALGA *)algorithmMethod->alga)->Query)
|
||||
(&contextSize, keyInfo, algaChoice->_algorithmInfo)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
|
||||
if ((status = ResizeContextMakeNewContext
|
||||
(&algaChoice->context, contextSize)) != 0)
|
||||
return (status);
|
||||
|
||||
if ((status = (*((A_ENCRYPT_DECRYPT_ALGA *)algorithmMethod->alga)->Init)
|
||||
(algaChoice->context.z.context, keyInfo, algaChoice->_algorithmInfo,
|
||||
surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AHCHENCR_H_
|
||||
#define _AHCHENCR_H_ 1
|
||||
|
||||
#include "ahencryp.h"
|
||||
#include "algchoic.h"
|
||||
|
||||
/* In C++:
|
||||
class AHChooseEncryptDecrypt : public AHEncryptDecrypt {
|
||||
public:
|
||||
AHChooseEncryptDecrypt (B_AlgorithmInfoType *, POINTER);
|
||||
virtual ~AHChooseEncryptDecrypt () {};
|
||||
|
||||
virtual int getBlockLen (unsigned int *);
|
||||
virtual int encryptInit (B_Key *, B_ALGORITHM_CHOOSER, A_SURRENDER_CTX *);
|
||||
virtual int decryptInit (B_Key *, B_ALGORITHM_CHOOSER, A_SURRENDER_CTX *);
|
||||
virtual int encryptUpdate
|
||||
(unsigned char *, unsigned int *, unsigned int, unsigned char *,
|
||||
unsigned int, B_Algorithm *, A_SURRENDER_CTX *);
|
||||
virtual int decryptUpdate
|
||||
(unsigned char *, unsigned int *, unsigned int, unsigned char *,
|
||||
unsigned int, B_Algorithm *, A_SURRENDER_CTX *);
|
||||
virtual int encryptFinal
|
||||
(unsigned char *, unsigned int *, unsigned int, B_Algorithm *,
|
||||
A_SURRENDER_CTX *);
|
||||
virtual int decryptFinal
|
||||
(unsigned char *, unsigned int *, unsigned int, B_Algorithm *,
|
||||
A_SURRENDER_CTX *);
|
||||
|
||||
private:
|
||||
AlgaChoice algaChoice;
|
||||
};
|
||||
*/
|
||||
|
||||
typedef struct AHChooseEncryptDecrypt {
|
||||
AHEncryptDecrypt encryptDecrypt; /* base class */
|
||||
AlgaChoice algaChoice;
|
||||
} AHChooseEncryptDecrypt;
|
||||
|
||||
AHChooseEncryptDecrypt *AHChooseEncryptConstructor2 PROTO_LIST
|
||||
((AHChooseEncryptDecrypt *, struct B_AlgorithmInfoType *, POINTER));
|
||||
void AHChooseEncryptDestructor PROTO_LIST ((THIS_ENCRYPT_DECRYPT *));
|
||||
|
||||
int AHChooseEncryptGetBlockLen PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned int *));
|
||||
int AHChooseEncryptEncryptInit PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, B_Key *, B_ALGORITHM_CHOOSER,
|
||||
A_SURRENDER_CTX *));
|
||||
int AHChooseEncryptDecryptInit PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, B_Key *, B_ALGORITHM_CHOOSER,
|
||||
A_SURRENDER_CTX *));
|
||||
int AHChooseEncryptEncryptUpdate PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *,
|
||||
unsigned int, const unsigned char *, unsigned int, B_Algorithm *,
|
||||
A_SURRENDER_CTX *));
|
||||
int AHChooseEncryptDecryptUpdate PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *,
|
||||
unsigned int, const unsigned char *, unsigned int, B_Algorithm *,
|
||||
A_SURRENDER_CTX *));
|
||||
int AHChooseEncryptEncryptFinal PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *,
|
||||
unsigned int, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
int AHChooseEncryptDecryptFinal PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *,
|
||||
unsigned int, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
|
||||
#endif
|
||||
|
|
@ -1,218 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
/* Define this so that the type of the 'this' pointer in the
|
||||
virtual functions will be correct for this derived class.
|
||||
*/
|
||||
struct AHChooseGenerate;
|
||||
#define THIS_GENERATE struct AHChooseGenerate
|
||||
|
||||
/* Define this so that the type of the AlgaChoice pointer in the
|
||||
INIT_ALGA functions will be correct for this derived class.
|
||||
*/
|
||||
struct GenerateAlgaChoice;
|
||||
#define THIS_ALGA_CHOICE struct GenerateAlgaChoice
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "algae.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "balgmeth.h"
|
||||
#include "ahchgen.h"
|
||||
#include "amgen.h"
|
||||
#include "port_after.h"
|
||||
|
||||
static int InitGenerateAlga PROTO_LIST
|
||||
((GenerateAlgaChoice *, POINTER, B_ALGORITHM_METHOD *, A_SURRENDER_CTX *));
|
||||
static int GenerateResult PROTO_LIST
|
||||
((GenerateAlgaChoice *, POINTER *, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
|
||||
static AHGenerateVTable V_TABLE = {
|
||||
AHChooseGenerateDestructor, AHChooseGenerateInit, AHChooseGenerateKeypair,
|
||||
AHChooseGenerateParameters
|
||||
};
|
||||
|
||||
AHChooseGenerate *AHChooseGenerateConstructor2 (handler, infoType, info)
|
||||
AHChooseGenerate *handler;
|
||||
struct B_AlgorithmInfoType *infoType;
|
||||
POINTER info;
|
||||
{
|
||||
if (handler == (AHChooseGenerate *)NULL_PTR) {
|
||||
/* This constructor is being used to do a new */
|
||||
if ((handler = (AHChooseGenerate *)T_malloc (sizeof (*handler)))
|
||||
== (AHChooseGenerate *)NULL_PTR)
|
||||
return (handler);
|
||||
}
|
||||
|
||||
/* Construct base class */
|
||||
AHGenerateConstructor (&handler->generate);
|
||||
|
||||
ALGA_CHOICE_Constructor
|
||||
(&handler->generateAlgaChoice.algaChoice, InitGenerateAlga);
|
||||
ResizeContextConstructor (&handler->generateAlgaChoice.secondContext);
|
||||
ResizeContextConstructor (&handler->generateAlgaChoice.randomBlock);
|
||||
|
||||
/* Set algaChoice.
|
||||
*/
|
||||
handler->generateAlgaChoice.algaChoice._algorithmInfoType = infoType;
|
||||
handler->generateAlgaChoice.algaChoice._algorithmInfo = info;
|
||||
|
||||
handler->generate.vTable = &V_TABLE;
|
||||
|
||||
return (handler);
|
||||
}
|
||||
|
||||
void AHChooseGenerateDestructor (handler)
|
||||
AHChooseGenerate *handler;
|
||||
{
|
||||
ResizeContextDestructor (&handler->generateAlgaChoice.secondContext);
|
||||
ResizeContextDestructor (&handler->generateAlgaChoice.randomBlock);
|
||||
ALGA_CHOICE_Destructor (&handler->generateAlgaChoice.algaChoice);
|
||||
/* There is no desructor to call for the base class. */
|
||||
}
|
||||
|
||||
int AHChooseGenerateInit (handler, chooser, surrenderContext)
|
||||
AHChooseGenerate *handler;
|
||||
B_ALGORITHM_CHOOSER chooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
return (AlgaChoiceChoose
|
||||
(&handler->generateAlgaChoice.algaChoice, 0, (B_Key *)NULL_PTR,
|
||||
chooser, surrenderContext));
|
||||
}
|
||||
|
||||
int AHChooseGenerateKeypair
|
||||
(handler, publicKey, privateKey, randomAlgorithm, surrenderContext)
|
||||
AHChooseGenerate *handler;
|
||||
B_Key *publicKey;
|
||||
B_Key *privateKey;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
POINTER result;
|
||||
int status;
|
||||
|
||||
if ((status = GenerateResult
|
||||
(&handler->generateAlgaChoice, &result, randomAlgorithm,
|
||||
surrenderContext)) != 0)
|
||||
return (status);
|
||||
if ((status = B_KeySetInfo
|
||||
(publicKey, handler->generateAlgaChoice._resultInfoType, result)) != 0)
|
||||
return (status);
|
||||
return (B_KeySetInfo
|
||||
(privateKey, handler->generateAlgaChoice._resultInfoType, result));
|
||||
}
|
||||
|
||||
int AHChooseGenerateParameters
|
||||
(handler, resultAlgorithm, randomAlgorithm, surrenderContext)
|
||||
AHChooseGenerate *handler;
|
||||
B_Algorithm *resultAlgorithm;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
POINTER result;
|
||||
int status;
|
||||
|
||||
if ((status = GenerateResult
|
||||
(&handler->generateAlgaChoice, &result, randomAlgorithm,
|
||||
surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
/* Force the resultInfoType into a B_AlgorithmInfoType since it is
|
||||
supplied in the chooser as a B_KeyInfoType. */
|
||||
return (B_AlgorithmSetInfo
|
||||
(resultAlgorithm, (struct B_AlgorithmInfoType *)
|
||||
handler->generateAlgaChoice._resultInfoType, result));
|
||||
}
|
||||
|
||||
static int InitGenerateAlga
|
||||
(generateAlgaChoice, keyInfo, algorithmMethod, surrenderContext)
|
||||
GenerateAlgaChoice *generateAlgaChoice;
|
||||
POINTER keyInfo;
|
||||
B_ALGORITHM_METHOD *algorithmMethod;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
unsigned int contextSize, secondContextSize;
|
||||
|
||||
UNUSED_ARG (keyInfo)
|
||||
/* Note that this also gets the resultInfoType which will be used later
|
||||
by GenerateResult. */
|
||||
if ((status = (*((A_GENERATE_ALGA *)algorithmMethod->alga)->Query)
|
||||
(&contextSize, &secondContextSize, &generateAlgaChoice->_randomBlockLen,
|
||||
&generateAlgaChoice->_resultInfoType,
|
||||
generateAlgaChoice->algaChoice._algorithmInfo)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
|
||||
/* Create the context.
|
||||
*/
|
||||
if ((status = ResizeContextMakeNewContext
|
||||
(&generateAlgaChoice->algaChoice.context, contextSize)) != 0)
|
||||
return (status);
|
||||
|
||||
/* Create the second context which is only passed during Init, but
|
||||
must persist for all operations. */
|
||||
if ((status = ResizeContextMakeNewContext
|
||||
(&generateAlgaChoice->secondContext, secondContextSize)) != 0)
|
||||
return (status);
|
||||
|
||||
/* Create randomBlock which will be filled in during GenerateResult. */
|
||||
if ((status = ResizeContextMakeNewContext
|
||||
(&generateAlgaChoice->randomBlock, generateAlgaChoice->_randomBlockLen))
|
||||
!= 0)
|
||||
return (status);
|
||||
|
||||
if ((status = (*((A_GENERATE_ALGA *)algorithmMethod->alga)->Init)
|
||||
(generateAlgaChoice->algaChoice.context.z.context,
|
||||
generateAlgaChoice->secondContext.z.context,
|
||||
generateAlgaChoice->algaChoice._algorithmInfo, surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Call the generate procedure repeatedly with a new random block
|
||||
until it succeeds.
|
||||
*/
|
||||
static int GenerateResult
|
||||
(generateAlgaChoice, result, randomAlgorithm, surrenderContext)
|
||||
GenerateAlgaChoice *generateAlgaChoice;
|
||||
POINTER *result;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
/* Fill in the random block and try generating as long as the
|
||||
the generate operation returns BE_NEED_RANDOM.
|
||||
*/
|
||||
while (1) {
|
||||
if ((status = B_AlgorithmGenerateRandomBytes
|
||||
(randomAlgorithm,
|
||||
(unsigned char *)generateAlgaChoice->randomBlock.z.context,
|
||||
generateAlgaChoice->_randomBlockLen, surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
if ((status = (*((A_GENERATE_ALGA *)
|
||||
generateAlgaChoice->algaChoice._alga)->Generate)
|
||||
(generateAlgaChoice->algaChoice.context.z.context, result,
|
||||
(unsigned char *)generateAlgaChoice->randomBlock.z.context,
|
||||
surrenderContext)) != 0) {
|
||||
if (status != AE_NEED_RANDOM)
|
||||
return (ConvertAlgaeError (status));
|
||||
|
||||
/* Else continue and try again */
|
||||
}
|
||||
else
|
||||
/* Success, so return */
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AHCHGEN_H_
|
||||
#define _AHCHGEN_H_ 1
|
||||
|
||||
#include "ahgen.h"
|
||||
#include "algchoic.h"
|
||||
|
||||
/* Make a new class derived from an AlgaChoice which records the
|
||||
result algorithm info type and needed randomBlockLen.
|
||||
*/
|
||||
typedef struct GenerateAlgaChoice {
|
||||
AlgaChoice algaChoice; /* base class */
|
||||
|
||||
struct B_KeyInfoType *_resultInfoType;
|
||||
ResizeContext secondContext; /* used for scratch */
|
||||
ResizeContext randomBlock;
|
||||
unsigned int _randomBlockLen;
|
||||
} GenerateAlgaChoice;
|
||||
|
||||
typedef struct AHChooseGenerate {
|
||||
AHGenerate generate; /* base class */
|
||||
|
||||
GenerateAlgaChoice generateAlgaChoice;
|
||||
} AHChooseGenerate;
|
||||
|
||||
AHChooseGenerate *AHChooseGenerateConstructor2 PROTO_LIST
|
||||
((AHChooseGenerate *, struct B_AlgorithmInfoType *, POINTER));
|
||||
void AHChooseGenerateDestructor PROTO_LIST ((THIS_GENERATE *));
|
||||
|
||||
int AHChooseGenerateInit PROTO_LIST
|
||||
((THIS_GENERATE *, B_ALGORITHM_CHOOSER, A_SURRENDER_CTX *));
|
||||
int AHChooseGenerateKeypair PROTO_LIST
|
||||
((THIS_GENERATE *, B_Key *, B_Key *, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
int AHChooseGenerateParameters PROTO_LIST
|
||||
((THIS_GENERATE *, B_Algorithm *, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
|
||||
#endif
|
||||
|
|
@ -1,130 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
/* Define this so that the type of the 'this' pointer in the
|
||||
virtual functions will be correct for this derived class.
|
||||
*/
|
||||
struct AHChooseRandom;
|
||||
#define THIS_RANDOM struct AHChooseRandom
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "algae.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "balgmeth.h"
|
||||
#include "ahchrand.h"
|
||||
#include "amrandom.h"
|
||||
#include "port_after.h"
|
||||
|
||||
static int InitRandomAlga PROTO_LIST
|
||||
((AlgaChoice *, POINTER, B_ALGORITHM_METHOD *, A_SURRENDER_CTX *));
|
||||
|
||||
static AHRandomVTable V_TABLE = {
|
||||
AHChooseRandomDestructor, AHChooseRandomInit, AHChooseRandomUpdate,
|
||||
AHChooseRandomGenerateBytes
|
||||
};
|
||||
|
||||
AHChooseRandom *AHChooseRandomConstructor2 (handler, infoType, info)
|
||||
AHChooseRandom *handler;
|
||||
struct B_AlgorithmInfoType *infoType;
|
||||
POINTER info;
|
||||
{
|
||||
if (handler == (AHChooseRandom *)NULL_PTR) {
|
||||
/* This constructor is being used to do a new */
|
||||
if ((handler = (AHChooseRandom *)T_malloc (sizeof (*handler)))
|
||||
== (AHChooseRandom *)NULL_PTR)
|
||||
return (handler);
|
||||
}
|
||||
|
||||
/* Construct base class */
|
||||
AHRandomConstructor (&handler->random);
|
||||
|
||||
ALGA_CHOICE_Constructor (&handler->algaChoice, InitRandomAlga);
|
||||
handler->algaChoice._algorithmInfoType = infoType;
|
||||
handler->algaChoice._algorithmInfo = info;
|
||||
|
||||
handler->random.vTable = &V_TABLE;
|
||||
|
||||
return (handler);
|
||||
}
|
||||
|
||||
void AHChooseRandomDestructor (handler)
|
||||
AHChooseRandom *handler;
|
||||
{
|
||||
ALGA_CHOICE_Destructor (&handler->algaChoice);
|
||||
/* There is no desructor to call for the base class. */
|
||||
}
|
||||
|
||||
int AHChooseRandomInit (handler, chooser, surrenderContext)
|
||||
AHChooseRandom *handler;
|
||||
B_ALGORITHM_CHOOSER chooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
return (AlgaChoiceChoose
|
||||
(&handler->algaChoice, 0, (B_Key *)NULL_PTR, chooser,
|
||||
surrenderContext));
|
||||
}
|
||||
|
||||
int AHChooseRandomUpdate (handler, input, inputLen, surrenderContext)
|
||||
AHChooseRandom *handler;
|
||||
unsigned char *input;
|
||||
unsigned int inputLen;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = (*((A_RANDOM_ALGA *)handler->algaChoice._alga)->Update)
|
||||
(handler->algaChoice.context.z.context, input, inputLen,
|
||||
surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
return (0);
|
||||
}
|
||||
|
||||
int AHChooseRandomGenerateBytes (handler, output, outputLen, surrenderContext)
|
||||
AHChooseRandom *handler;
|
||||
unsigned char *output;
|
||||
unsigned int outputLen;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = (*((A_RANDOM_ALGA *)handler->algaChoice._alga)->Generate)
|
||||
(handler->algaChoice.context.z.context, output, outputLen,
|
||||
surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int InitRandomAlga
|
||||
(algaChoice, keyInfo, algorithmMethod, surrenderContext)
|
||||
AlgaChoice *algaChoice;
|
||||
POINTER keyInfo;
|
||||
B_ALGORITHM_METHOD *algorithmMethod;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
unsigned int contextSize;
|
||||
|
||||
UNUSED_ARG (keyInfo)
|
||||
if ((status = (*((A_RANDOM_ALGA *)algorithmMethod->alga)->Query)
|
||||
(&contextSize, algaChoice->_algorithmInfo)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
|
||||
if ((status = ResizeContextMakeNewContext
|
||||
(&algaChoice->context, contextSize)) != 0)
|
||||
return (status);
|
||||
|
||||
if ((status = (*((A_RANDOM_ALGA *)algorithmMethod->alga)->Init)
|
||||
(algaChoice->context.z.context, algaChoice->_algorithmInfo,
|
||||
surrenderContext)) != 0)
|
||||
return (ConvertAlgaeError (status));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AHCHRAND_H_
|
||||
#define _AHCHRAND_H_ 1
|
||||
|
||||
#include "ahrandom.h"
|
||||
#include "algchoic.h"
|
||||
|
||||
typedef struct AHChooseRandom {
|
||||
AHRandom random; /* base class */
|
||||
AlgaChoice algaChoice;
|
||||
} AHChooseRandom;
|
||||
|
||||
AHChooseRandom *AHChooseRandomConstructor2 PROTO_LIST
|
||||
((AHChooseRandom *, struct B_AlgorithmInfoType *, POINTER));
|
||||
void AHChooseRandomDestructor PROTO_LIST ((THIS_RANDOM *));
|
||||
|
||||
int AHChooseRandomInit PROTO_LIST
|
||||
((THIS_RANDOM *, B_ALGORITHM_CHOOSER, A_SURRENDER_CTX *));
|
||||
int AHChooseRandomUpdate PROTO_LIST
|
||||
((THIS_RANDOM *, unsigned char *, unsigned int, A_SURRENDER_CTX *));
|
||||
int AHChooseRandomGenerateBytes PROTO_LIST
|
||||
((THIS_RANDOM *, unsigned char *, unsigned int, A_SURRENDER_CTX *));
|
||||
|
||||
#endif
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ahdigest.h"
|
||||
#include "port_after.h"
|
||||
|
||||
static void TypedAHDigestDestructor PROTO_LIST ((B_TypeCheck *));
|
||||
|
||||
void AHDigestConstructor (handler)
|
||||
AHDigest *handler;
|
||||
{
|
||||
/* Construct base class, setting type tag. */
|
||||
B_TYPE_CHECK_Constructor
|
||||
(&handler->typeCheck, TypedAHDigestDestructor);
|
||||
|
||||
/* Don't set vTable since this is a pure virtual base class. */
|
||||
}
|
||||
|
||||
int B_AlgorithmDigestInit
|
||||
(algorithm, key, algorithmChooser, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
B_Key *key;
|
||||
B_ALGORITHM_CHOOSER algorithmChooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckType
|
||||
(algorithm, TypedAHDigestDestructor)) != 0)
|
||||
return (status);
|
||||
|
||||
if ((status =
|
||||
(*((AHDigest *)algorithm->z.handler)->vTable->DigestInit)
|
||||
((AHDigest *)algorithm->z.handler, key, algorithmChooser,
|
||||
surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
algorithm->z.initFlag = 1;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int B_AlgorithmDigestUpdate (algorithm, partIn, partInLen, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
const unsigned char *partIn;
|
||||
unsigned int partInLen;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckTypeAndInitFlag
|
||||
(algorithm, TypedAHDigestDestructor)) != 0)
|
||||
return (status);
|
||||
|
||||
return ((*((AHDigest *)algorithm->z.handler)->vTable->DigestUpdate)
|
||||
((AHDigest *)algorithm->z.handler, partIn, partInLen,
|
||||
surrenderContext));
|
||||
}
|
||||
|
||||
int B_AlgorithmDigestFinal
|
||||
(algorithm, partOut, partOutLen, maxPartOutLen, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckTypeAndInitFlag
|
||||
(algorithm, TypedAHDigestDestructor)) != 0)
|
||||
return (status);
|
||||
|
||||
return ((*((AHDigest *)algorithm->z.handler)->vTable->DigestFinal)
|
||||
((AHDigest *)algorithm->z.handler, partOut, partOutLen,
|
||||
maxPartOutLen, surrenderContext));
|
||||
}
|
||||
|
||||
static void TypedAHDigestDestructor (typeCheck)
|
||||
B_TypeCheck *typeCheck;
|
||||
{
|
||||
(*((AHDigest *)typeCheck)->vTable->Destructor) ((AHDigest *)typeCheck);
|
||||
}
|
||||
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AHDIGEST_H_
|
||||
#define _AHDIGEST_H_ 1
|
||||
|
||||
#include "btypechk.h"
|
||||
|
||||
/* Use the THIS_DIGEST macro to define the type of object in the
|
||||
virtual function prototype. It defaults to the most base class, but
|
||||
derived modules may define the macro to a more derived class before
|
||||
including this header file.
|
||||
*/
|
||||
#ifndef THIS_DIGEST
|
||||
#define THIS_DIGEST struct AHDigest
|
||||
#endif
|
||||
|
||||
struct AHDigest;
|
||||
|
||||
typedef struct {
|
||||
void (*Destructor) PROTO_LIST ((THIS_DIGEST *));
|
||||
int (*DigestInit) PROTO_LIST
|
||||
((THIS_DIGEST *, B_Key *, B_ALGORITHM_CHOOSER, A_SURRENDER_CTX *));
|
||||
int (*DigestUpdate) PROTO_LIST
|
||||
((THIS_DIGEST *, const unsigned char *, unsigned int, A_SURRENDER_CTX *));
|
||||
int (*DigestFinal) PROTO_LIST
|
||||
((THIS_DIGEST *, unsigned char *, unsigned int *, unsigned int,
|
||||
A_SURRENDER_CTX *));
|
||||
} AHDigestVTable;
|
||||
|
||||
typedef struct AHDigest {
|
||||
B_TypeCheck typeCheck; /* inherited */
|
||||
AHDigestVTable *vTable; /* pure virtual */
|
||||
} AHDigest;
|
||||
|
||||
/* The constructor does not set the vTable since this is a pure base class.
|
||||
*/
|
||||
void AHDigestConstructor PROTO_LIST ((AHDigest *));
|
||||
/* No destructor because it is pure virtual. Also, do not call destructor
|
||||
for B_TypeCheck, since this will just re-invoke this virtual
|
||||
destructor. */
|
||||
|
||||
#endif
|
||||
|
|
@ -1,171 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ahencryp.h"
|
||||
#include "port_after.h"
|
||||
|
||||
static void TypedAHEncryptDecryptDestructor PROTO_LIST ((B_TypeCheck *));
|
||||
|
||||
void AHEncryptDecryptConstructor (handler)
|
||||
AHEncryptDecrypt *handler;
|
||||
{
|
||||
/* Construct base class, setting type tag. */
|
||||
B_TYPE_CHECK_Constructor
|
||||
(&handler->typeCheck, TypedAHEncryptDecryptDestructor);
|
||||
|
||||
/* Don't set vTable since this is a pure virtual base class. */
|
||||
}
|
||||
|
||||
int B_AlgorithmEncryptInit
|
||||
(algorithm, key, algorithmChooser, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
B_Key *key;
|
||||
B_ALGORITHM_CHOOSER algorithmChooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckType
|
||||
(algorithm, TypedAHEncryptDecryptDestructor)) != 0)
|
||||
return (status);
|
||||
|
||||
if ((status =
|
||||
(*((AHEncryptDecrypt *)algorithm->z.handler)->vTable->EncryptInit)
|
||||
((AHEncryptDecrypt *)algorithm->z.handler, key, algorithmChooser,
|
||||
surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
algorithm->z.initFlag = 1;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int B_AlgorithmDecryptInit
|
||||
(algorithm, key, algorithmChooser, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
B_Key *key;
|
||||
B_ALGORITHM_CHOOSER algorithmChooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckType
|
||||
(algorithm, TypedAHEncryptDecryptDestructor)) != 0)
|
||||
return (status);
|
||||
|
||||
if ((status =
|
||||
(*((AHEncryptDecrypt *)algorithm->z.handler)->vTable->DecryptInit)
|
||||
((AHEncryptDecrypt *)algorithm->z.handler, key, algorithmChooser,
|
||||
surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
algorithm->z.initFlag = 1;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int B_AlgorithmEncryptUpdate
|
||||
(algorithm, partOut, partOutLen, maxPartOutLen, partIn, partInLen,
|
||||
randomAlgorithm, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
unsigned char *partIn;
|
||||
unsigned int partInLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckTypeAndInitFlag
|
||||
(algorithm, TypedAHEncryptDecryptDestructor)) != 0)
|
||||
return (status);
|
||||
|
||||
return ((*((AHEncryptDecrypt *)algorithm->z.handler)->vTable->EncryptUpdate)
|
||||
((AHEncryptDecrypt *)algorithm->z.handler, partOut, partOutLen,
|
||||
maxPartOutLen, partIn, partInLen, randomAlgorithm,
|
||||
surrenderContext));
|
||||
}
|
||||
|
||||
int B_AlgorithmDecryptUpdate
|
||||
(algorithm, partOut, partOutLen, maxPartOutLen, partIn, partInLen,
|
||||
randomAlgorithm, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
const unsigned char *partIn;
|
||||
unsigned int partInLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckTypeAndInitFlag
|
||||
(algorithm, TypedAHEncryptDecryptDestructor)) != 0)
|
||||
return (status);
|
||||
|
||||
return ((*((AHEncryptDecrypt *)algorithm->z.handler)->vTable->DecryptUpdate)
|
||||
((AHEncryptDecrypt *)algorithm->z.handler, partOut, partOutLen,
|
||||
maxPartOutLen, partIn, partInLen, randomAlgorithm,
|
||||
surrenderContext));
|
||||
}
|
||||
|
||||
int B_AlgorithmEncryptFinal
|
||||
(algorithm, partOut, partOutLen, maxPartOutLen, randomAlgorithm,
|
||||
surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckTypeAndInitFlag
|
||||
(algorithm, TypedAHEncryptDecryptDestructor)) != 0)
|
||||
return (status);
|
||||
|
||||
return ((*((AHEncryptDecrypt *)algorithm->z.handler)->vTable->EncryptFinal)
|
||||
((AHEncryptDecrypt *)algorithm->z.handler, partOut, partOutLen,
|
||||
maxPartOutLen, randomAlgorithm, surrenderContext));
|
||||
}
|
||||
|
||||
int B_AlgorithmDecryptFinal
|
||||
(algorithm, partOut, partOutLen, maxPartOutLen, randomAlgorithm,
|
||||
surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckTypeAndInitFlag
|
||||
(algorithm, TypedAHEncryptDecryptDestructor)) != 0)
|
||||
return (status);
|
||||
|
||||
return ((*((AHEncryptDecrypt *)algorithm->z.handler)->vTable->DecryptFinal)
|
||||
((AHEncryptDecrypt *)algorithm->z.handler, partOut, partOutLen,
|
||||
maxPartOutLen, randomAlgorithm, surrenderContext));
|
||||
}
|
||||
|
||||
static void TypedAHEncryptDecryptDestructor (typeCheck)
|
||||
B_TypeCheck *typeCheck;
|
||||
{
|
||||
(*((AHEncryptDecrypt *)typeCheck)->vTable->Destructor)
|
||||
((AHEncryptDecrypt *)typeCheck);
|
||||
}
|
||||
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AHENCRYP_H_
|
||||
#define _AHENCRYP_H_ 1
|
||||
|
||||
#include "btypechk.h"
|
||||
|
||||
/* In C++:
|
||||
class AHEncryptDecrypt : public B_TypeCheck {
|
||||
AHEncryptDecrypt ();
|
||||
virtual ~AHEncryptDecrypt () = 0;
|
||||
|
||||
virtual int getBlockLen (unsigned int *) = 0;
|
||||
virtual int encryptInit
|
||||
(B_Key *, B_ALGORITHM_CHOOSER, A_SURRENDER_CTX *) = 0;
|
||||
virtual int decryptInit
|
||||
(B_Key *, B_ALGORITHM_CHOOSER, A_SURRENDER_CTX *) = 0;
|
||||
virtual int encryptUpdate
|
||||
(unsigned char *, unsigned int *, unsigned int, unsigned char *,
|
||||
unsigned int, B_Algorithm *, A_SURRENDER_CTX *) = 0;
|
||||
virtual int decryptUpdate
|
||||
(unsigned char *, unsigned int *, unsigned int, unsigned char *,
|
||||
unsigned int, B_Algorithm *, A_SURRENDER_CTX *) = 0;
|
||||
virtual int encryptFinal
|
||||
(unsigned char *, unsigned int *, unsigned int, B_Algorithm *,
|
||||
A_SURRENDER_CTX *) = 0;
|
||||
virtual int decryptFinal
|
||||
(unsigned char *, unsigned int *, unsigned int, B_Algorithm *,
|
||||
A_SURRENDER_CTX *) = 0;
|
||||
};
|
||||
*/
|
||||
|
||||
/* Use the THIS_ENCRYPT_DECRYPT macro to define the type of object in the
|
||||
virtual function prototype. It defaults to the most base class, but
|
||||
derived modules may define the macro to a more derived class before
|
||||
including this header file.
|
||||
*/
|
||||
#ifndef THIS_ENCRYPT_DECRYPT
|
||||
#define THIS_ENCRYPT_DECRYPT struct AHEncryptDecrypt
|
||||
#endif
|
||||
|
||||
struct AHEncryptDecrypt;
|
||||
|
||||
typedef struct {
|
||||
void (*Destructor) PROTO_LIST ((THIS_ENCRYPT_DECRYPT *));
|
||||
int (*GetBlockLen) PROTO_LIST ((THIS_ENCRYPT_DECRYPT *, unsigned int *));
|
||||
int (*EncryptInit) PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, B_Key *, B_ALGORITHM_CHOOSER,
|
||||
A_SURRENDER_CTX *));
|
||||
int (*DecryptInit) PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, B_Key *, B_ALGORITHM_CHOOSER,
|
||||
A_SURRENDER_CTX *));
|
||||
int (*EncryptUpdate) PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *, unsigned int,
|
||||
const unsigned char *, unsigned int, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
int (*DecryptUpdate) PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *, unsigned int,
|
||||
const unsigned char *, unsigned int, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
int (*EncryptFinal) PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *, unsigned int,
|
||||
B_Algorithm *, A_SURRENDER_CTX *));
|
||||
int (*DecryptFinal) PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *, unsigned int,
|
||||
B_Algorithm *, A_SURRENDER_CTX *));
|
||||
} AHEncryptDecryptVTable;
|
||||
|
||||
typedef struct AHEncryptDecrypt {
|
||||
B_TypeCheck typeCheck; /* inherited */
|
||||
AHEncryptDecryptVTable *vTable; /* pure virtual */
|
||||
} AHEncryptDecrypt;
|
||||
|
||||
/* The constructor does not set the vTable since this is a pure base class.
|
||||
*/
|
||||
void AHEncryptDecryptConstructor PROTO_LIST ((AHEncryptDecrypt *));
|
||||
/* No destructor because it is pure virtual. Also, do not call destructor
|
||||
for B_TypeCheck, since this will just re-invoke this virtual
|
||||
destructor. */
|
||||
|
||||
#endif
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ahgen.h"
|
||||
#include "port_after.h"
|
||||
|
||||
static void TypedAHGenerateDestructor PROTO_LIST ((B_TypeCheck *));
|
||||
|
||||
void AHGenerateConstructor (handler)
|
||||
AHGenerate *handler;
|
||||
{
|
||||
/* Construct base class, setting type tag. */
|
||||
B_TYPE_CHECK_Constructor
|
||||
(&handler->typeCheck, TypedAHGenerateDestructor);
|
||||
|
||||
/* Don't set vTable since this is a pure virtual base class. */
|
||||
}
|
||||
|
||||
int B_AlgorithmGenerateInit (algorithm, algorithmChooser, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
B_ALGORITHM_CHOOSER algorithmChooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckType
|
||||
(algorithm, TypedAHGenerateDestructor)) != 0)
|
||||
return (status);
|
||||
|
||||
if ((status =
|
||||
(*((AHGenerate *)algorithm->z.handler)->vTable->GenerateInit)
|
||||
((AHGenerate *)algorithm->z.handler, algorithmChooser,
|
||||
surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
algorithm->z.initFlag = 1;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int B_AlgorithmGenerateKeypair
|
||||
(algorithm, publicKey, privateKey, randomAlgorithm, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
B_Key *publicKey;
|
||||
B_Key *privateKey;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckTypeAndInitFlag
|
||||
(algorithm, TypedAHGenerateDestructor)) != 0)
|
||||
return (status);
|
||||
|
||||
return ((*((AHGenerate *)algorithm->z.handler)->vTable->GenerateKeypair)
|
||||
((AHGenerate *)algorithm->z.handler, publicKey, privateKey,
|
||||
randomAlgorithm, surrenderContext));
|
||||
}
|
||||
|
||||
int B_AlgorithmGenerateParameters
|
||||
(algorithm, resultAlgorithm, randomAlgorithm, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
B_Algorithm *resultAlgorithm;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckTypeAndInitFlag
|
||||
(algorithm, TypedAHGenerateDestructor)) != 0)
|
||||
return (status);
|
||||
|
||||
return ((*((AHGenerate *)algorithm->z.handler)->vTable->GenerateParameters)
|
||||
((AHGenerate *)algorithm->z.handler, resultAlgorithm,
|
||||
randomAlgorithm, surrenderContext));
|
||||
}
|
||||
|
||||
static void TypedAHGenerateDestructor (typeCheck)
|
||||
B_TypeCheck *typeCheck;
|
||||
{
|
||||
(*((AHGenerate *)typeCheck)->vTable->Destructor) ((AHGenerate *)typeCheck);
|
||||
}
|
||||
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AHGEN_H_
|
||||
#define _AHGEN_H_ 1
|
||||
|
||||
#include "btypechk.h"
|
||||
|
||||
/* Use the THIS_GENERATE macro to define the type of object in the
|
||||
virtual function prototype. It defaults to the most base class, but
|
||||
derived modules may define the macro to a more derived class before
|
||||
including this header file.
|
||||
*/
|
||||
#ifndef THIS_GENERATE
|
||||
#define THIS_GENERATE struct AHGenerate
|
||||
#endif
|
||||
|
||||
struct AHGenerate;
|
||||
|
||||
typedef struct {
|
||||
void (*Destructor) PROTO_LIST ((THIS_GENERATE *));
|
||||
int (*GenerateInit) PROTO_LIST
|
||||
((THIS_GENERATE *, B_ALGORITHM_CHOOSER, A_SURRENDER_CTX *));
|
||||
int (*GenerateKeypair) PROTO_LIST
|
||||
((THIS_GENERATE *, B_Key *, B_Key *, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
int (*GenerateParameters) PROTO_LIST
|
||||
((THIS_GENERATE *, B_Algorithm *, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
} AHGenerateVTable;
|
||||
|
||||
typedef struct AHGenerate {
|
||||
B_TypeCheck typeCheck; /* inherited */
|
||||
AHGenerateVTable *vTable; /* pure virtual */
|
||||
} AHGenerate;
|
||||
|
||||
/* The constructor does not set the vTable since this is a pure base class.
|
||||
*/
|
||||
void AHGenerateConstructor PROTO_LIST ((AHGenerate *));
|
||||
/* No destructor because it is pure virtual. Also, do not call destructor
|
||||
for B_TypeCheck, since this will just re-invoke this virtual
|
||||
destructor. */
|
||||
|
||||
#endif
|
||||
|
|
@ -1,99 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ahrandom.h"
|
||||
#include "port_after.h"
|
||||
|
||||
static void TypedAHRandomDestructor PROTO_LIST ((B_TypeCheck *));
|
||||
|
||||
void AHRandomConstructor (handler)
|
||||
AHRandom *handler;
|
||||
{
|
||||
/* Construct base class, setting type tag. */
|
||||
B_TYPE_CHECK_Constructor
|
||||
(&handler->typeCheck, TypedAHRandomDestructor);
|
||||
|
||||
/* Don't set vTable since this is a pure virtual base class. */
|
||||
}
|
||||
|
||||
int B_AlgorithmRandomInit (algorithm, algorithmChooser, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
B_ALGORITHM_CHOOSER algorithmChooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckType (algorithm, TypedAHRandomDestructor))
|
||||
!= 0)
|
||||
return (status);
|
||||
|
||||
if ((status =
|
||||
(*((AHRandom *)algorithm->z.handler)->vTable->RandomInit)
|
||||
((AHRandom *)algorithm->z.handler, algorithmChooser, surrenderContext))
|
||||
!= 0)
|
||||
return (status);
|
||||
|
||||
algorithm->z.initFlag = 1;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int B_AlgorithmRandomUpdate (algorithm, input, inputLen, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
unsigned char *input;
|
||||
unsigned int inputLen;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = B_AlgorithmCheckTypeAndInitFlag
|
||||
(algorithm, TypedAHRandomDestructor)) != 0)
|
||||
return (status == BE_ALGORITHM_NOT_INITIALIZED ?
|
||||
BE_RANDOM_NOT_INITIALIZED : status);
|
||||
|
||||
return ((*((AHRandom *)algorithm->z.handler)->vTable->RandomUpdate)
|
||||
((AHRandom *)algorithm->z.handler, input, inputLen,
|
||||
surrenderContext));
|
||||
}
|
||||
|
||||
int B_AlgorithmGenerateRandomBytes
|
||||
(algorithm, output, outputLen, surrenderContext)
|
||||
B_Algorithm *algorithm;
|
||||
unsigned char *output;
|
||||
unsigned int outputLen;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
/* As a special case, check here for a null this pointer when the object
|
||||
is actually being used since many routines take a "dummy" null
|
||||
random algorithm.
|
||||
*/
|
||||
if (algorithm == (B_Algorithm *)NULL_PTR)
|
||||
return (BE_RANDOM_OBJ);
|
||||
|
||||
if ((status = B_AlgorithmCheckTypeAndInitFlag
|
||||
(algorithm, TypedAHRandomDestructor)) != 0)
|
||||
return (status == BE_ALGORITHM_NOT_INITIALIZED ?
|
||||
BE_RANDOM_NOT_INITIALIZED : status);
|
||||
|
||||
return ((*((AHRandom *)algorithm->z.handler)->vTable->GenerateBytes)
|
||||
((AHRandom *)algorithm->z.handler, output, outputLen,
|
||||
surrenderContext));
|
||||
}
|
||||
|
||||
static void TypedAHRandomDestructor (typeCheck)
|
||||
B_TypeCheck *typeCheck;
|
||||
{
|
||||
(*((AHRandom *)typeCheck)->vTable->Destructor) ((AHRandom *)typeCheck);
|
||||
}
|
||||
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AHRANDOM_H_
|
||||
#define _AHRANDOM_H_ 1
|
||||
|
||||
#include "btypechk.h"
|
||||
|
||||
/* Use the THIS_RANDOM macro to define the type of object in the
|
||||
virtual function prototype. It defaults to the most base class, but
|
||||
derived modules may define the macro to a more derived class before
|
||||
including this header file.
|
||||
*/
|
||||
#ifndef THIS_RANDOM
|
||||
#define THIS_RANDOM struct AHRandom
|
||||
#endif
|
||||
|
||||
struct AHRandom;
|
||||
|
||||
typedef struct {
|
||||
void (*Destructor) PROTO_LIST ((THIS_RANDOM *));
|
||||
int (*RandomInit) PROTO_LIST
|
||||
((THIS_RANDOM *, B_ALGORITHM_CHOOSER, A_SURRENDER_CTX *));
|
||||
int (*RandomUpdate) PROTO_LIST
|
||||
((THIS_RANDOM *, unsigned char *, unsigned int, A_SURRENDER_CTX *));
|
||||
int (*GenerateBytes) PROTO_LIST
|
||||
((THIS_RANDOM *, unsigned char *, unsigned int, A_SURRENDER_CTX *));
|
||||
} AHRandomVTable;
|
||||
|
||||
typedef struct AHRandom {
|
||||
B_TypeCheck typeCheck; /* inherited */
|
||||
AHRandomVTable *vTable; /* pure virtual */
|
||||
} AHRandom;
|
||||
|
||||
/* The constructor does not set the vTable since this is a pure base class.
|
||||
*/
|
||||
void AHRandomConstructor PROTO_LIST ((AHRandom *));
|
||||
/* No destructor because it is pure virtual. Also, do not call destructor
|
||||
for B_TypeCheck, since this will just re-invoke this virtual
|
||||
destructor. */
|
||||
|
||||
#endif
|
||||
|
|
@ -1,244 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
/* Define this so that the type of the 'this' pointer in the
|
||||
virtual functions will be correct for this derived class.
|
||||
*/
|
||||
struct AH_RSAEncryption;
|
||||
#define THIS_ENCRYPT_DECRYPT struct AH_RSAEncryption
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ahrsaenc.h"
|
||||
#include "port_after.h"
|
||||
|
||||
static int AH_RSAEncryptionInitHelper PROTO_LIST ((AH_RSAEncryption *, int));
|
||||
|
||||
static AHEncryptDecryptVTable V_TABLE = {
|
||||
AH_RSAEncryptionDestructor, AH_RSAEncryptionGetBlockLen,
|
||||
AH_RSAEncryptionEncryptInit, AH_RSAEncryptionDecryptInit,
|
||||
AH_RSAEncryptionUpdate,
|
||||
AH_RSAEncryptionUpdate,
|
||||
AH_RSAEncryptionEncryptFinal, AH_RSAEncryptionDecryptFinal
|
||||
};
|
||||
|
||||
void AH_RSAEncryptionConstructor1 (handler, infoType)
|
||||
AH_RSAEncryption *handler;
|
||||
struct B_AlgorithmInfoType *infoType;
|
||||
{
|
||||
/* Construct base class with the infoType. Assume info is NULL_PTR. */
|
||||
AHChooseEncryptConstructor2
|
||||
(&handler->chooseEncryptDecrypt, infoType, NULL_PTR);
|
||||
|
||||
T_memset ((POINTER)&handler->z, 0, sizeof (handler->z));
|
||||
/* Set the AHEncryptDecrypt vTable, but don't set the RSAEncryption vTable
|
||||
since it is pure virtual. */
|
||||
handler->chooseEncryptDecrypt.encryptDecrypt.vTable = &V_TABLE;
|
||||
}
|
||||
|
||||
void AH_RSAEncryptionDestructor (handler)
|
||||
AH_RSAEncryption *handler;
|
||||
{
|
||||
T_memset ((POINTER)handler->z.block, 0, handler->z.blockLen);
|
||||
T_free ((POINTER)handler->z.block);
|
||||
|
||||
/* Call base class destructor */
|
||||
AHChooseEncryptDestructor (handler);
|
||||
}
|
||||
|
||||
int AH_RSAEncryptionGetBlockLen (handler, blockLen)
|
||||
AH_RSAEncryption *handler;
|
||||
unsigned int *blockLen;
|
||||
{
|
||||
UNUSED_ARG (handler)
|
||||
UNUSED_ARG (blockLen)
|
||||
return (BE_NOT_SUPPORTED);
|
||||
}
|
||||
|
||||
int AH_RSAEncryptionEncryptInit (handler, key, chooser, surrenderContext)
|
||||
AH_RSAEncryption *handler;
|
||||
B_Key *key;
|
||||
B_ALGORITHM_CHOOSER chooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = AHChooseEncryptEncryptInit
|
||||
(handler, key, chooser, surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
return (AH_RSAEncryptionInitHelper (handler, 1));
|
||||
}
|
||||
|
||||
int AH_RSAEncryptionDecryptInit (handler, key, chooser, surrenderContext)
|
||||
AH_RSAEncryption *handler;
|
||||
B_Key *key;
|
||||
B_ALGORITHM_CHOOSER chooser;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
|
||||
if ((status = AHChooseEncryptDecryptInit
|
||||
(handler, key, chooser, surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
return (AH_RSAEncryptionInitHelper (handler, 0));
|
||||
}
|
||||
|
||||
/* Accumulate into the z.block.
|
||||
*/
|
||||
int AH_RSAEncryptionUpdate
|
||||
(handler, partOut, partOutLen, maxPartOutLen, partIn, partInLen,
|
||||
randomAlgorithm, surrenderContext)
|
||||
AH_RSAEncryption *handler;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
const unsigned char *partIn;
|
||||
unsigned int partInLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
UNUSED_ARG (partOut)
|
||||
UNUSED_ARG (maxPartOutLen)
|
||||
UNUSED_ARG (randomAlgorithm)
|
||||
UNUSED_ARG (surrenderContext)
|
||||
*partOutLen = 0;
|
||||
|
||||
if (handler->_inputLen + partInLen > handler->_maxInputLen)
|
||||
return (BE_INPUT_LEN);
|
||||
T_memcpy
|
||||
((POINTER)(handler->z.block + handler->_inputLen), (CPOINTER)partIn,
|
||||
partInLen);
|
||||
handler->_inputLen += partInLen;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int AH_RSAEncryptionEncryptFinal
|
||||
(handler, partOut, partOutLen, maxPartOutLen, randomAlgorithm,
|
||||
surrenderContext)
|
||||
AH_RSAEncryption *handler;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
unsigned int dummyPartOutLen;
|
||||
|
||||
/* Encode methodContext in place. */
|
||||
if ((status = (*handler->vTable->EncodeBlock)
|
||||
(handler, randomAlgorithm, surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
/* This should not return BE_INPUT_DATA since it is well-formatted. */
|
||||
if ((status = AHChooseEncryptEncryptUpdate
|
||||
(handler, partOut, partOutLen, maxPartOutLen, handler->z.block,
|
||||
handler->z.blockLen, (B_Algorithm *)NULL_PTR, surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
/* Expect final to return zero bytes. */
|
||||
if ((status = AHChooseEncryptEncryptFinal
|
||||
(handler, (unsigned char *)NULL_PTR, &dummyPartOutLen, 0,
|
||||
(B_Algorithm *)NULL_PTR, surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
/* Restart the handle for new input. */
|
||||
handler->_inputLen = 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int AH_RSAEncryptionDecryptFinal
|
||||
(handler, partOut, partOutLen, maxPartOutLen, randomAlgorithm,
|
||||
surrenderContext)
|
||||
AH_RSAEncryption *handler;
|
||||
unsigned char *partOut;
|
||||
unsigned int *partOutLen;
|
||||
unsigned int maxPartOutLen;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
ITEM output;
|
||||
int status;
|
||||
unsigned int decryptedLen, dummyPartOutLen;
|
||||
|
||||
UNUSED_ARG (randomAlgorithm)
|
||||
/* Decrypt block in place. The block lenghts are already within limits.
|
||||
*/
|
||||
if ((status = AHChooseEncryptDecryptUpdate
|
||||
(handler, handler->z.block, &decryptedLen, handler->z.blockLen,
|
||||
handler->z.block, handler->_inputLen, (B_Algorithm *)NULL_PTR,
|
||||
surrenderContext)) != 0)
|
||||
return (status);
|
||||
/* Expect final to return zero bytes. */
|
||||
if ((status = AHChooseEncryptDecryptFinal
|
||||
(handler, (unsigned char *)NULL_PTR, &dummyPartOutLen, 0,
|
||||
(B_Algorithm *)NULL_PTR, surrenderContext)) != 0)
|
||||
return (status);
|
||||
|
||||
/* Restart the handle for new input. */
|
||||
handler->_inputLen = 0;
|
||||
|
||||
/* Now decode the block and copy the result to the partOut.
|
||||
*/
|
||||
if ((status = (*handler->vTable->DecodeBlock)
|
||||
(handler, &output, decryptedLen)) != 0)
|
||||
return (status);
|
||||
|
||||
if (output.len > handler->z.blockLen - 11)
|
||||
/* This implies that the block was encrypted with less than
|
||||
8 bytes of padding */
|
||||
return (BE_INPUT_DATA);
|
||||
|
||||
if ((*partOutLen = output.len) > maxPartOutLen)
|
||||
return (BE_OUTPUT_LEN);
|
||||
T_memcpy ((POINTER)partOut, (POINTER)output.data, output.len);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int AH_RSAEncryptionInitHelper (handler, encryptFlag)
|
||||
AH_RSAEncryption *handler;
|
||||
int encryptFlag;
|
||||
{
|
||||
int status;
|
||||
unsigned int newBlockLen;
|
||||
|
||||
if ((status = AHChooseEncryptGetBlockLen (handler, &newBlockLen)) != 0)
|
||||
return (status);
|
||||
|
||||
if (newBlockLen < 12)
|
||||
/* PKCS Requires at least 12 bytes of modulus */
|
||||
return (BE_NOT_SUPPORTED);
|
||||
|
||||
/* During encrypt, this will ensure that there are 8 bytes of padding.
|
||||
During decrypt, the DecodeBlock procedure must check that the block
|
||||
was encrypted with 8 bytes of padding.
|
||||
*/
|
||||
handler->_maxInputLen = encryptFlag ? (newBlockLen - 11) : newBlockLen;
|
||||
|
||||
handler->_inputLen = 0;
|
||||
|
||||
/* Zeroize old block and realloc to new size.
|
||||
*/
|
||||
T_memset ((POINTER)handler->z.block, 0, handler->z.blockLen);
|
||||
if ((handler->z.block = (unsigned char *)T_realloc
|
||||
((POINTER)handler->z.block, newBlockLen))
|
||||
== (unsigned char *)NULL_PTR) {
|
||||
handler->z.blockLen = 0;
|
||||
return (BE_ALLOC);
|
||||
}
|
||||
|
||||
handler->z.blockLen = newBlockLen;
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AHRSAENC_H_
|
||||
#define _AHRSAENC_H_
|
||||
|
||||
#include "ahchencr.h"
|
||||
|
||||
struct AH_RSAEncryption;
|
||||
|
||||
/* For EncodeBlock, the block to encode is left justified in the
|
||||
z.block with length given by z._inputLen. EncodeBlock encodes the block
|
||||
in place to fill it out to z.blockLen.
|
||||
For DecodeBlock, return the contents in the given ITEM by decoding
|
||||
the z.block value which has length given by decryptedLen. This
|
||||
procedure must also ensure that the block was encrypted with 8 bytes
|
||||
of padding.
|
||||
*/
|
||||
typedef struct {
|
||||
int (*EncodeBlock) PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, B_Algorithm * /* randomAlgorithm */,
|
||||
A_SURRENDER_CTX *));
|
||||
int (*DecodeBlock) PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, ITEM *, unsigned int /* decryptedLen */));
|
||||
} AH_RSAEncryptionVTable;
|
||||
|
||||
typedef struct AH_RSAEncryption {
|
||||
AHChooseEncryptDecrypt chooseEncryptDecrypt; /* base class */
|
||||
|
||||
struct {
|
||||
unsigned char *block;
|
||||
unsigned int blockLen;
|
||||
} z; /* Zeroized by constructor */
|
||||
|
||||
unsigned int _inputLen; /* Length of data accumulated by Update */
|
||||
unsigned int _maxInputLen; /* used during update to check for overflow */
|
||||
AH_RSAEncryptionVTable *vTable; /* pure virtual */
|
||||
} AH_RSAEncryption;
|
||||
|
||||
void AH_RSAEncryptionConstructor1 PROTO_LIST
|
||||
((AH_RSAEncryption *, struct B_AlgorithmInfoType *));
|
||||
void AH_RSAEncryptionDestructor PROTO_LIST ((AH_RSAEncryption *));
|
||||
|
||||
int AH_RSAEncryptionGetBlockLen PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned int *));
|
||||
int AH_RSAEncryptionEncryptInit PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, B_Key *, B_ALGORITHM_CHOOSER,
|
||||
A_SURRENDER_CTX *));
|
||||
int AH_RSAEncryptionDecryptInit PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, B_Key *, B_ALGORITHM_CHOOSER,
|
||||
A_SURRENDER_CTX *));
|
||||
int AH_RSAEncryptionUpdate PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *,
|
||||
unsigned int, const unsigned char *, unsigned int, B_Algorithm *,
|
||||
A_SURRENDER_CTX *));
|
||||
int AH_RSAEncryptionEncryptFinal PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *,
|
||||
unsigned int, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
int AH_RSAEncryptionDecryptFinal PROTO_LIST
|
||||
((THIS_ENCRYPT_DECRYPT *, unsigned char *, unsigned int *,
|
||||
unsigned int, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
|
||||
#endif
|
||||
|
|
@ -1,101 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
/* Define this so that the type of the 'this' pointer in the
|
||||
virtual functions will be correct for this derived class.
|
||||
*/
|
||||
struct AH_RSAEncryption;
|
||||
#define THIS_ENCRYPT_DECRYPT struct AH_RSAEncryption
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ahrsaepr.h"
|
||||
#include "port_after.h"
|
||||
|
||||
static int EncodeBlock1 PROTO_LIST
|
||||
((AH_RSAEncryptionPrivate *, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
static int DecodeBlock2 PROTO_LIST
|
||||
((AH_RSAEncryptionPrivate *, ITEM *, unsigned int));
|
||||
|
||||
static AH_RSAEncryptionVTable ENCRYPTION_V_TABLE =
|
||||
{EncodeBlock1, DecodeBlock2};
|
||||
|
||||
extern struct B_AlgorithmInfoType AIT_RSAPrivate;
|
||||
|
||||
AH_RSAEncryptionPrivate *AH_RSAEncrypPrivateConstructor (handler)
|
||||
AH_RSAEncryptionPrivate *handler;
|
||||
{
|
||||
if (handler == (AH_RSAEncryptionPrivate *)NULL_PTR) {
|
||||
/* This constructor is being used to do a new */
|
||||
if ((handler = (AH_RSAEncryptionPrivate *)T_malloc (sizeof (*handler)))
|
||||
== (AH_RSAEncryptionPrivate *)NULL_PTR)
|
||||
return (handler);
|
||||
}
|
||||
|
||||
/* Construct base class */
|
||||
AH_RSAEncryptionConstructor1 (handler, &AIT_RSAPrivate);
|
||||
|
||||
handler->vTable = &ENCRYPTION_V_TABLE;
|
||||
return (handler);
|
||||
}
|
||||
|
||||
/* block1 starts out with the input bytes of length inputLen left-justified.
|
||||
Returns 0, BE_INPUT_LEN.
|
||||
*/
|
||||
static int EncodeBlock1 (handler, randomAlgorithm, surrenderContext)
|
||||
AH_RSAEncryptionPrivate *handler;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
unsigned int padLen;
|
||||
|
||||
UNUSED_ARG (randomAlgorithm)
|
||||
UNUSED_ARG (surrenderContext)
|
||||
if ((handler->_inputLen + 3) > handler->z.blockLen)
|
||||
/* input is too large to make a block 1 */
|
||||
return (BE_INPUT_LEN);
|
||||
|
||||
padLen = handler->z.blockLen - (handler->_inputLen + 3);
|
||||
T_memmove
|
||||
((POINTER)(handler->z.block + padLen + 3), (POINTER)handler->z.block,
|
||||
handler->_inputLen);
|
||||
|
||||
handler->z.block[0] = 0;
|
||||
handler->z.block[1] = 1;
|
||||
T_memset ((POINTER)(handler->z.block + 2), 0xff, padLen);
|
||||
handler->z.block[2 + padLen] = 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int DecodeBlock2 (handler, output, block2Len)
|
||||
AH_RSAEncryptionPrivate *handler;
|
||||
ITEM *output;
|
||||
unsigned int block2Len;
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if ((handler->z.block[0] != 0) || (handler->z.block[1] != 2))
|
||||
return (BE_INPUT_DATA);
|
||||
|
||||
/* Should be able to find the data after the first zero byte following
|
||||
the random bytes. */
|
||||
for (i = 2; i < block2Len && handler->z.block[i] != 0; i++);
|
||||
i++;
|
||||
|
||||
if (i > block2Len)
|
||||
/* The data is not zero terminated. */
|
||||
return (BE_INPUT_DATA);
|
||||
|
||||
output->len = block2Len - i;
|
||||
output->data = handler->z.block + i;
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AHRSAEPR_H_
|
||||
#define _AHRSAEPR_H_
|
||||
|
||||
#include "ahrsaenc.h"
|
||||
|
||||
/* structure is identical to base class, so just re-typedef. */
|
||||
typedef AH_RSAEncryption AH_RSAEncryptionPrivate;
|
||||
|
||||
AH_RSAEncryptionPrivate *AH_RSAEncrypPrivateConstructor PROTO_LIST
|
||||
((AH_RSAEncryptionPrivate *));
|
||||
|
||||
#endif
|
||||
|
|
@ -1,114 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
/* Define this so that the type of the 'this' pointer in the
|
||||
virtual functions will be correct for this derived class.
|
||||
*/
|
||||
struct AH_RSAEncryption;
|
||||
#define THIS_ENCRYPT_DECRYPT struct AH_RSAEncryption
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ahrsaepu.h"
|
||||
#include "port_after.h"
|
||||
|
||||
static int EncodeBlock2 PROTO_LIST
|
||||
((AH_RSAEncryptionPublic *, B_Algorithm *, A_SURRENDER_CTX *));
|
||||
static int DecodeBlock1 PROTO_LIST
|
||||
((AH_RSAEncryptionPublic *, ITEM *, unsigned int));
|
||||
|
||||
static AH_RSAEncryptionVTable ENCRYPTION_V_TABLE =
|
||||
{EncodeBlock2, DecodeBlock1};
|
||||
|
||||
extern struct B_AlgorithmInfoType AIT_RSAPublic;
|
||||
|
||||
AH_RSAEncryptionPublic *AH_RSAEncrypPublicConstructor (handler)
|
||||
AH_RSAEncryptionPublic *handler;
|
||||
{
|
||||
if (handler == (AH_RSAEncryptionPublic *)NULL_PTR) {
|
||||
/* This constructor is being used to do a new */
|
||||
if ((handler = (AH_RSAEncryptionPublic *)T_malloc (sizeof (*handler)))
|
||||
== (AH_RSAEncryptionPublic *)NULL_PTR)
|
||||
return (handler);
|
||||
}
|
||||
|
||||
/* Construct base class */
|
||||
AH_RSAEncryptionConstructor1 (handler, &AIT_RSAPublic);
|
||||
|
||||
handler->vTable = &ENCRYPTION_V_TABLE;
|
||||
return (handler);
|
||||
}
|
||||
|
||||
/* block starts out with the input bytes of length inputLen left-justified.
|
||||
*/
|
||||
static int EncodeBlock2 (handler, randomAlgorithm, surrenderContext)
|
||||
AH_RSAEncryptionPublic *handler;
|
||||
B_Algorithm *randomAlgorithm;
|
||||
A_SURRENDER_CTX *surrenderContext;
|
||||
{
|
||||
int status;
|
||||
unsigned char randomByte;
|
||||
unsigned int padLen, i;
|
||||
|
||||
if ((handler->_inputLen + 3) > handler->z.blockLen)
|
||||
/* input is too large to make a block 2 */
|
||||
return (BE_INPUT_LEN);
|
||||
|
||||
padLen = handler->z.blockLen - (handler->_inputLen + 3);
|
||||
T_memmove
|
||||
((POINTER)(handler->z.block + padLen + 3), (POINTER)handler->z.block,
|
||||
handler->_inputLen);
|
||||
|
||||
handler->z.block[0] = 0;
|
||||
handler->z.block[1] = 2;
|
||||
|
||||
/* Pad out with random bytes, making sure that none of the bytes is zero.
|
||||
*/
|
||||
for (i = 2; i < (padLen + 2); i++) {
|
||||
do {
|
||||
if ((status = B_AlgorithmGenerateRandomBytes
|
||||
(randomAlgorithm, &randomByte, 1, surrenderContext)) != 0)
|
||||
return (status);
|
||||
} while (randomByte == 0);
|
||||
|
||||
handler->z.block[i] = randomByte;
|
||||
}
|
||||
|
||||
handler->z.block[2 + padLen] = 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int DecodeBlock1 (handler, output, block1Len)
|
||||
AH_RSAEncryptionPublic *handler;
|
||||
ITEM *output;
|
||||
unsigned int block1Len;
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
/* Locate the digestInfo within the PKCS block 1.
|
||||
*/
|
||||
if (handler->z.block[0] != 0 || handler->z.block[1] != 1)
|
||||
return (BE_INPUT_DATA);
|
||||
|
||||
/* Should be able to find the data after the first zero byte following
|
||||
the 0xff. */
|
||||
for (i = 2; i < block1Len && handler->z.block[i] == 0xff; i++);
|
||||
i++;
|
||||
|
||||
if (i > block1Len || handler->z.block[i - 1] != 0)
|
||||
/* The data is not zero terminated, or a byte other than 0xff. */
|
||||
return (BE_INPUT_DATA);
|
||||
|
||||
output->len = block1Len - i;
|
||||
output->data = handler->z.block + i;
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AHRSAEPU_H_
|
||||
#define _AHRSAEPU_H_
|
||||
|
||||
#include "ahrsaenc.h"
|
||||
|
||||
/* structure is identical to base class, so just re-typedef. */
|
||||
typedef AH_RSAEncryption AH_RSAEncryptionPublic;
|
||||
|
||||
AH_RSAEncryptionPublic *AH_RSAEncrypPublicConstructor PROTO_LIST
|
||||
((AH_RSAEncryptionPublic *));
|
||||
|
||||
#endif
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ahchdig.h"
|
||||
#include "aichdig.h"
|
||||
#include "port_after.h"
|
||||
|
||||
B_TypeCheck *AITChooseDigestNullNewHandler PROTO_LIST
|
||||
((B_AlgorithmInfoType *, B_Algorithm *));
|
||||
|
||||
B_AlgorithmInfoTypeVTable AITChooseDigestNull_V_TABLE =
|
||||
{AITNullAddInfo, AITChooseDigestNullNewHandler,
|
||||
B_AlgorithmInfoTypeMakeError};
|
||||
|
||||
/* This always uses NULL_PTR for the info.
|
||||
*/
|
||||
B_TypeCheck *AITChooseDigestNullNewHandler (infoType, algorithm)
|
||||
B_AlgorithmInfoType *infoType;
|
||||
B_Algorithm *algorithm;
|
||||
{
|
||||
UNUSED_ARG (algorithm)
|
||||
|
||||
/* Pass in NULL_PTR so that constructor will allocate.
|
||||
*/
|
||||
return ((B_TypeCheck *)AHChooseDigestConstructor2
|
||||
((AHChooseDigest *)NULL_PTR, infoType, NULL_PTR));
|
||||
}
|
||||
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AICHDIG_H_
|
||||
#define _AICHDIG_H_ 1
|
||||
|
||||
#include "ainfotyp.h"
|
||||
#include "ainull.h"
|
||||
|
||||
extern B_AlgorithmInfoTypeVTable AITChooseDigestNull_V_TABLE;
|
||||
|
||||
#endif
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "aichenc8.h"
|
||||
#include "port_after.h"
|
||||
|
||||
B_AlgorithmInfoTypeVTable AITChooseEncrypt8_V_TABLE =
|
||||
{AIT_8AddInfo, AITChooseEncryptNewHandler, B_AlgorithmInfoTypeMakeError};
|
||||
|
||||
int AIT_8AddInfo (infoType, algorithm, info)
|
||||
B_AlgorithmInfoType *infoType;
|
||||
B_Algorithm *algorithm;
|
||||
POINTER info;
|
||||
{
|
||||
POINTER newInfo;
|
||||
int status;
|
||||
|
||||
if ((status = B_MemoryPoolAllocAndCopy
|
||||
(&algorithm->infoCache.memoryPool, &newInfo, info, 8)) != 0)
|
||||
return (status);
|
||||
|
||||
return (B_InfoCacheAddInfo
|
||||
(&algorithm->infoCache, (POINTER)infoType, newInfo));
|
||||
}
|
||||
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AICHENC8_H_
|
||||
#define _AICHENC8_H_ 1
|
||||
|
||||
#include "aichencr.h"
|
||||
|
||||
extern B_AlgorithmInfoTypeVTable AITChooseEncrypt8_V_TABLE;
|
||||
|
||||
int AIT_8AddInfo PROTO_LIST
|
||||
((THIS_ALGORITHM_INFO_TYPE *, B_Algorithm *, POINTER));
|
||||
|
||||
#endif
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "aichencn.h"
|
||||
#include "port_after.h"
|
||||
|
||||
B_AlgorithmInfoTypeVTable AITChooseEncryptNull_V_TABLE =
|
||||
{AITNullAddInfo, AITChooseEncryptNewHandler, B_AlgorithmInfoTypeMakeError};
|
||||
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AICHENCN_H_
|
||||
#define _AICHENCN_H_ 1
|
||||
|
||||
#include "aichencr.h"
|
||||
#include "ainull.h"
|
||||
|
||||
extern B_AlgorithmInfoTypeVTable AITChooseEncryptNull_V_TABLE;
|
||||
|
||||
#endif
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ahchencr.h"
|
||||
#include "aichencr.h"
|
||||
#include "port_after.h"
|
||||
|
||||
B_TypeCheck *AITChooseEncryptNewHandler (infoType, algorithm)
|
||||
B_AlgorithmInfoType *infoType;
|
||||
B_Algorithm *algorithm;
|
||||
{
|
||||
POINTER info;
|
||||
|
||||
if (B_InfoCacheFindInfo (&algorithm->infoCache, &info, (POINTER)infoType)
|
||||
!= 0)
|
||||
/* This really shouldn't happen since the info was just added. */
|
||||
return ((B_TypeCheck *)NULL_PTR);
|
||||
|
||||
/* Pass in NULL_PTR so that constructor will allocate. */
|
||||
return ((B_TypeCheck *)AHChooseEncryptConstructor2
|
||||
((AHChooseEncryptDecrypt *)NULL_PTR, infoType, info));
|
||||
}
|
||||
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AICHENCR_H_
|
||||
#define _AICHENCR_H_ 1
|
||||
|
||||
#include "ainfotyp.h"
|
||||
|
||||
struct B_TypeCheck *AITChooseEncryptNewHandler PROTO_LIST
|
||||
((B_AlgorithmInfoType *, B_Algorithm *));
|
||||
|
||||
#endif
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ahchgen.h"
|
||||
#include "aichgen.h"
|
||||
#include "port_after.h"
|
||||
|
||||
B_TypeCheck *AITChooseGenerateNewHandler (infoType, algorithm)
|
||||
B_AlgorithmInfoType *infoType;
|
||||
B_Algorithm *algorithm;
|
||||
{
|
||||
POINTER info;
|
||||
|
||||
if (B_InfoCacheFindInfo (&algorithm->infoCache, &info, (POINTER)infoType)
|
||||
!= 0)
|
||||
/* This really shouldn't happen since the info was just added. */
|
||||
return ((B_TypeCheck *)NULL_PTR);
|
||||
|
||||
/* Pass in NULL_PTR so that constructor will allocate. */
|
||||
return ((B_TypeCheck *)AHChooseGenerateConstructor2
|
||||
((AHChooseGenerate *)NULL_PTR, infoType, info));
|
||||
}
|
||||
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AICHGEN_H_
|
||||
#define _AICHGEN_H_ 1
|
||||
|
||||
#include "ainfotyp.h"
|
||||
|
||||
struct B_TypeCheck *AITChooseGenerateNewHandler PROTO_LIST
|
||||
((B_AlgorithmInfoType *, B_Algorithm *));
|
||||
|
||||
#endif
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ahchrand.h"
|
||||
#include "aichrand.h"
|
||||
#include "port_after.h"
|
||||
|
||||
B_TypeCheck *AITChooseRandomNullNewHandler PROTO_LIST
|
||||
((B_AlgorithmInfoType *, B_Algorithm *));
|
||||
|
||||
B_AlgorithmInfoTypeVTable AITChooseRandomNull_V_TABLE =
|
||||
{AITNullAddInfo, AITChooseRandomNullNewHandler,
|
||||
B_AlgorithmInfoTypeMakeError};
|
||||
|
||||
/* This always uses NULL_PTR for the info.
|
||||
*/
|
||||
B_TypeCheck *AITChooseRandomNullNewHandler (infoType, algorithm)
|
||||
B_AlgorithmInfoType *infoType;
|
||||
B_Algorithm *algorithm;
|
||||
{
|
||||
UNUSED_ARG (algorithm)
|
||||
|
||||
/* Pass in NULL_PTR so that constructor will allocate.
|
||||
*/
|
||||
return ((B_TypeCheck *)AHChooseRandomConstructor2
|
||||
((AHChooseRandom *)NULL_PTR, infoType, NULL_PTR));
|
||||
}
|
||||
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AICHRAND_H_
|
||||
#define _AICHRAND_H_ 1
|
||||
|
||||
#include "ainfotyp.h"
|
||||
#include "ainull.h"
|
||||
|
||||
extern B_AlgorithmInfoTypeVTable AITChooseRandomNull_V_TABLE;
|
||||
|
||||
#endif
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "aichdig.h"
|
||||
#include "port_after.h"
|
||||
|
||||
B_AlgorithmInfoType AIT_MD5 = {&AITChooseDigestNull_V_TABLE};
|
||||
|
||||
int AI_MD5 (infoType)
|
||||
POINTER *infoType;
|
||||
{
|
||||
*infoType = (POINTER)&AIT_MD5;
|
||||
|
||||
/* Return 0 to indicate a B_AlgorithmInfoType, not a B_KeyInfoType */
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "aichrand.h"
|
||||
#include "port_after.h"
|
||||
|
||||
B_AlgorithmInfoType AIT_MD5Random = {&AITChooseRandomNull_V_TABLE};
|
||||
|
||||
int AI_MD5Random (infoType)
|
||||
POINTER *infoType;
|
||||
{
|
||||
*infoType = (POINTER)&AIT_MD5Random;
|
||||
|
||||
/* Return 0 to indicate a B_AlgorithmInfoType, not a B_KeyInfoType */
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ainfotyp.h"
|
||||
#include "port_after.h"
|
||||
|
||||
/* This is the default routine which algorithm info types point MakeInfo to
|
||||
if not redefined by a derived class.
|
||||
*/
|
||||
int B_AlgorithmInfoTypeMakeError (infoType, info, algorithm)
|
||||
B_AlgorithmInfoType *infoType;
|
||||
POINTER *info;
|
||||
B_Algorithm *algorithm;
|
||||
{
|
||||
UNUSED_ARG (infoType)
|
||||
UNUSED_ARG (info)
|
||||
UNUSED_ARG (algorithm)
|
||||
|
||||
/* Should already have been found in the cache. */
|
||||
return (BE_WRONG_ALGORITHM_INFO);
|
||||
}
|
||||
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _AINFOTYP_H_
|
||||
#define _AINFOTYP_H_ 1
|
||||
|
||||
/* Use the THIS_ALGORITHM_INFO_TYPE macro to define the type of object in the
|
||||
virtual function prototype. It defaults to the most base class, but
|
||||
derived modules may define the macro to a more derived class before
|
||||
including this header file.
|
||||
*/
|
||||
#ifndef THIS_ALGORITHM_INFO_TYPE
|
||||
#define THIS_ALGORITHM_INFO_TYPE struct B_AlgorithmInfoType
|
||||
#endif
|
||||
|
||||
struct B_AlgorithmInfoType;
|
||||
|
||||
typedef struct {
|
||||
int (*AddInfo) PROTO_LIST
|
||||
((THIS_ALGORITHM_INFO_TYPE *, B_Algorithm *, POINTER));
|
||||
struct B_TypeCheck * (*NewHandler) PROTO_LIST
|
||||
((THIS_ALGORITHM_INFO_TYPE *, B_Algorithm *));
|
||||
int (*MakeInfo) PROTO_LIST
|
||||
((THIS_ALGORITHM_INFO_TYPE *, POINTER *, B_Algorithm *));
|
||||
} B_AlgorithmInfoTypeVTable;
|
||||
|
||||
typedef struct B_AlgorithmInfoType {
|
||||
B_AlgorithmInfoTypeVTable *vTable;
|
||||
} B_AlgorithmInfoType;
|
||||
|
||||
int B_AlgorithmInfoTypeMakeError PROTO_LIST
|
||||
((THIS_ALGORITHM_INFO_TYPE *, POINTER *, B_Algorithm *));
|
||||
|
||||
#endif
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ainfotyp.h"
|
||||
#include "ainull.h"
|
||||
#include "port_after.h"
|
||||
|
||||
int AITNullAddInfo (infoType, algorithm, info)
|
||||
B_AlgorithmInfoType *infoType;
|
||||
B_Algorithm *algorithm;
|
||||
POINTER info;
|
||||
{
|
||||
UNUSED_ARG (info)
|
||||
/* Cache null parameters. */
|
||||
return (B_InfoCacheAddInfo
|
||||
(&algorithm->infoCache, (POINTER)infoType, NULL_PTR));
|
||||
}
|
||||
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
int AITNullAddInfo PROTO_LIST
|
||||
((THIS_ALGORITHM_INFO_TYPE *, B_Algorithm *, POINTER));
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ainfotyp.h"
|
||||
#include "ainull.h"
|
||||
#include "ahrsaepr.h"
|
||||
#include "port_after.h"
|
||||
|
||||
B_TypeCheck *AIT_PKCS_RSAPrivateNewHandler PROTO_LIST
|
||||
((B_AlgorithmInfoType *, B_Algorithm *));
|
||||
|
||||
static B_AlgorithmInfoTypeVTable V_TABLE =
|
||||
{AITNullAddInfo, AIT_PKCS_RSAPrivateNewHandler,
|
||||
B_AlgorithmInfoTypeMakeError};
|
||||
|
||||
B_AlgorithmInfoType AIT_PKCS_RSAPrivate = {&V_TABLE};
|
||||
|
||||
int AI_PKCS_RSAPrivate (infoType)
|
||||
POINTER *infoType;
|
||||
{
|
||||
*infoType = (POINTER)&AIT_PKCS_RSAPrivate;
|
||||
|
||||
/* Return 0 to indicate a B_AlgorithmInfoType, not a B_KeyInfoType */
|
||||
return (0);
|
||||
}
|
||||
|
||||
B_TypeCheck *AIT_PKCS_RSAPrivateNewHandler (infoType, algorithm)
|
||||
B_AlgorithmInfoType *infoType;
|
||||
B_Algorithm *algorithm;
|
||||
{
|
||||
UNUSED_ARG (infoType)
|
||||
UNUSED_ARG (algorithm)
|
||||
/* Pass in NULL_PTR so that constructor will allocate. */
|
||||
return ((B_TypeCheck *)AH_RSAEncrypPrivateConstructor
|
||||
((AH_RSAEncryptionPrivate *)NULL_PTR));
|
||||
}
|
||||
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "ainfotyp.h"
|
||||
#include "ainull.h"
|
||||
#include "ahrsaepu.h"
|
||||
#include "port_after.h"
|
||||
|
||||
B_TypeCheck *AIT_PKCS_RSAPublicNewHandler PROTO_LIST
|
||||
((B_AlgorithmInfoType *, B_Algorithm *));
|
||||
|
||||
static B_AlgorithmInfoTypeVTable V_TABLE =
|
||||
{AITNullAddInfo, AIT_PKCS_RSAPublicNewHandler,
|
||||
B_AlgorithmInfoTypeMakeError};
|
||||
|
||||
B_AlgorithmInfoType AIT_PKCS_RSAPublic = {&V_TABLE};
|
||||
|
||||
int AI_PKCS_RSAPublic (infoType)
|
||||
POINTER *infoType;
|
||||
{
|
||||
*infoType = (POINTER)&AIT_PKCS_RSAPublic;
|
||||
|
||||
/* Return 0 to indicate a B_AlgorithmInfoType, not a B_KeyInfoType */
|
||||
return (0);
|
||||
}
|
||||
|
||||
B_TypeCheck *AIT_PKCS_RSAPublicNewHandler (infoType, algorithm)
|
||||
B_AlgorithmInfoType *infoType;
|
||||
B_Algorithm *algorithm;
|
||||
{
|
||||
UNUSED_ARG (infoType)
|
||||
UNUSED_ARG (algorithm)
|
||||
/* Pass in NULL_PTR so that constructor will allocate. */
|
||||
return ((B_TypeCheck *)AH_RSAEncrypPublicConstructor
|
||||
((AH_RSAEncryptionPublic *)NULL_PTR));
|
||||
}
|
||||
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "intitem.h"
|
||||
#include "aichgen.h"
|
||||
#include "port_after.h"
|
||||
|
||||
int AIT_RSAKeyGenAddInfo PROTO_LIST
|
||||
((THIS_ALGORITHM_INFO_TYPE *, B_Algorithm *, POINTER));
|
||||
|
||||
static A_RSA_KEY_GEN_PARAMS STATIC_KEY_GEN_PARAMS;
|
||||
static ITEM *KEY_GEN_PARAMS_ITEMS[] = {&STATIC_KEY_GEN_PARAMS.publicExponent};
|
||||
|
||||
static B_AlgorithmInfoTypeVTable V_TABLE =
|
||||
{AIT_RSAKeyGenAddInfo, AITChooseGenerateNewHandler,
|
||||
B_AlgorithmInfoTypeMakeError};
|
||||
|
||||
B_AlgorithmInfoType AIT_RSAKeyGen = {&V_TABLE};
|
||||
|
||||
int AI_RSAKeyGen (infoType)
|
||||
POINTER *infoType;
|
||||
{
|
||||
*infoType = (POINTER)&AIT_RSAKeyGen;
|
||||
|
||||
/* Return 0 to indicate a B_AlgorithmInfoType, not a B_KeyInfoType */
|
||||
return (0);
|
||||
}
|
||||
|
||||
int AIT_RSAKeyGenAddInfo (infoType, algorithm, info)
|
||||
B_AlgorithmInfoType *infoType;
|
||||
B_Algorithm *algorithm;
|
||||
POINTER info;
|
||||
{
|
||||
A_RSA_KEY_GEN_PARAMS *newInfo;
|
||||
int status;
|
||||
|
||||
if ((status = B_MemoryPoolAlloc
|
||||
(&algorithm->infoCache.memoryPool, (POINTER *)&newInfo,
|
||||
sizeof (A_RSA_KEY_GEN_PARAMS))) != 0)
|
||||
return (status);
|
||||
if ((status = AllocAndCopyIntegerItems
|
||||
((POINTER)newInfo, info, (POINTER)&STATIC_KEY_GEN_PARAMS,
|
||||
KEY_GEN_PARAMS_ITEMS,
|
||||
sizeof (KEY_GEN_PARAMS_ITEMS) / sizeof (KEY_GEN_PARAMS_ITEMS[0]),
|
||||
&algorithm->infoCache.memoryPool)) != 0)
|
||||
return (status);
|
||||
|
||||
newInfo->modulusBits = ((A_RSA_KEY_GEN_PARAMS *)info)->modulusBits;
|
||||
return (B_InfoCacheAddInfo
|
||||
(&algorithm->infoCache, (POINTER)infoType, (POINTER)newInfo));
|
||||
}
|
||||
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "aichencn.h"
|
||||
#include "port_after.h"
|
||||
|
||||
B_AlgorithmInfoType AIT_RSAPrivate = {&AITChooseEncryptNull_V_TABLE};
|
||||
|
||||
int AI_RSAPrivate (infoType)
|
||||
POINTER *infoType;
|
||||
{
|
||||
*infoType = (POINTER)&AIT_RSAPrivate;
|
||||
|
||||
/* Return 0 to indicate a B_AlgorithmInfoType, not a B_KeyInfoType */
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#include "port_before.h"
|
||||
#include "global.h"
|
||||
#include "bsafe2.h"
|
||||
#include "bkey.h"
|
||||
#include "balg.h"
|
||||
#include "aichencn.h"
|
||||
#include "port_after.h"
|
||||
|
||||
B_AlgorithmInfoType AIT_RSAPublic = {&AITChooseEncryptNull_V_TABLE};
|
||||
|
||||
int AI_RSAPublic (infoType)
|
||||
POINTER *infoType;
|
||||
{
|
||||
*infoType = (POINTER)&AIT_RSAPublic;
|
||||
|
||||
/* Return 0 to indicate a B_AlgorithmInfoType, not a B_KeyInfoType */
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
/* Copyright (C) RSA Data Security, Inc. created 1992, 1996. This is an
|
||||
unpublished work protected as such under copyright law. This work
|
||||
contains proprietary, confidential, and trade secret information of
|
||||
RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||||
express written authorization of RSA Data Security, Inc. is
|
||||
prohibited.
|
||||
*/
|
||||
|
||||
#ifndef _ALGAE_H_
|
||||
#define _ALGAE_H_ 1
|
||||
|
||||
#ifndef T_CALL
|
||||
#define T_CALL
|
||||
#endif
|
||||
|
||||
/* Used to reduce the stack size in routines with big scratch buffers.
|
||||
If set to 1, this will make ALGAE allocate these buffers on the heap.
|
||||
*/
|
||||
#ifndef USE_ALLOCED_FRAME
|
||||
#define USE_ALLOCED_FRAME 1
|
||||
#endif
|
||||
|
||||
#include "atypes.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define AE_CANCEL 0x0001
|
||||
#define AE_DATA 0x0002
|
||||
#define AE_EXPONENT_EVEN 0x0003
|
||||
#define AE_EXPONENT_LEN 0x0004
|
||||
#define AE_INPUT_DATA 0x0005
|
||||
#define AE_INPUT_LEN 0x0006
|
||||
#define AE_MODULUS_LEN 0x0007
|
||||
#define AE_NEED_RANDOM 0x0008
|
||||
#define AE_NOT_SUPPORTED 0x0009
|
||||
#define AE_OUTPUT_LEN 0x000a
|
||||
#define AE_NOT_INITIALIZED 0x000b
|
||||
#define AE_KEY_LEN 0x000c
|
||||
#define AE_KEY_INFO 0x000d
|
||||
#define AE_SEQUENCE 0x000e
|
||||
#define AE_PARAMS 0x000f
|
||||
|
||||
#if USE_ALLOCED_FRAME
|
||||
/* Needed only for big number code heap allocation of scratch arrays.
|
||||
*/
|
||||
#define AE_ALLOC 0x0080
|
||||
POINTER T_malloc PROTO_LIST ((unsigned int));
|
||||
void T_free PROTO_LIST ((POINTER));
|
||||
#endif
|
||||
|
||||
/* Routines supplied by the implementor.
|
||||
*/
|
||||
void T_memset PROTO_LIST ((POINTER, int, unsigned int));
|
||||
void T_memcpy PROTO_LIST ((POINTER, CPOINTER, unsigned int));
|
||||
void T_memmove PROTO_LIST ((POINTER, POINTER, unsigned int));
|
||||
int T_memcmp PROTO_LIST ((CPOINTER, CPOINTER, unsigned int));
|
||||
|
||||
unsigned int A_IntegerBits PROTO_LIST ((const unsigned char *, unsigned int));
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue