xref: /plan9/sys/src/cmd/unix/drawterm/libsec/md5block.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include "os.h"
2*8ccd4a63SDavid du Colombier #include <libsec.h>
39b943567SDavid du Colombier 
49b943567SDavid du Colombier /*
59b943567SDavid du Colombier  *  rfc1321 requires that I include this.  The code is new.  The constants
69b943567SDavid du Colombier  *  all come from the rfc (hence the copyright).  We trade a table for the
79b943567SDavid du Colombier  *  macros in rfc.  The total size is a lot less. -- presotto
89b943567SDavid du Colombier  *
99b943567SDavid du Colombier  *	Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
109b943567SDavid du Colombier  *	rights reserved.
119b943567SDavid du Colombier  *
129b943567SDavid du Colombier  *	License to copy and use this software is granted provided that it
139b943567SDavid du Colombier  *	is identified as the "RSA Data Security, Inc. MD5 Message-Digest
149b943567SDavid du Colombier  *	Algorithm" in all material mentioning or referencing this software
159b943567SDavid du Colombier  *	or this function.
169b943567SDavid du Colombier  *
179b943567SDavid du Colombier  *	License is also granted to make and use derivative works provided
189b943567SDavid du Colombier  *	that such works are identified as "derived from the RSA Data
199b943567SDavid du Colombier  *	Security, Inc. MD5 Message-Digest Algorithm" in all material
209b943567SDavid du Colombier  *	mentioning or referencing the derived work.
219b943567SDavid du Colombier  *
229b943567SDavid du Colombier  *	RSA Data Security, Inc. makes no representations concerning either
239b943567SDavid du Colombier  *	the merchantability of this software or the suitability of this
249b943567SDavid du Colombier  *	software forany particular purpose. It is provided "as is"
259b943567SDavid du Colombier  *	without express or implied warranty of any kind.
269b943567SDavid du Colombier  *	These notices must be retained in any copies of any part of this
279b943567SDavid du Colombier  *	documentation and/or software.
289b943567SDavid du Colombier  */
299b943567SDavid du Colombier 
309b943567SDavid du Colombier /*
319b943567SDavid du Colombier  *	Rotate ammounts used in the algorithm
329b943567SDavid du Colombier  */
339b943567SDavid du Colombier enum
349b943567SDavid du Colombier {
359b943567SDavid du Colombier 	S11=	7,
369b943567SDavid du Colombier 	S12=	12,
379b943567SDavid du Colombier 	S13=	17,
389b943567SDavid du Colombier 	S14=	22,
399b943567SDavid du Colombier 
409b943567SDavid du Colombier 	S21=	5,
419b943567SDavid du Colombier 	S22=	9,
429b943567SDavid du Colombier 	S23=	14,
439b943567SDavid du Colombier 	S24=	20,
449b943567SDavid du Colombier 
459b943567SDavid du Colombier 	S31=	4,
469b943567SDavid du Colombier 	S32=	11,
479b943567SDavid du Colombier 	S33=	16,
489b943567SDavid du Colombier 	S34=	23,
499b943567SDavid du Colombier 
509b943567SDavid du Colombier 	S41=	6,
519b943567SDavid du Colombier 	S42=	10,
529b943567SDavid du Colombier 	S43=	15,
539b943567SDavid du Colombier 	S44=	21,
549b943567SDavid du Colombier };
559b943567SDavid du Colombier 
569b943567SDavid du Colombier static u32int md5tab[] =
579b943567SDavid du Colombier {
589b943567SDavid du Colombier 	/* round 1 */
599b943567SDavid du Colombier /*[0]*/	0xd76aa478,
609b943567SDavid du Colombier 	0xe8c7b756,
619b943567SDavid du Colombier 	0x242070db,
629b943567SDavid du Colombier 	0xc1bdceee,
639b943567SDavid du Colombier 	0xf57c0faf,
649b943567SDavid du Colombier 	0x4787c62a,
659b943567SDavid du Colombier 	0xa8304613,
669b943567SDavid du Colombier 	0xfd469501,
679b943567SDavid du Colombier 	0x698098d8,
689b943567SDavid du Colombier 	0x8b44f7af,
699b943567SDavid du Colombier 	0xffff5bb1,
709b943567SDavid du Colombier 	0x895cd7be,
719b943567SDavid du Colombier 	0x6b901122,
729b943567SDavid du Colombier 	0xfd987193,
739b943567SDavid du Colombier 	0xa679438e,
749b943567SDavid du Colombier 	0x49b40821,
759b943567SDavid du Colombier 
769b943567SDavid du Colombier 	/* round 2 */
779b943567SDavid du Colombier /*[16]*/0xf61e2562,
789b943567SDavid du Colombier 	0xc040b340,
799b943567SDavid du Colombier 	0x265e5a51,
809b943567SDavid du Colombier 	0xe9b6c7aa,
819b943567SDavid du Colombier 	0xd62f105d,
829b943567SDavid du Colombier 	 0x2441453,
839b943567SDavid du Colombier 	0xd8a1e681,
849b943567SDavid du Colombier 	0xe7d3fbc8,
859b943567SDavid du Colombier 	0x21e1cde6,
869b943567SDavid du Colombier 	0xc33707d6,
879b943567SDavid du Colombier 	0xf4d50d87,
889b943567SDavid du Colombier 	0x455a14ed,
899b943567SDavid du Colombier 	0xa9e3e905,
909b943567SDavid du Colombier 	0xfcefa3f8,
919b943567SDavid du Colombier 	0x676f02d9,
929b943567SDavid du Colombier 	0x8d2a4c8a,
939b943567SDavid du Colombier 
949b943567SDavid du Colombier 	/* round 3 */
959b943567SDavid du Colombier /*[32]*/0xfffa3942,
969b943567SDavid du Colombier 	0x8771f681,
979b943567SDavid du Colombier 	0x6d9d6122,
989b943567SDavid du Colombier 	0xfde5380c,
999b943567SDavid du Colombier 	0xa4beea44,
1009b943567SDavid du Colombier 	0x4bdecfa9,
1019b943567SDavid du Colombier 	0xf6bb4b60,
1029b943567SDavid du Colombier 	0xbebfbc70,
1039b943567SDavid du Colombier 	0x289b7ec6,
1049b943567SDavid du Colombier 	0xeaa127fa,
1059b943567SDavid du Colombier 	0xd4ef3085,
1069b943567SDavid du Colombier 	 0x4881d05,
1079b943567SDavid du Colombier 	0xd9d4d039,
1089b943567SDavid du Colombier 	0xe6db99e5,
1099b943567SDavid du Colombier 	0x1fa27cf8,
1109b943567SDavid du Colombier 	0xc4ac5665,
1119b943567SDavid du Colombier 
1129b943567SDavid du Colombier 	/* round 4 */
1139b943567SDavid du Colombier /*[48]*/0xf4292244,
1149b943567SDavid du Colombier 	0x432aff97,
1159b943567SDavid du Colombier 	0xab9423a7,
1169b943567SDavid du Colombier 	0xfc93a039,
1179b943567SDavid du Colombier 	0x655b59c3,
1189b943567SDavid du Colombier 	0x8f0ccc92,
1199b943567SDavid du Colombier 	0xffeff47d,
1209b943567SDavid du Colombier 	0x85845dd1,
1219b943567SDavid du Colombier 	0x6fa87e4f,
1229b943567SDavid du Colombier 	0xfe2ce6e0,
1239b943567SDavid du Colombier 	0xa3014314,
1249b943567SDavid du Colombier 	0x4e0811a1,
1259b943567SDavid du Colombier 	0xf7537e82,
1269b943567SDavid du Colombier 	0xbd3af235,
1279b943567SDavid du Colombier 	0x2ad7d2bb,
1289b943567SDavid du Colombier 	0xeb86d391,
1299b943567SDavid du Colombier };
1309b943567SDavid du Colombier 
1319b943567SDavid du Colombier static void decode(u32int*, uchar*, ulong);
1329b943567SDavid du Colombier extern void _md5block(uchar *p, ulong len, u32int *s);
1339b943567SDavid du Colombier 
1349b943567SDavid du Colombier void
_md5block(uchar * p,ulong len,u32int * s)1359b943567SDavid du Colombier _md5block(uchar *p, ulong len, u32int *s)
1369b943567SDavid du Colombier {
1379b943567SDavid du Colombier 	u32int a, b, c, d, sh;
1389b943567SDavid du Colombier 	u32int *t;
1399b943567SDavid du Colombier 	uchar *end;
1409b943567SDavid du Colombier 	u32int x[16];
1419b943567SDavid du Colombier 
1429b943567SDavid du Colombier 	for(end = p+len; p < end; p += 64){
1439b943567SDavid du Colombier 		a = s[0];
1449b943567SDavid du Colombier 		b = s[1];
1459b943567SDavid du Colombier 		c = s[2];
1469b943567SDavid du Colombier 		d = s[3];
1479b943567SDavid du Colombier 
1489b943567SDavid du Colombier 		decode(x, p, 64);
1499b943567SDavid du Colombier 
1509b943567SDavid du Colombier 		t = md5tab;
1519b943567SDavid du Colombier 		sh = 0;
1529b943567SDavid du Colombier 		for(; sh != 16; t += 4){
1539b943567SDavid du Colombier 			a += ((c ^ d) & b) ^ d;
1549b943567SDavid du Colombier 			a += x[sh] + t[0];
1559b943567SDavid du Colombier 			a = (a << S11) | (a >> (32 - S11));
1569b943567SDavid du Colombier 			a += b;
1579b943567SDavid du Colombier 
1589b943567SDavid du Colombier 			d += ((b ^ c) & a) ^ c;
1599b943567SDavid du Colombier 			d += x[sh + 1] + t[1];
1609b943567SDavid du Colombier 			d = (d << S12) | (d >> (32 - S12));
1619b943567SDavid du Colombier 			d += a;
1629b943567SDavid du Colombier 
1639b943567SDavid du Colombier 			c += ((a ^ b) & d) ^ b;
1649b943567SDavid du Colombier 			c += x[sh + 2] + t[2];
1659b943567SDavid du Colombier 			c = (c << S13) | (c >> (32 - S13));
1669b943567SDavid du Colombier 			c += d;
1679b943567SDavid du Colombier 
1689b943567SDavid du Colombier 			b += ((d ^ a) & c) ^ a;
1699b943567SDavid du Colombier 			b += x[sh + 3] + t[3];
1709b943567SDavid du Colombier 			b = (b << S14) | (b >> (32 - S14));
1719b943567SDavid du Colombier 			b += c;
1729b943567SDavid du Colombier 
1739b943567SDavid du Colombier 			sh += 4;
1749b943567SDavid du Colombier 		}
1759b943567SDavid du Colombier 		sh = 1;
1769b943567SDavid du Colombier 		for(; sh != 1+20*4; t += 4){
1779b943567SDavid du Colombier 			a += ((b ^ c) & d) ^ c;
1789b943567SDavid du Colombier 			a += x[sh & 0xf] + t[0];
1799b943567SDavid du Colombier 			a = (a << S21) | (a >> (32 - S21));
1809b943567SDavid du Colombier 			a += b;
1819b943567SDavid du Colombier 
1829b943567SDavid du Colombier 			d += ((a ^ b) & c) ^ b;
1839b943567SDavid du Colombier 			d += x[(sh + 5) & 0xf] + t[1];
1849b943567SDavid du Colombier 			d = (d << S22) | (d >> (32 - S22));
1859b943567SDavid du Colombier 			d += a;
1869b943567SDavid du Colombier 
1879b943567SDavid du Colombier 			c += ((d ^ a) & b) ^ a;
1889b943567SDavid du Colombier 			c += x[(sh + 10) & 0xf] + t[2];
1899b943567SDavid du Colombier 			c = (c << S23) | (c >> (32 - S23));
1909b943567SDavid du Colombier 			c += d;
1919b943567SDavid du Colombier 
1929b943567SDavid du Colombier 			b += ((c ^ d) & a) ^ d;
1939b943567SDavid du Colombier 			b += x[(sh + 15) & 0xf] + t[3];
1949b943567SDavid du Colombier 			b = (b << S24) | (b >> (32 - S24));
1959b943567SDavid du Colombier 			b += c;
1969b943567SDavid du Colombier 
1979b943567SDavid du Colombier 			sh += 20;
1989b943567SDavid du Colombier 		}
1999b943567SDavid du Colombier 		sh = 5;
2009b943567SDavid du Colombier 		for(; sh != 5+12*4; t += 4){
2019b943567SDavid du Colombier 			a += b ^ c ^ d;
2029b943567SDavid du Colombier 			a += x[sh & 0xf] + t[0];
2039b943567SDavid du Colombier 			a = (a << S31) | (a >> (32 - S31));
2049b943567SDavid du Colombier 			a += b;
2059b943567SDavid du Colombier 
2069b943567SDavid du Colombier 			d += a ^ b ^ c;
2079b943567SDavid du Colombier 			d += x[(sh + 3) & 0xf] + t[1];
2089b943567SDavid du Colombier 			d = (d << S32) | (d >> (32 - S32));
2099b943567SDavid du Colombier 			d += a;
2109b943567SDavid du Colombier 
2119b943567SDavid du Colombier 			c += d ^ a ^ b;
2129b943567SDavid du Colombier 			c += x[(sh + 6) & 0xf] + t[2];
2139b943567SDavid du Colombier 			c = (c << S33) | (c >> (32 - S33));
2149b943567SDavid du Colombier 			c += d;
2159b943567SDavid du Colombier 
2169b943567SDavid du Colombier 			b += c ^ d ^ a;
2179b943567SDavid du Colombier 			b += x[(sh + 9) & 0xf] + t[3];
2189b943567SDavid du Colombier 			b = (b << S34) | (b >> (32 - S34));
2199b943567SDavid du Colombier 			b += c;
2209b943567SDavid du Colombier 
2219b943567SDavid du Colombier 			sh += 12;
2229b943567SDavid du Colombier 		}
2239b943567SDavid du Colombier 		sh = 0;
2249b943567SDavid du Colombier 		for(; sh != 28*4; t += 4){
2259b943567SDavid du Colombier 			a += c ^ (b | ~d);
2269b943567SDavid du Colombier 			a += x[sh & 0xf] + t[0];
2279b943567SDavid du Colombier 			a = (a << S41) | (a >> (32 - S41));
2289b943567SDavid du Colombier 			a += b;
2299b943567SDavid du Colombier 
2309b943567SDavid du Colombier 			d += b ^ (a | ~c);
2319b943567SDavid du Colombier 			d += x[(sh + 7) & 0xf] + t[1];
2329b943567SDavid du Colombier 			d = (d << S42) | (d >> (32 - S42));
2339b943567SDavid du Colombier 			d += a;
2349b943567SDavid du Colombier 
2359b943567SDavid du Colombier 			c += a ^ (d | ~b);
2369b943567SDavid du Colombier 			c += x[(sh + 14) & 0xf] + t[2];
2379b943567SDavid du Colombier 			c = (c << S43) | (c >> (32 - S43));
2389b943567SDavid du Colombier 			c += d;
2399b943567SDavid du Colombier 
2409b943567SDavid du Colombier 			b += d ^ (c | ~a);
2419b943567SDavid du Colombier 			b += x[(sh + 21) & 0xf] + t[3];
2429b943567SDavid du Colombier 			b = (b << S44) | (b >> (32 - S44));
2439b943567SDavid du Colombier 			b += c;
2449b943567SDavid du Colombier 
2459b943567SDavid du Colombier 			sh += 28;
2469b943567SDavid du Colombier 		}
2479b943567SDavid du Colombier 
2489b943567SDavid du Colombier 		s[0] += a;
2499b943567SDavid du Colombier 		s[1] += b;
2509b943567SDavid du Colombier 		s[2] += c;
2519b943567SDavid du Colombier 		s[3] += d;
2529b943567SDavid du Colombier 	}
2539b943567SDavid du Colombier }
2549b943567SDavid du Colombier 
2559b943567SDavid du Colombier /*
2569b943567SDavid du Colombier  *	decodes input (uchar) into output (u32int). Assumes len is
2579b943567SDavid du Colombier  *	a multiple of 4.
2589b943567SDavid du Colombier  */
2599b943567SDavid du Colombier static void
decode(u32int * output,uchar * input,ulong len)2609b943567SDavid du Colombier decode(u32int *output, uchar *input, ulong len)
2619b943567SDavid du Colombier {
2629b943567SDavid du Colombier 	uchar *e;
2639b943567SDavid du Colombier 
2649b943567SDavid du Colombier 	for(e = input+len; input < e; input += 4)
2659b943567SDavid du Colombier 		*output++ = input[0] | (input[1] << 8) |
2669b943567SDavid du Colombier 			(input[2] << 16) | (input[3] << 24);
2679b943567SDavid du Colombier }
268