155714Skris/* crypto/des/qud_cksm.c */ 255714Skris/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 355714Skris * All rights reserved. 455714Skris * 555714Skris * This package is an SSL implementation written 655714Skris * by Eric Young (eay@cryptsoft.com). 755714Skris * The implementation was written so as to conform with Netscapes SSL. 855714Skris * 955714Skris * This library is free for commercial and non-commercial use as long as 1055714Skris * the following conditions are aheared to. The following conditions 1155714Skris * apply to all code found in this distribution, be it the RC4, RSA, 1255714Skris * lhash, DES, etc., code; not just the SSL code. The SSL documentation 1355714Skris * included with this distribution is covered by the same copyright terms 1455714Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com). 1555714Skris * 1655714Skris * Copyright remains Eric Young's, and as such any Copyright notices in 1755714Skris * the code are not to be removed. 1855714Skris * If this package is used in a product, Eric Young should be given attribution 1955714Skris * as the author of the parts of the library used. 2055714Skris * This can be in the form of a textual message at program startup or 2155714Skris * in documentation (online or textual) provided with the package. 2255714Skris * 2355714Skris * Redistribution and use in source and binary forms, with or without 2455714Skris * modification, are permitted provided that the following conditions 2555714Skris * are met: 2655714Skris * 1. Redistributions of source code must retain the copyright 2755714Skris * notice, this list of conditions and the following disclaimer. 2855714Skris * 2. Redistributions in binary form must reproduce the above copyright 2955714Skris * notice, this list of conditions and the following disclaimer in the 3055714Skris * documentation and/or other materials provided with the distribution. 3155714Skris * 3. All advertising materials mentioning features or use of this software 3255714Skris * must display the following acknowledgement: 3355714Skris * "This product includes cryptographic software written by 3455714Skris * Eric Young (eay@cryptsoft.com)" 3555714Skris * The word 'cryptographic' can be left out if the rouines from the library 3655714Skris * being used are not cryptographic related :-). 3755714Skris * 4. If you include any Windows specific code (or a derivative thereof) from 3855714Skris * the apps directory (application code) you must include an acknowledgement: 3955714Skris * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 4055714Skris * 4155714Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 4255714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4355714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 4455714Skris * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 4555714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 4655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 4755714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 4955714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 5055714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 5155714Skris * SUCH DAMAGE. 5255714Skris * 5355714Skris * The licence and distribution terms for any publically available version or 5455714Skris * derivative of this code cannot be changed. i.e. this code cannot simply be 5555714Skris * copied and put under another distribution licence 5655714Skris * [including the GNU Public Licence.] 5755714Skris */ 5855714Skris 5955714Skris/* From "Message Authentication" R.R. Jueneman, S.M. Matyas, C.H. Meyer 6055714Skris * IEEE Communications Magazine Sept 1985 Vol. 23 No. 9 p 29-40 6155714Skris * This module in only based on the code in this paper and is 6255714Skris * almost definitely not the same as the MIT implementation. 6355714Skris */ 6455714Skris#include "des_locl.h" 6555714Skris 6655714Skris/* bug fix for dos - 7/6/91 - Larry hughes@logos.ucs.indiana.edu */ 6755714Skris#define Q_B0(a) (((DES_LONG)(a))) 6855714Skris#define Q_B1(a) (((DES_LONG)(a))<<8) 6955714Skris#define Q_B2(a) (((DES_LONG)(a))<<16) 7055714Skris#define Q_B3(a) (((DES_LONG)(a))<<24) 7155714Skris 7255714Skris/* used to scramble things a bit */ 7355714Skris/* Got the value MIT uses via brute force :-) 2/10/90 eay */ 7455714Skris#define NOISE ((DES_LONG)83653421L) 7555714Skris 76109998SmarkmDES_LONG DES_quad_cksum(const unsigned char *input, DES_cblock output[], 77109998Smarkm long length, int out_count, DES_cblock *seed) 7855714Skris { 7955714Skris DES_LONG z0,z1,t0,t1; 8055714Skris int i; 8155714Skris long l; 8255714Skris const unsigned char *cp; 8359191Skris#ifdef _CRAY 8468651Skris struct lp_st { int a:32; int b:32; } *lp; 8559191Skris#else 8659191Skris DES_LONG *lp; 8759191Skris#endif 8855714Skris 8955714Skris if (out_count < 1) out_count=1; 9068651Skris#ifdef _CRAY 9168651Skris lp = (struct lp_st *) &(output[0])[0]; 9268651Skris#else 9359191Skris lp = (DES_LONG *) &(output[0])[0]; 9468651Skris#endif 9555714Skris 9655714Skris z0=Q_B0((*seed)[0])|Q_B1((*seed)[1])|Q_B2((*seed)[2])|Q_B3((*seed)[3]); 9755714Skris z1=Q_B0((*seed)[4])|Q_B1((*seed)[5])|Q_B2((*seed)[6])|Q_B3((*seed)[7]); 9855714Skris 9955714Skris for (i=0; ((i<4)&&(i<out_count)); i++) 10055714Skris { 10155714Skris cp=input; 10255714Skris l=length; 10355714Skris while (l > 0) 10455714Skris { 10555714Skris if (l > 1) 10655714Skris { 10755714Skris t0= (DES_LONG)(*(cp++)); 10855714Skris t0|=(DES_LONG)Q_B1(*(cp++)); 10955714Skris l--; 11055714Skris } 11155714Skris else 11255714Skris t0= (DES_LONG)(*(cp++)); 11355714Skris l--; 11455714Skris /* add */ 11555714Skris t0+=z0; 11655714Skris t0&=0xffffffffL; 11755714Skris t1=z1; 11855714Skris /* square, well sort of square */ 11955714Skris z0=((((t0*t0)&0xffffffffL)+((t1*t1)&0xffffffffL)) 12055714Skris &0xffffffffL)%0x7fffffffL; 12155714Skris z1=((t0*((t1+NOISE)&0xffffffffL))&0xffffffffL)%0x7fffffffL; 12255714Skris } 12355714Skris if (lp != NULL) 12455714Skris { 12559191Skris /* The MIT library assumes that the checksum is 12659191Skris * composed of 2*out_count 32 bit ints */ 12768651Skris#ifdef _CRAY 12868651Skris (*lp).a = z0; 12968651Skris (*lp).b = z1; 13068651Skris lp++; 13168651Skris#else 13259191Skris *lp++ = z0; 13359191Skris *lp++ = z1; 13468651Skris#endif 13555714Skris } 13655714Skris } 13755714Skris return(z0); 13855714Skris } 13955714Skris 140