Branch data Line data Source code
1 : : /* crypto/md5/md5_dgst.c */
2 : : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 : : * All rights reserved.
4 : : *
5 : : * This package is an SSL implementation written
6 : : * by Eric Young (eay@cryptsoft.com).
7 : : * The implementation was written so as to conform with Netscapes SSL.
8 : : *
9 : : * This library is free for commercial and non-commercial use as long as
10 : : * the following conditions are aheared to. The following conditions
11 : : * apply to all code found in this distribution, be it the RC4, RSA,
12 : : * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 : : * included with this distribution is covered by the same copyright terms
14 : : * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 : : *
16 : : * Copyright remains Eric Young's, and as such any Copyright notices in
17 : : * the code are not to be removed.
18 : : * If this package is used in a product, Eric Young should be given attribution
19 : : * as the author of the parts of the library used.
20 : : * This can be in the form of a textual message at program startup or
21 : : * in documentation (online or textual) provided with the package.
22 : : *
23 : : * Redistribution and use in source and binary forms, with or without
24 : : * modification, are permitted provided that the following conditions
25 : : * are met:
26 : : * 1. Redistributions of source code must retain the copyright
27 : : * notice, this list of conditions and the following disclaimer.
28 : : * 2. Redistributions in binary form must reproduce the above copyright
29 : : * notice, this list of conditions and the following disclaimer in the
30 : : * documentation and/or other materials provided with the distribution.
31 : : * 3. All advertising materials mentioning features or use of this software
32 : : * must display the following acknowledgement:
33 : : * "This product includes cryptographic software written by
34 : : * Eric Young (eay@cryptsoft.com)"
35 : : * The word 'cryptographic' can be left out if the rouines from the library
36 : : * being used are not cryptographic related :-).
37 : : * 4. If you include any Windows specific code (or a derivative thereof) from
38 : : * the apps directory (application code) you must include an acknowledgement:
39 : : * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 : : *
41 : : * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 : : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 : : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 : : * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 : : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 : : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 : : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 : : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 : : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 : : * SUCH DAMAGE.
52 : : *
53 : : * The licence and distribution terms for any publically available version or
54 : : * derivative of this code cannot be changed. i.e. this code cannot simply be
55 : : * copied and put under another distribution licence
56 : : * [including the GNU Public Licence.]
57 : : */
58 : :
59 : : #include <stdio.h>
60 : : #include "md5_locl.h"
61 : : #include <openssl/opensslv.h>
62 : :
63 : : const char MD5_version[]="MD5" OPENSSL_VERSION_PTEXT;
64 : :
65 : : /* Implemented from RFC1321 The MD5 Message-Digest Algorithm
66 : : */
67 : :
68 : : #define INIT_DATA_A (unsigned long)0x67452301L
69 : : #define INIT_DATA_B (unsigned long)0xefcdab89L
70 : : #define INIT_DATA_C (unsigned long)0x98badcfeL
71 : : #define INIT_DATA_D (unsigned long)0x10325476L
72 : :
73 : 23959 : int MD5_Init(MD5_CTX *c)
74 : : {
75 : : memset (c,0,sizeof(*c));
76 : 23959 : c->A=INIT_DATA_A;
77 : 23959 : c->B=INIT_DATA_B;
78 : 23959 : c->C=INIT_DATA_C;
79 : 23959 : c->D=INIT_DATA_D;
80 : 23959 : return 1;
81 : : }
82 : :
83 : : #ifndef md5_block_data_order
84 : : #ifdef X
85 : : #undef X
86 : : #endif
87 : : void md5_block_data_order (MD5_CTX *c, const void *data_, size_t num)
88 : : {
89 : : const unsigned char *data=data_;
90 : : register unsigned MD32_REG_T A,B,C,D,l;
91 : : #ifndef MD32_XARRAY
92 : : /* See comment in crypto/sha/sha_locl.h for details. */
93 : : unsigned MD32_REG_T XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7,
94 : : XX8, XX9,XX10,XX11,XX12,XX13,XX14,XX15;
95 : : # define X(i) XX##i
96 : : #else
97 : : MD5_LONG XX[MD5_LBLOCK];
98 : : # define X(i) XX[i]
99 : : #endif
100 : :
101 : : A=c->A;
102 : : B=c->B;
103 : : C=c->C;
104 : : D=c->D;
105 : :
106 : : for (;num--;)
107 : : {
108 : : HOST_c2l(data,l); X( 0)=l; HOST_c2l(data,l); X( 1)=l;
109 : : /* Round 0 */
110 : : R0(A,B,C,D,X( 0), 7,0xd76aa478L); HOST_c2l(data,l); X( 2)=l;
111 : : R0(D,A,B,C,X( 1),12,0xe8c7b756L); HOST_c2l(data,l); X( 3)=l;
112 : : R0(C,D,A,B,X( 2),17,0x242070dbL); HOST_c2l(data,l); X( 4)=l;
113 : : R0(B,C,D,A,X( 3),22,0xc1bdceeeL); HOST_c2l(data,l); X( 5)=l;
114 : : R0(A,B,C,D,X( 4), 7,0xf57c0fafL); HOST_c2l(data,l); X( 6)=l;
115 : : R0(D,A,B,C,X( 5),12,0x4787c62aL); HOST_c2l(data,l); X( 7)=l;
116 : : R0(C,D,A,B,X( 6),17,0xa8304613L); HOST_c2l(data,l); X( 8)=l;
117 : : R0(B,C,D,A,X( 7),22,0xfd469501L); HOST_c2l(data,l); X( 9)=l;
118 : : R0(A,B,C,D,X( 8), 7,0x698098d8L); HOST_c2l(data,l); X(10)=l;
119 : : R0(D,A,B,C,X( 9),12,0x8b44f7afL); HOST_c2l(data,l); X(11)=l;
120 : : R0(C,D,A,B,X(10),17,0xffff5bb1L); HOST_c2l(data,l); X(12)=l;
121 : : R0(B,C,D,A,X(11),22,0x895cd7beL); HOST_c2l(data,l); X(13)=l;
122 : : R0(A,B,C,D,X(12), 7,0x6b901122L); HOST_c2l(data,l); X(14)=l;
123 : : R0(D,A,B,C,X(13),12,0xfd987193L); HOST_c2l(data,l); X(15)=l;
124 : : R0(C,D,A,B,X(14),17,0xa679438eL);
125 : : R0(B,C,D,A,X(15),22,0x49b40821L);
126 : : /* Round 1 */
127 : : R1(A,B,C,D,X( 1), 5,0xf61e2562L);
128 : : R1(D,A,B,C,X( 6), 9,0xc040b340L);
129 : : R1(C,D,A,B,X(11),14,0x265e5a51L);
130 : : R1(B,C,D,A,X( 0),20,0xe9b6c7aaL);
131 : : R1(A,B,C,D,X( 5), 5,0xd62f105dL);
132 : : R1(D,A,B,C,X(10), 9,0x02441453L);
133 : : R1(C,D,A,B,X(15),14,0xd8a1e681L);
134 : : R1(B,C,D,A,X( 4),20,0xe7d3fbc8L);
135 : : R1(A,B,C,D,X( 9), 5,0x21e1cde6L);
136 : : R1(D,A,B,C,X(14), 9,0xc33707d6L);
137 : : R1(C,D,A,B,X( 3),14,0xf4d50d87L);
138 : : R1(B,C,D,A,X( 8),20,0x455a14edL);
139 : : R1(A,B,C,D,X(13), 5,0xa9e3e905L);
140 : : R1(D,A,B,C,X( 2), 9,0xfcefa3f8L);
141 : : R1(C,D,A,B,X( 7),14,0x676f02d9L);
142 : : R1(B,C,D,A,X(12),20,0x8d2a4c8aL);
143 : : /* Round 2 */
144 : : R2(A,B,C,D,X( 5), 4,0xfffa3942L);
145 : : R2(D,A,B,C,X( 8),11,0x8771f681L);
146 : : R2(C,D,A,B,X(11),16,0x6d9d6122L);
147 : : R2(B,C,D,A,X(14),23,0xfde5380cL);
148 : : R2(A,B,C,D,X( 1), 4,0xa4beea44L);
149 : : R2(D,A,B,C,X( 4),11,0x4bdecfa9L);
150 : : R2(C,D,A,B,X( 7),16,0xf6bb4b60L);
151 : : R2(B,C,D,A,X(10),23,0xbebfbc70L);
152 : : R2(A,B,C,D,X(13), 4,0x289b7ec6L);
153 : : R2(D,A,B,C,X( 0),11,0xeaa127faL);
154 : : R2(C,D,A,B,X( 3),16,0xd4ef3085L);
155 : : R2(B,C,D,A,X( 6),23,0x04881d05L);
156 : : R2(A,B,C,D,X( 9), 4,0xd9d4d039L);
157 : : R2(D,A,B,C,X(12),11,0xe6db99e5L);
158 : : R2(C,D,A,B,X(15),16,0x1fa27cf8L);
159 : : R2(B,C,D,A,X( 2),23,0xc4ac5665L);
160 : : /* Round 3 */
161 : : R3(A,B,C,D,X( 0), 6,0xf4292244L);
162 : : R3(D,A,B,C,X( 7),10,0x432aff97L);
163 : : R3(C,D,A,B,X(14),15,0xab9423a7L);
164 : : R3(B,C,D,A,X( 5),21,0xfc93a039L);
165 : : R3(A,B,C,D,X(12), 6,0x655b59c3L);
166 : : R3(D,A,B,C,X( 3),10,0x8f0ccc92L);
167 : : R3(C,D,A,B,X(10),15,0xffeff47dL);
168 : : R3(B,C,D,A,X( 1),21,0x85845dd1L);
169 : : R3(A,B,C,D,X( 8), 6,0x6fa87e4fL);
170 : : R3(D,A,B,C,X(15),10,0xfe2ce6e0L);
171 : : R3(C,D,A,B,X( 6),15,0xa3014314L);
172 : : R3(B,C,D,A,X(13),21,0x4e0811a1L);
173 : : R3(A,B,C,D,X( 4), 6,0xf7537e82L);
174 : : R3(D,A,B,C,X(11),10,0xbd3af235L);
175 : : R3(C,D,A,B,X( 2),15,0x2ad7d2bbL);
176 : : R3(B,C,D,A,X( 9),21,0xeb86d391L);
177 : :
178 : : A = c->A += A;
179 : : B = c->B += B;
180 : : C = c->C += C;
181 : : D = c->D += D;
182 : : }
183 : : }
184 : : #endif
|