md4_dgst.c revision 392aa7cc7d2b122614c5393c3e357da07fd07af3
19c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar/* crypto/md4/md4_dgst.c */
29c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
39c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * All rights reserved.
49c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar *
59c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * This package is an SSL implementation written
69c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * by Eric Young (eay@cryptsoft.com).
79c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * The implementation was written so as to conform with Netscapes SSL.
89c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar *
99c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * This library is free for commercial and non-commercial use as long as
109c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * the following conditions are aheared to.  The following conditions
119c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * apply to all code found in this distribution, be it the RC4, RSA,
129c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
139c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * included with this distribution is covered by the same copyright terms
1440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar *
169c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * Copyright remains Eric Young's, and as such any Copyright notices in
17182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger * the code are not to be removed.
189c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * If this package is used in a product, Eric Young should be given attribution
199c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * as the author of the parts of the library used.
209c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * This can be in the form of a textual message at program startup or
21260611a32535c851237926bfcf78869b13c07d5bJohn McCall * in documentation (online or textual) provided with the package.
22260611a32535c851237926bfcf78869b13c07d5bJohn McCall *
239c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * Redistribution and use in source and binary forms, with or without
24df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor * modification, are permitted provided that the following conditions
25df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor * are met:
2602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar * 1. Redistributions of source code must retain the copyright
27f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar *    notice, this list of conditions and the following disclaimer.
2802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar * 2. Redistributions in binary form must reproduce the above copyright
2902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar *    notice, this list of conditions and the following disclaimer in the
30985b825eea7387be10478de0430815ed6a673326Daniel Dunbar *    documentation and/or other materials provided with the distribution.
319c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar * 3. All advertising materials mentioning features or use of this software
3220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar *    must display the following acknowledgement:
3392dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands *    "This product includes cryptographic software written by
3466b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson *     Eric Young (eay@cryptsoft.com)"
3566b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson *    The word 'cryptographic' can be left out if the rouines from the library
3666b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson *    being used are not cryptographic related :-).
3766b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson * 4. If you include any Windows specific code (or a derivative thereof) from
3866b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson *    the apps directory (application code) you must include an acknowledgement:
3966b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
4066b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson *
4154db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbourne * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
4254db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbourne * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel * SUCH DAMAGE.
529284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes *
536acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar * The licence and distribution terms for any publically available version or
549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum * derivative of this code cannot be changed.  i.e. this code cannot simply be
556acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar * copied and put under another distribution licence
56260611a32535c851237926bfcf78869b13c07d5bJohn McCall * [including the GNU Public Licence.]
57260611a32535c851237926bfcf78869b13c07d5bJohn McCall */
58260611a32535c851237926bfcf78869b13c07d5bJohn McCall
59260611a32535c851237926bfcf78869b13c07d5bJohn McCall#include <stdio.h>
60260611a32535c851237926bfcf78869b13c07d5bJohn McCall#include <openssl/opensslv.h>
619c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar#include <openssl/crypto.h>
623038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar#include "md4_locl.h"
639c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
6460a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbarconst char MD4_version[]="MD4" OPENSSL_VERSION_PTEXT;
658767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
669c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar/* Implemented from RFC1186 The MD4 Message-Digest Algorithm
6747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar */
6847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
6920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar#define INIT_DATA_A (unsigned long)0x67452301L
7020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar#define INIT_DATA_B (unsigned long)0xefcdab89L
7120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar#define INIT_DATA_C (unsigned long)0x98badcfeL
7220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar#define INIT_DATA_D (unsigned long)0x10325476L
7320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
7420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbarfips_md_init(MD4)
7520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar	{
7620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar	memset (c,0,sizeof(*c));
77fc30829694e62040c14f329f5491724fe7476241Jim Grosbach	c->A=INIT_DATA_A;
7820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar	c->B=INIT_DATA_B;
793038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	c->C=INIT_DATA_C;
803038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	c->D=INIT_DATA_D;
8120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar	return 1;
8220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar	}
8320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
8420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar#ifndef md4_block_data_order
8520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar#ifdef X
8620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar#undef X
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#endif
881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid md4_block_data_order (MD4_CTX *c, const void *data_, size_t num)
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump	{
9047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar	const unsigned char *data=data_;
919c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	register unsigned MD32_REG_T A,B,C,D,l;
929c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar#ifndef MD32_XARRAY
9331b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar	/* See comment in crypto/sha/sha_locl.h for details. */
9431b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar	unsigned MD32_REG_T	XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7,
9592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands				XX8, XX9,XX10,XX11,XX12,XX13,XX14,XX15;
969c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar# define X(i)	XX##i
973038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar#else
983038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	MD4_LONG XX[MD4_LBLOCK];
9947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar# define X(i)	XX[i]
10047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar#endif
1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump	A=c->A;
1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump	B=c->B;
10447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar	C=c->C;
105b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar	D=c->D;
106b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
107b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar	for (;num--;)
10882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar		{
10982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar	HOST_c2l(data,l); X( 0)=l;		HOST_c2l(data,l); X( 1)=l;
1109c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	/* Round 0 */
1119c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R0(A,B,C,D,X( 0), 3,0);	HOST_c2l(data,l); X( 2)=l;
1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump	R0(D,A,B,C,X( 1), 7,0);	HOST_c2l(data,l); X( 3)=l;
11392dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands	R0(C,D,A,B,X( 2),11,0);	HOST_c2l(data,l); X( 4)=l;
1149c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R0(B,C,D,A,X( 3),19,0);	HOST_c2l(data,l); X( 5)=l;
1153038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	R0(A,B,C,D,X( 4), 3,0);	HOST_c2l(data,l); X( 6)=l;
1163038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	R0(D,A,B,C,X( 5), 7,0);	HOST_c2l(data,l); X( 7)=l;
117b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar	R0(C,D,A,B,X( 6),11,0);	HOST_c2l(data,l); X( 8)=l;
11860a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbar	R0(B,C,D,A,X( 7),19,0);	HOST_c2l(data,l); X( 9)=l;
119b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar	R0(A,B,C,D,X( 8), 3,0);	HOST_c2l(data,l); X(10)=l;
120b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar	R0(D,A,B,C,X( 9), 7,0);	HOST_c2l(data,l); X(11)=l;
12182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar	R0(C,D,A,B,X(10),11,0);	HOST_c2l(data,l); X(12)=l;
12282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar	R0(B,C,D,A,X(11),19,0);	HOST_c2l(data,l); X(13)=l;
123b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar	R0(A,B,C,D,X(12), 3,0);	HOST_c2l(data,l); X(14)=l;
124b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar	R0(D,A,B,C,X(13), 7,0);	HOST_c2l(data,l); X(15)=l;
12592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands	R0(C,D,A,B,X(14),11,0);
126b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar	R0(B,C,D,A,X(15),19,0);
1273038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	/* Round 1 */
1283038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	R1(A,B,C,D,X( 0), 3,0x5A827999L);
1299c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R1(D,A,B,C,X( 4), 5,0x5A827999L);
13060a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbar	R1(C,D,A,B,X( 8), 9,0x5A827999L);
1319c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R1(B,C,D,A,X(12),13,0x5A827999L);
13247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar	R1(A,B,C,D,X( 1), 3,0x5A827999L);
13382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar	R1(D,A,B,C,X( 5), 5,0x5A827999L);
13482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar	R1(C,D,A,B,X( 9), 9,0x5A827999L);
1359c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R1(B,C,D,A,X(13),13,0x5A827999L);
1369c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R1(A,B,C,D,X( 2), 3,0x5A827999L);
13792dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands	R1(D,A,B,C,X( 6), 5,0x5A827999L);
1389c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R1(C,D,A,B,X(10), 9,0x5A827999L);
1393038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	R1(B,C,D,A,X(14),13,0x5A827999L);
1403038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	R1(A,B,C,D,X( 3), 3,0x5A827999L);
1419c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R1(D,A,B,C,X( 7), 5,0x5A827999L);
14260a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbar	R1(C,D,A,B,X(11), 9,0x5A827999L);
1439c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R1(B,C,D,A,X(15),13,0x5A827999L);
14447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar	/* Round 2 */
14582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar	R2(A,B,C,D,X( 0), 3,0x6ED9EBA1L);
14682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar	R2(D,A,B,C,X( 8), 9,0x6ED9EBA1L);
1479c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R2(C,D,A,B,X( 4),11,0x6ED9EBA1L);
1489c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R2(B,C,D,A,X(12),15,0x6ED9EBA1L);
14992dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands	R2(A,B,C,D,X( 2), 3,0x6ED9EBA1L);
1509c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R2(D,A,B,C,X(10), 9,0x6ED9EBA1L);
1513038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	R2(C,D,A,B,X( 6),11,0x6ED9EBA1L);
1523038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	R2(B,C,D,A,X(14),15,0x6ED9EBA1L);
1539c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R2(A,B,C,D,X( 1), 3,0x6ED9EBA1L);
1549c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R2(D,A,B,C,X( 9), 9,0x6ED9EBA1L);
15547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar	R2(C,D,A,B,X( 5),11,0x6ED9EBA1L);
15682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar	R2(B,C,D,A,X(13),15,0x6ED9EBA1L);
15782b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar	R2(A,B,C,D,X( 3), 3,0x6ED9EBA1L);
1589c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R2(D,A,B,C,X(11), 9,0x6ED9EBA1L);
1599c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	R2(C,D,A,B,X( 7),11,0x6ED9EBA1L);
16092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands	R2(B,C,D,A,X(15),15,0x6ED9EBA1L);
1619c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1623038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	A = c->A += A;
1633038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar	B = c->B += B;
1649c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	C = c->C += C;
1659c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar	D = c->D += D;
1668ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier		}
16747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar	}
16882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar#endif
16982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar