diff options
Diffstat (limited to 'usr/src/lib/libresolv2/common/cylink/dss.c')
-rw-r--r-- | usr/src/lib/libresolv2/common/cylink/dss.c | 1209 |
1 files changed, 0 insertions, 1209 deletions
diff --git a/usr/src/lib/libresolv2/common/cylink/dss.c b/usr/src/lib/libresolv2/common/cylink/dss.c deleted file mode 100644 index fe907a6f21..0000000000 --- a/usr/src/lib/libresolv2/common/cylink/dss.c +++ /dev/null @@ -1,1209 +0,0 @@ -/* - * Copyright 2001-2002 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -/* - * 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: dss.c PRODUCT NAME: CRYPTOGRAPHIC TOOLKIT -* -* FILE STATUS: -* -* DESCRIPTION: Cryptographic Toolkit Functions File -* Digital Signature Algorithms -* PUBLIC FUNCTIONS: -* uchar *RVAL ) -* 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 ) -* -* int GenDSSNumber( uchar *dss_k, uchar dss_q, -* uchar *KKEY ) -* int GenDSSParameters( u_int16_t dss_p_bytes, uchar *dss_p, -* uchar *dss_q, uchar *dss_g, -* uchar *RVAL ); -* -* Copyright (c) Cylink Corporation 1996. All rights reserved. -* -* REVISION HISTORY: -* -* -****************************************************************************/ - -#pragma ident "%Z%%M% %I% %E% SMI" - -/**************************************************************************** -* 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> -#endif - -/* program files */ -#ifdef VXD -#include "tkvxd.h" -#endif -#include "toolkit.h" -#include "cencrint.h" -#define INITIALIZ_PQG /*TKL01101*/ -#include "dssnum.h" /*TKL01101*/ -#include "sha.h" -#include "port_after.h" - -#define BEGIN_PROCESSING do { -#define END_PROCESSING } while (0); -#define ERROR_BREAK break -#define CONTINUE continue - -#define BEGIN_LOOP do { -#define END_LOOP } while (1); -#define BREAK break - - -extern u_int16_t DataOrder; - -/**************************************************************************** -* NAME: 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) -* -* DESCRIPTION: Compute a DSS Signature -* -* INPUTS: -* PARAMETERS: -* u_int16_t dss_p_bytes Length of dss_p -* uchar *dss_p Pointer to p prime -* uchar *dss_q Pointer to q prime -* uchar *dss_g Pointer to g -* uchar *dss_x Pointer to secret number -* uchar *dss_k Pointer to random secret number -* uchar *hash_result Pointer to message hashing result -* -* -* OUTPUT: -* PARAMETERS: -* uchar *r Pointer to r part of signature -* uchar *s Pointer to s part of signature -* -* RETURN: -* E_SUCCESS No errors -* E_DSS_LEN Invalid length for dss_p -* 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) -* 08 Dec 94 GKL Changed Expo call -* -****************************************************************************/ - -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) - -{ - int status = SUCCESS; /* function return status */ - ord r_temp[DSS_LENGTH_MAX]; /* r intermidiate value */ - ord k_inverse[SHA_LENGTH+1]; - ord temp[SHA_LENGTH+1]; /* intermidiate values */ - ord *dss_p_a; - ord *dss_g_a; - ord *dss_q_a; - ord *dss_x_a; - ord *dss_k_a; - ord *hash_result_a; - ord *r_a; - ord *s_a; - - if ( (dss_p_bytes < DSS_LENGTH_MIN) || /* less than minimal */ - (dss_p_bytes > DSS_LENGTH_MAX) ) /* more than maximal */ - { - status = ERR_DSS_LEN; /* invalid length for dss_p */ - return status; - } - if ( dss_p_bytes & 0x07 ) /* not multiple 8 (64 bit)*/ - { - status = ERR_DSS_LEN; /* invalid length for dss_p */ - return status; - } - - if (DataOrder) - { - if (dss_p) - BigSwap(dss_p, dss_p_bytes); - if (dss_q) - BigSwap(dss_q, SHA_LENGTH); - if (dss_g) - BigSwap(dss_g, dss_p_bytes); - BigSwap(dss_x, SHA_LENGTH); - BigSwap(dss_k, SHA_LENGTH); - BigSwap(hash_result, SHA_LENGTH); - } - - DSS_G_ALIGN_CALLOC_COPY(dss_g, dss_g_a, dss_p_bytes); /*TKL01101*/ - DSS_P_ALIGN_CALLOC_COPY(dss_p, dss_p_a, dss_p_bytes); /*TKL01101*/ - DSS_Q_ALIGN_CALLOC_COPY(dss_q, dss_q_a, SHA_LENGTH); /*TKL01101*/ - - ALIGN_CALLOC_COPY(dss_x, dss_x_a, SHA_LENGTH); - ALIGN_CALLOC_COPY(dss_k, dss_k_a, SHA_LENGTH); - ALIGN_CALLOC_COPY(hash_result, hash_result_a, SHA_LENGTH); - ALIGN_CALLOC(r, r_a, SHA_LENGTH); - ALIGN_CALLOC(s, s_a, SHA_LENGTH); - if ( status != SUCCESS ) - { - if( dss_p_a ) - DSS_ALIGN_FREE(dss_p_a,dss_p); - if( dss_g_a ) - DSS_ALIGN_FREE(dss_g_a,dss_g); - if( dss_q_a ) - DSS_ALIGN_FREE(dss_q_a,dss_q); - if( dss_x_a ) - { - memset ( dss_x_a , 0 , SHA_LENGTH ); - ALIGN_FREE(dss_x_a); - } - if( dss_k_a ) - { - ALIGN_FREE(dss_k_a); - } - if( hash_result_a ) - { - ALIGN_FREE(hash_result_a); - } - if( r_a ) - { - ALIGN_COPY_FREE(r_a,r,SHA_LENGTH); - } - if( s_a ) - { - ALIGN_COPY_FREE(s_a,s,SHA_LENGTH); - } - if (DataOrder) - { - if (dss_p) - BigSwap(dss_p, dss_p_bytes); - if (dss_q) - BigSwap(dss_q, SHA_LENGTH); - if (dss_g) - BigSwap(dss_g, dss_p_bytes); - BigSwap(dss_x, SHA_LENGTH); - BigSwap(dss_k, SHA_LENGTH); - BigSwap(hash_result, SHA_LENGTH); - } - return status; /* ERR_ALLOC insufficient memory */ - } - -/* Compute DSS r value */ - BEGIN_PROCESSING - if (( status = Expo ( dss_p_bytes, - dss_g_a, - SHA_LENGTH, /* r_temp=(dss_g^dss_k)mod(dss_p)*/ - dss_k_a, - dss_p_bytes, - dss_p_a, - r_temp )) != SUCCESS ) - { - ERROR_BREAK; - } - if (( status = PartReduct ( dss_p_bytes, - r_temp, - SHA_LENGTH, /* r=(r_temp)mod(dss_q) */ - dss_q_a, - r_a )) != SUCCESS ) - { - ERROR_BREAK; - } -/* Compute k modulo inverse value */ - if (( status = Inverse( SHA_LENGTH, /* k_inverse=dss_k^(-1)mod(dss_q)*/ - dss_k_a, - SHA_LENGTH, - dss_q_a, - k_inverse )) != SUCCESS ) - { - ERROR_BREAK; - } -/* Compute DSS s value */ - if (( status = Mul ( SHA_LENGTH, /* temp=(dss_x*r)mod(dss_q) */ - dss_x_a, - SHA_LENGTH, - r_a, - SHA_LENGTH, - dss_q_a, - temp )) != SUCCESS ) - { - ERROR_BREAK; - } - - /* Add( temp, hash_result_a, - SHA_LENGTH, dss_q_a, temp ); temp=(temp+hash_result)mod(dss_q)*/ - - Add( temp, hash_result_a, - SHA_LENGTH, dss_q_a ); - if (( status = Mul ( SHA_LENGTH, /* s=(temp*k_inverse)mod(dss_q) */ - temp, - SHA_LENGTH, - k_inverse, - SHA_LENGTH, - dss_q_a, - s_a )) != SUCCESS ) - { - ERROR_BREAK; - } - END_PROCESSING - - DSS_ALIGN_FREE(dss_p_a,dss_p); /*TKL01101*/ - DSS_ALIGN_FREE(dss_g_a,dss_g); /*TKL01101*/ - DSS_ALIGN_FREE(dss_q_a,dss_q); /*TKL01101*/ - ALIGN_FREE(dss_x_a); - ALIGN_FREE(dss_k_a); - ALIGN_FREE(hash_result_a); - ALIGN_COPY_FREE(r_a,r,SHA_LENGTH); - ALIGN_COPY_FREE(s_a,s,SHA_LENGTH); - - if (DataOrder) - { - if (dss_p) - BigSwap(dss_p, dss_p_bytes); - if (dss_q) - BigSwap(dss_q, SHA_LENGTH); - if (dss_g) - BigSwap(dss_g, dss_p_bytes); - BigSwap(dss_x, SHA_LENGTH); - BigSwap(dss_k, SHA_LENGTH); - BigSwap(hash_result, SHA_LENGTH); - BigSwap(r, SHA_LENGTH); - BigSwap(s, SHA_LENGTH); - } - - return status; -} - -/**************************************************************************** -* NAME: 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) -* -* DESCRIPTION: Verify a DSS Signature -* -* INPUTS: -* PARAMETERS: -* u_int16_t dss_p_bytes Length of dss_p -* uchar *dss_p Pointer to p prime -* uchar *dss_q Pointer to q prime -* uchar *dss_g Pointer to g -* uchar *dss_y Pointer to public number -* uchar *hash_result Pointer to message hashing result -* OUTPUT: -* PARAMETERS: -* -* RETURN: -* SUCCESS No errors -* ERR_SIGNATURE Signature is not valid -* ERR_DSS_LEN Invalid length for dss_p -* 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) -* 08 Dec 94 GKL Changed Expo call -* 21 Aug 96 AAB DoubleExpo call -****************************************************************************/ - -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) -{ - int status = SUCCESS; /* function return status */ - ord w[(SHA_LENGTH / sizeof(ord)) + 1]; - ord u1[SHA_LENGTH / sizeof(ord)]; - ord u2[SHA_LENGTH / sizeof(ord)]; - ord *v; - ord *dss_p_a; - ord *dss_g_a; - ord *dss_q_a; - ord *dss_y_a; - ord *hash_result_a; - ord *r_a; - ord *s_a; - if ( (dss_p_bytes < DSS_LENGTH_MIN) || /* less than minimal */ - (dss_p_bytes > DSS_LENGTH_MAX) ) /* more than maximal */ - { - status = ERR_DSS_LEN; /* invalid length for dss_p */ - return status; - } - if ( dss_p_bytes & 0x07 ) /* not multiple 8 (64 bit)*/ - { - status = ERR_DSS_LEN; /* invalid length for dss_p */ - return status; - } - - if (DataOrder) - { - if (dss_p) - BigSwap(dss_p, dss_p_bytes); - if (dss_q) - BigSwap(dss_q, SHA_LENGTH); - if (dss_g) - BigSwap(dss_g, dss_p_bytes); - BigSwap(dss_y, dss_p_bytes); - BigSwap(hash_result, SHA_LENGTH); - BigSwap(r, SHA_LENGTH); - BigSwap(s, SHA_LENGTH); - } - - DSS_P_ALIGN_CALLOC_COPY(dss_p, dss_p_a, dss_p_bytes); /*TKL01101*/ - DSS_Q_ALIGN_CALLOC_COPY(dss_q, dss_q_a, SHA_LENGTH); /*TKL01101*/ - DSS_G_ALIGN_CALLOC_COPY(dss_g, dss_g_a, dss_p_bytes); /*TKL01101*/ - - ALIGN_CALLOC_COPY(dss_y, dss_y_a, dss_p_bytes); - ALIGN_CALLOC_COPY(hash_result, hash_result_a, SHA_LENGTH); - ALIGN_CALLOC_COPY(r, r_a, SHA_LENGTH); - ALIGN_CALLOC_COPY(s, s_a, SHA_LENGTH); - CALLOC(v,ord,dss_p_bytes); - - if ( status != SUCCESS ) - { - if( dss_p_a ) - { - DSS_ALIGN_FREE(dss_p_a,dss_p); - } - if( dss_g_a ) - { - DSS_ALIGN_FREE(dss_g_a,dss_g); - } - if ( dss_q_a ) - { - DSS_ALIGN_FREE(dss_q_a,dss_q); - } - if( dss_y_a ) - { - ALIGN_FREE(dss_y_a); - } - if( hash_result_a ) - { - ALIGN_FREE(hash_result_a); - } - if( r_a ) - { - ALIGN_FREE(r_a); - } - if( s_a ) - { - ALIGN_FREE(s_a); - } - if( v ) - { - free ( v ); - } - if (DataOrder) - { - if (dss_p) - BigSwap(dss_p, dss_p_bytes); - if (dss_q) - BigSwap(dss_q, SHA_LENGTH); - if (dss_g) - BigSwap(dss_g, dss_p_bytes); - BigSwap(dss_y, dss_p_bytes); - BigSwap(hash_result, SHA_LENGTH); - BigSwap(r, SHA_LENGTH); - BigSwap(s, SHA_LENGTH); - } - - return status; /* ERR_ALLOC insufficient memory */ - } - - BEGIN_PROCESSING - if (( status = Inverse( SHA_LENGTH, /* w=dss_k^(-1)mod(dss_q)*/ - s_a, - SHA_LENGTH, - dss_q_a, - w )) !=SUCCESS ) - { - ERROR_BREAK; - } - if (( status = Mul ( SHA_LENGTH, /* u1=(hash_result_*w)mod(dss_q) */ - hash_result_a, - SHA_LENGTH, - w, - SHA_LENGTH, - dss_q_a, - u1 )) != SUCCESS ) - { - ERROR_BREAK; - } - if (( status = Mul ( SHA_LENGTH, /* u2=(r*w)mod(dss_q) */ - r_a, - SHA_LENGTH, - w, - SHA_LENGTH, - dss_q_a, - u2 )) != SUCCESS ) - { - ERROR_BREAK; - } - /* v = dss_g_a^u1*dss_y_a^u2 moddss_p_a */ - if((status = DoubleExpo( dss_p_bytes, dss_g_a, - SHA_LENGTH, u1, - dss_p_bytes, dss_y_a, - SHA_LENGTH, u2, - dss_p_bytes, dss_p_a, v)) != SUCCESS ) - { - - ERROR_BREAK; - } - if (( status = PartReduct ( dss_p_bytes, /*v = v mod(dss_q)*/ - v, - SHA_LENGTH, - dss_q_a, - v )) != SUCCESS ) - { - ERROR_BREAK; - } - - if (( status = memcmp( r_a, v, SHA_LENGTH)) != 0) /*if v=r sign valid */ - { - status = ERR_SIGNATURE; /* signature is not valid */ - ERROR_BREAK; - } - END_PROCESSING - free ( v ); - DSS_ALIGN_FREE(dss_p_a,dss_p); /*TKL01101*/ - DSS_ALIGN_FREE(dss_g_a,dss_g); /*TKL01101*/ - DSS_ALIGN_FREE(dss_q_a,dss_q); /*TKL01101*/ - ALIGN_FREE(dss_y_a); - ALIGN_FREE(hash_result_a); - ALIGN_FREE(r_a); - ALIGN_FREE(s_a); - - if (DataOrder) - { - if (dss_p) - BigSwap(dss_p, dss_p_bytes); - if (dss_q) - BigSwap(dss_q, SHA_LENGTH); - if (dss_g) - BigSwap(dss_g, dss_p_bytes); - BigSwap(dss_y, dss_p_bytes); - BigSwap(hash_result, SHA_LENGTH); - BigSwap(r, SHA_LENGTH); - BigSwap(s, SHA_LENGTH); - } - - return status; -} - - -/**************************************************************************** -* NAME: 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 ) -* -* -* DESCRIPTION: Compute DSS public/secret number pair. -* -* INPUTS: -* PARAMETERS: -* u_int16_t dss_p_bytes Length of modulo -* uchar *dss_p Pointer to modulo -* uchar *dss_q Pointer to modulo -* uchar *dss_g Pointer to public key -* uchar *XKEY Pointer to user supplied random number -* -* -* OUTPUT: -* PARAMETERS: -* uchar *dss_x Pointer to secret key -* uchar *dss_y Pointer to public key -* uchar *XKEY Pointer to updated number -* -* 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) -* 08 Dec 94 GKL Changed Expo call -* -****************************************************************************/ - -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 ) -{ - - int status = SUCCESS; /* function return status */ - SHA_context hash_context; /* SHA context structure */ - uchar M[DSS_LENGTH_MIN]; /* message block */ - ord *dss_p_a; - ord *dss_q_a; - ord *dss_g_a; - ord *dss_x_a; - ord *dss_y_a; - ord *XKEY_a; - if ( (dss_p_bytes < DSS_LENGTH_MIN) || /* less than minimal */ - (dss_p_bytes > DSS_LENGTH_MAX) ) /* more than maximal */ - { - status = ERR_DSS_LEN; /* invalid length for dss_p */ - return status; - } - if ( dss_p_bytes & 0x07 ) /* not multiple 8 (64 bit)*/ - { - status = ERR_DSS_LEN; /* invalid length for dss_p */ - return status; - } - if (DataOrder) - { - if (dss_p) - BigSwap(dss_p, dss_p_bytes); - if (dss_q) - BigSwap(dss_q, SHA_LENGTH); - if (dss_g) - BigSwap(dss_g, dss_p_bytes); - } - - DSS_P_ALIGN_CALLOC_COPY(dss_p, dss_p_a, dss_p_bytes); /*TKL01101*/ - DSS_G_ALIGN_CALLOC_COPY(dss_g, dss_g_a, dss_p_bytes); /*TKL01101*/ - DSS_Q_ALIGN_CALLOC_COPY(dss_q, dss_q_a, SHA_LENGTH); /*TKL01101*/ - ALIGN_CALLOC(dss_x, dss_x_a, SHA_LENGTH); - ALIGN_CALLOC(dss_y, dss_y_a, dss_p_bytes); - if ( status != SUCCESS ) - { - if( dss_p_a ) - DSS_ALIGN_FREE(dss_p_a,dss_p); - if( dss_g_a ) - DSS_ALIGN_FREE(dss_g_a,dss_g); - if( dss_q_a ) - DSS_ALIGN_FREE(dss_q_a,dss_q); - if( dss_x_a ) - { - memset(dss_x_a, 0, SHA_LENGTH ); - ALIGN_COPY_FREE(dss_x_a,dss_x,SHA_LENGTH); - } - if( dss_y_a ) - { - ALIGN_COPY_FREE(dss_y_a,dss_y,dss_p_bytes); - } - - if (DataOrder) - { - if (dss_p) - BigSwap(dss_p, dss_p_bytes); - if (dss_q) - BigSwap(dss_q, SHA_LENGTH); - if (dss_g) - BigSwap(dss_g, dss_p_bytes); - } - return status; /* ERR_ALLOC insufficient memory */ - } - - BEGIN_PROCESSING - SHAInit ( &hash_context ); - memcpy( M, XKEY, SHA_LENGTH); - memset( M + SHA_LENGTH, 0, DSS_LENGTH_MIN - SHA_LENGTH ); - if ( (status = SHAUpdate( &hash_context, M, DSS_LENGTH_MIN )) - != SUCCESS ) - { - ERROR_BREAK; - } - if ( (status = MySHAFinal (&hash_context, (uchar *)dss_x_a)) != SUCCESS ) - { - ERROR_BREAK; - } - if (( status = PartReduct ( SHA_LENGTH, /* dss_x = dss_x mod(dss_q)*/ - dss_x_a, - SHA_LENGTH, - dss_q_a, - dss_x_a )) != SUCCESS ) - { - ERROR_BREAK; - } - - BigSwap(XKEY, SHA_LENGTH); - ALIGN_CALLOC_COPY(XKEY, XKEY_a, SHA_LENGTH); - if ( status != SUCCESS ) - { - if( XKEY_a ) - { - ALIGN_COPY_FREE(XKEY_a,XKEY,SHA_LENGTH); - BigSwap(XKEY, SHA_LENGTH); - return status; /* ERR_ALLOC insufficient memory */ - } - } - - Sum_Q((ord*)XKEY_a, 1, SHA_LENGTH / sizeof (ord) ); - - Sum_big( XKEY_a, dss_x_a, /* XKEY=XKEY+dss_x */ - XKEY_a, SHA_LENGTH / sizeof(ord) ); - - ALIGN_COPY_FREE(XKEY_a,XKEY,SHA_LENGTH); - BigSwap(XKEY, SHA_LENGTH); - - if (( status = Expo ( dss_p_bytes, /*dss_y = g^dss_x mod(dss_p)*/ - dss_g_a, - SHA_LENGTH, - dss_x_a, - dss_p_bytes, - dss_p_a, - dss_y_a)) != SUCCESS ) /*TKL00601*/ - { - ERROR_BREAK; - } - END_PROCESSING - - DSS_ALIGN_FREE(dss_p_a,dss_p); /*TKL01101*/ - DSS_ALIGN_FREE(dss_g_a,dss_g); /*TKL01101*/ - DSS_ALIGN_FREE(dss_q_a,dss_q); /*TKL01101*/ - ALIGN_COPY_FREE(dss_x_a,dss_x,SHA_LENGTH); - ALIGN_COPY_FREE(dss_y_a,dss_y,dss_p_bytes); - if (DataOrder) - { - if (dss_p) - BigSwap(dss_p, dss_p_bytes); - if (dss_q) - BigSwap(dss_q, SHA_LENGTH); - if (dss_g) - BigSwap(dss_g, dss_p_bytes); - BigSwap(dss_x, SHA_LENGTH); - BigSwap(dss_y, dss_p_bytes); - } - - return status; -} - - - -/**************************************************************************** -* NAME: int GenDSSNumber( uchar *dss_k, -* uchar *dss_q, -* uchar *KKEY ) -* -* DESCRIPTION: Generate secret number -* -* INPUTS: -* PARAMETERS: -* uchar *KKEY Pointer to input random number -* uchar *dss_q Pointer to modulo -* -* -* OUTPUT: -* PARAMETERS: -* uchar *dss_x Pointer to secret number -* uchar *KKEY Pointer to updated KKEY -* -* RETURN: -* SUCCESS No errors -* 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 GenDSSNumber( uchar *dss_k, - uchar *dss_q, - uchar *KKEY ) -{ - - int status = SUCCESS; /* function return status */ - ord *dss_k_a; - ord *dss_q_a; - ord *KKEY_a; - SHA_context hash_context; /* SHA context structure*/ - uchar M[DSS_LENGTH_MIN]; /* message block */ - - if (DataOrder) - { - if (dss_q) - BigSwap(dss_q, SHA_LENGTH); - } - - DSS_Q_ALIGN_CALLOC_COPY(dss_q, dss_q_a, SHA_LENGTH); /*TKL01101*/ - ALIGN_CALLOC(dss_k, dss_k_a, SHA_LENGTH); - if ( status != SUCCESS ) - { - if( dss_q_a ) - DSS_ALIGN_FREE(dss_q_a,dss_q); - if( dss_k_a ) - { - ALIGN_COPY_FREE(dss_k_a,dss_k,SHA_LENGTH); - } - if (DataOrder) - { - if (dss_q) - BigSwap(dss_q, SHA_LENGTH); - } - return status; /* ERR_ALLOC insufficient memory */ - } - - BEGIN_PROCESSING - SHAInitK ( &hash_context ); - memcpy( M, KKEY, SHA_LENGTH); - memset( M + SHA_LENGTH, 0, DSS_LENGTH_MIN - SHA_LENGTH ); - if ( (status = SHAUpdate( &hash_context, M, DSS_LENGTH_MIN )) - != SUCCESS ) - { - ERROR_BREAK; - } - if ( (status = MySHAFinal (&hash_context, (uchar *)dss_k_a)) != SUCCESS ) - { - ERROR_BREAK; - } - if (( status = PartReduct ( SHA_LENGTH, /* dss_k = dss_k mod(dss_q)*/ - dss_k_a, - SHA_LENGTH, - dss_q_a, - dss_k_a )) != SUCCESS ) - { - ERROR_BREAK; - } - BigSwap(KKEY, SHA_LENGTH); - ALIGN_CALLOC_COPY(KKEY, KKEY_a, SHA_LENGTH ); - if ( status != SUCCESS ) - { - if ( KKEY_a ) - { - ALIGN_COPY_FREE(KKEY_a,KKEY,SHA_LENGTH); - BigSwap(KKEY, SHA_LENGTH); - } - return status; /* ERR_ALLOC insufficient memory */ - } - - Sum_Q( KKEY_a, 1, SHA_LENGTH / sizeof(ord)); - - Sum_big( KKEY_a, dss_k_a, /* KKEY=KKEY+dss_k*/ - KKEY_a, SHA_LENGTH / sizeof(ord) ); - - ALIGN_COPY_FREE(KKEY_a,KKEY,SHA_LENGTH); - BigSwap(KKEY, SHA_LENGTH); - - END_PROCESSING - - DSS_ALIGN_FREE(dss_q_a,dss_q); /*TKL01101*/ - - ALIGN_COPY_FREE(dss_k_a,dss_k,SHA_LENGTH); - if (DataOrder) - { - if (dss_q) - BigSwap(dss_q, SHA_LENGTH); - BigSwap(dss_k, SHA_LENGTH); - } - - return status; -} - - -/**************************************************************************** -* NAME: int GenDSSParameters( u_int16_t dss_p_bytes, -* uchar *dss_p, -* uchar *dss_q, -* uchar *dss_g, -* uchar *RVAL, -* YIELD_context *yield_cont ) -* -* DESCRIPTION: Generate DSS Common Parameters -* -* INPUTS: -* PARAMETERS: -* u_int16_t dss_p_bytes Number of bytes in dss_p -* uchar *RVAL Pointer to user supplied random number -* YIELD_context *yield_cont Pointer to yield_cont structure (NULL if not used) -* OUTPUT: -* PARAMETERS: -* uchar *dss_p Pointer to N-byte prime number -* uchar *dss_q Pointer to SHA_LENGTH prime number -* uchar *dss_g Pointer to N-byte number -* RETURN: -* SUCCESS No errors -* ERR_INPUT_LEN Invalid length for input data(zero bytes) -* ERR_DSS_LEN; Invalid length for dss_p -* 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) -* 08 Dec 94 GKL Added YIELD_context -* -****************************************************************************/ - - int GenDSSParameters( u_int16_t dss_p_bytes, - uchar *dss_p, - uchar *dss_q, - uchar *dss_g, - uchar *RVAL, - YIELD_context *yield_cont ) /*TKL00701*/ -{ - int status = SUCCESS; /* function return status */ - ord seed[SHA_LENGTH / sizeof (ord)]; - ord u[SHA_LENGTH / sizeof (ord)]; /* work buffers */ - ord u1[SHA_LENGTH / sizeof (ord)]; - ord *dss_p_a; - ord *dss_q_a; - ord *dss_g_a; - ord *RVAL_a; - ord ofone[SHA_LENGTH / sizeof(ord)]; - ord dss_q2[SHA_LENGTH / sizeof(ord) + 1]; /* dss_q2 = 2 * q */ - ord v[SHA_LENGTH / sizeof(ord)]; - ord *w, *c, *c1, *one, *e; /* Pointers to work buffers */ - u_int16_t i, n, count, offset, k; /* counters */ - u_int16_t dss_p_longs; /* number of longs */ - if ( dss_p_bytes == 0 ) /* invalid length for input data (zero bytes) */ - { - status = ERR_INPUT_LEN; - return status; - } - if ( (dss_p_bytes < DSS_LENGTH_MIN) || /* less than minimal */ - (dss_p_bytes > DSS_LENGTH_MAX) ) /* more than maximal */ - { - status = ERR_DSS_LEN; /* invalid length for dss_p */ - return status; - } - if ( dss_p_bytes & 0x07 ) /* not multiple 4 (64 bit)*/ - { - status = ERR_DSS_LEN; /* invalid length for dss_p */ - return status; - } - - n = (u_int16_t) (dss_p_bytes / SHA_LENGTH); /* SHA passes count */ - dss_p_longs = (u_int16_t) (dss_p_bytes / sizeof(ord)); /* number of long in dss_p */ - CALLOC(w, ord, (n + 1) * SHA_LENGTH); - CALLOC(c, ord, dss_p_bytes); - CALLOC(c1, ord, dss_p_bytes); - CALLOC(one, ord, dss_p_bytes); - CALLOC(e,ord, dss_p_bytes - SHA_LENGTH + sizeof(ord)); - ALIGN_CALLOC_MOVE(RVAL, RVAL_a, SHA_LENGTH); - ALIGN_CALLOC(dss_p, dss_p_a, dss_p_bytes); - ALIGN_CALLOC(dss_q, dss_q_a, SHA_LENGTH); - ALIGN_CALLOC(dss_g, dss_g_a, dss_p_bytes); - if ( status != SUCCESS ) - { - if( e ) - free ( e ); - if( one ) - free ( one ); - if( c ) - free ( c ); - if( w ) - free ( w ); - if( c1 ) - free ( c1 ); - if( dss_p_a ) - { - ALIGN_COPY_FREE(dss_p_a, dss_p, dss_p_bytes); - } - if( dss_q_a ) - { - ALIGN_COPY_FREE(dss_q_a, dss_q, SHA_LENGTH); - } - if( dss_g_a ) - { - ALIGN_COPY_FREE(dss_g_a, dss_g, dss_p_bytes); - } - if( RVAL_a ) - { - ALIGN_MOVE_FREE(RVAL_a, RVAL, SHA_LENGTH); - } - return status; /* ERR_ALLOC insufficient memory */ - } - one[0] = 1; - BEGIN_PROCESSING /* Generate DSS Common Parameters */ - - BEGIN_LOOP /* Generate prime & dss_p */ /*TKL00501*/ - /* generate prime number of length 160-bit */ - do - { - MyGenRand( SHA_LENGTH, seed, RVAL_a); /* generate random number */ - /* compute message digest from seed */ - if ( (status = MySHA((uchar *)seed, SHA_LENGTH, (uchar *)u)) != SUCCESS ) - { - break; /* error */ - } - memcpy(ofone, seed,SHA_LENGTH); - Sum_Q( ofone, 1, SHA_LENGTH / sizeof(ord) ); - /* compute message digest from seed */ - if ( (status = MySHA( (uchar *)ofone, SHA_LENGTH,(uchar *)dss_q_a)) != SUCCESS ) - { - break; /* error */ - } - - for ( i = 0; i < (SHA_LENGTH / sizeof(ord)); i++ ) /* dss_q = dss_q ^ u */ - { - dss_q_a[i] = dss_q_a[i] ^ u[i]; - } - /* set least and most significant bits */ - dss_q_a[SHA_LENGTH / sizeof(ord) - 1] |= ((ord)1 << (BITS_COUNT-1)); - dss_q_a[0] |= 0x01; - } while ( VerPrime( SHA_LENGTH, dss_q_a, TEST_COUNT, RVAL_a, yield_cont) /*TKL00701*/ - != SUCCESS ); /* perform a robust primality test */ - if (status != SUCCESS ) - { - ERROR_BREAK; - } - /* dss_q2 = 2 * dss_q */ - memcpy( dss_q2, dss_q_a, SHA_LENGTH ); - dss_q2[SHA_LENGTH / sizeof(ord)] = 0; - LShiftL_big( dss_q2, SHA_LENGTH / sizeof(ord) +1, 1 ); - count = 0; - offset = 2; - memset( ofone, 0, SHA_LENGTH ); - do /* find dss_p */ - { - /* generate random number by dss_p bytes */ - for ( k = 0; k <= n; k++ ) - { - ofone[0] = offset + k; - /* v = ofone + seed */ - Sum_big( seed, ofone, v, SHA_LENGTH / sizeof(ord) ); - if ( (status = MySHA ( (uchar *)v, SHA_LENGTH, - (uchar *)( w + (SHA_LENGTH / sizeof(ord)) * k ))) - != SUCCESS ) /* compute message digest */ - { - break; /* error */ - } - } - if (status != SUCCESS ) - { - break; /* error */ - } - /* set most significant bit */ - w[dss_p_longs - 1] |= ((ord)1 << (BITS_COUNT-1)); - memcpy( c, w, dss_p_bytes); - /* c1 = c mod(dss_q2) */ - if( (status = PartReduct( dss_p_bytes, c, - SHA_LENGTH + sizeof(ord), - dss_q2, c1)) != SUCCESS ) - { - break; /* error */ - } - /* c1 = c1 - 1*/ - Sub_big( c1, one, c1, dss_p_longs ); - /* dss_p = w - c1 */ - Sub_big( w, c1, dss_p_a, dss_p_longs ); - if ( dss_p_a[dss_p_bytes / sizeof(ord) - 1] >= (ord)((ord)1 << (BITS_COUNT-1)) ) - { - if ( VerPrime ( dss_p_bytes, dss_p_a, TEST_COUNT, RVAL_a, yield_cont) /*TKL00701*/ - == SUCCESS ) /* perform a robust primality test */ - { - break; - } - } - count++; - offset = (u_int16_t) (offset + n + 1); - } while ( count < 4096); - if (status != SUCCESS ) - { - ERROR_BREAK; - } - if (count != 4096) /*TKL00501*/ - { - BREAK; /*TKL00501*/ - } - END_LOOP /* Generate dss_p */ /*TKL00501*/ - - if (status != SUCCESS ) - { - ERROR_BREAK; - } - dss_p_a[0] -= 1; /* dss_p = dss_p - 1 */ - if ( (status= DivRem (dss_p_bytes, dss_p_a, SHA_LENGTH, dss_q_a, u1, - e )) != SUCCESS ) /* e = dss_p / dss_q */ - { - ERROR_BREAK; - } - dss_p_a[0] += 1; /* dss_p = dss_p + 1 */ - - BEGIN_LOOP /* Generate dss_g */ /*TKL00501*/ - MyGenRand( SHA_LENGTH, u, RVAL_a ); /*generate random number*/ - u[SHA_LENGTH / sizeof(ord) - 1] &= ~((ord)1 << (BITS_COUNT-1)); /* u < dss_q */ - if ( (status = Expo( SHA_LENGTH, u, (u_int16_t)(dss_p_bytes - SHA_LENGTH + - sizeof(ord)), e, dss_p_bytes, dss_p_a, dss_g_a )) - != SUCCESS ) /* dss_g = e ^ u mod(dss_p) */ - { - ERROR_BREAK; - } - if ( dss_g_a[0] == 1 ) /* check dss_g == 1 */ - { - for ( i = 1; i < (dss_p_bytes / sizeof(ord)); i++ ) - { - if ( dss_g_a[i] != 0 ) - { - break; - } - } - if ( i == (dss_p_bytes / sizeof(ord)) ) - { - CONTINUE; - } - } - BREAK; /*TKL00501*/ - END_LOOP /* Generate dss_g */ /*TKL00501*/ - END_PROCESSING /* Generate DSS Common Parameters */ - free ( e ); - free ( one ); - free ( c ); - free ( w ); - free ( c1 ); - ALIGN_COPY_FREE(dss_p_a, dss_p, dss_p_bytes); - ALIGN_COPY_FREE(dss_q_a, dss_q, SHA_LENGTH); - ALIGN_COPY_FREE(dss_g_a, dss_g, dss_p_bytes); - ALIGN_MOVE_FREE(RVAL_a, RVAL, SHA_LENGTH); - if (DataOrder) - { - BigSwap(dss_p, dss_p_bytes); - BigSwap(dss_q, SHA_LENGTH); - BigSwap(dss_g, dss_p_bytes); - } - return status; -} - - -/**************************************************************************** -* NAME: int GetDSSPQG(u_int16_t dss_p_bytes, -* uchar *dss_p, -* uchar *dss_q, -* uchar *dss_g) -* -* DESCRIPTION: Copy Cylink DSS P,Q,G numbers to *dss_p,*dss_q,*dss_g -* -* INPUTS: -* PARAMETERS: -* u_int16_t dss_p_bytes Number of bytes in dss_p -* uchar *dss_p Pointer to N-byte buffer -* uchar *dss_q Pointer to SHA_LENGTH-byte buffer -* uchar *dss_g Pointer to N-byte buffer -* OUTPUT: -* RETURN: -* SUCCESS No errors -* ERR_DSS_LEN; Invalid length for dss_p -* REVISION HISTORY: -* -* 22 Apr 95 GKL Initial release LOG TKL01201 -* -****************************************************************************/ -int GetDSSPQG(u_int16_t dss_p_bytes, - uchar *dss_p, - uchar *dss_q, - uchar *dss_g) -{ - int status = SUCCESS; /* function return status */ - ord *dss_p_a; - ord *dss_g_a; - - if ( (dss_p_bytes < DSS_LENGTH_MIN) || /* less than minimal */ - (dss_p_bytes > DSS_LENGTH_MAX) ) /* more than maximal */ - { - status = ERR_DSS_LEN; /* invalid length for dss_p */ - return status; - } - if ( dss_p_bytes & 0x07 ) /* not multiple 8 (64 bit)*/ - { - status = ERR_DSS_LEN; /* invalid length for dss_p */ - return status; - } - dss_p_a = &DSS_P_NUMBERS[DSS_NUM_INDEX[(dss_p_bytes-DSS_LENGTH_MIN)/LENGTH_STEP]]; - dss_g_a = &DSS_G_NUMBERS[DSS_NUM_INDEX[(dss_p_bytes-DSS_LENGTH_MIN)/LENGTH_STEP]]; - OrdByte(dss_p_a,dss_p_bytes,dss_p); - OrdByte(dss_g_a,dss_p_bytes,dss_g); - OrdByte(DSS_Q_NUMBER,SHA_LENGTH,dss_q); - if (DataOrder) - { - BigSwap(dss_p, dss_p_bytes); - BigSwap(dss_q, SHA_LENGTH); - BigSwap(dss_g, dss_p_bytes); - } - - return status; -} - - |