0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65 /*.** This imple
0010: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 48 41 mentation of SHA
0020: 31 20 69 73 20 61 64 61 70 74 65 64 20 66 72 6f 1 is adapted fro
0030: 6d 20 74 68 65 20 65 78 61 6d 70 6c 65 20 69 6d m the example im
0040: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 plementation.**
0050: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 52 46 43 contained in RFC
0060: 2d 33 31 37 34 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 -3174..*/.#inclu
0070: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 69 de <stdint.h>.#i
0080: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 nclude <sys/type
0090: 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 63 s.h>.#include "c
00a0: 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64 onfig.h".#includ
00b0: 65 20 22 73 68 61 31 2e 68 22 0a 0a 2f 2a 0a 20 e "sha1.h"../*.
00c0: 2a 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 * If you do not
00d0: 68 61 76 65 20 74 68 65 20 49 53 4f 20 73 74 61 have the ISO sta
00e0: 6e 64 61 72 64 20 73 74 64 69 6e 74 2e 68 20 68 ndard stdint.h h
00f0: 65 61 64 65 72 20 66 69 6c 65 2c 20 74 68 65 6e eader file, then
0100: 20 79 6f 75 0a 20 2a 20 6d 75 73 74 20 74 79 70 you. * must typ
0110: 64 65 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e def the followin
0120: 67 3a 0a 20 2a 20 20 20 20 6e 61 6d 65 20 20 20 g:. * name
0130: 20 20 20 20 20 20 20 20 20 20 20 6d 65 61 6e 69 meani
0140: 6e 67 0a 20 2a 20 20 75 69 6e 74 33 32 5f 74 20 ng. * uint32_t
0150: 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 unsigned
0160: 20 33 32 20 62 69 74 20 69 6e 74 65 67 65 72 0a 32 bit integer.
0170: 20 2a 20 20 75 69 6e 74 38 5f 74 20 20 20 20 20 * uint8_t
0180: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 38 20 unsigned 8
0190: 62 69 74 20 69 6e 74 65 67 65 72 20 28 69 2e 65 bit integer (i.e
01a0: 2e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ., unsigned char
01b0: 29 0a 20 2a 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 ). *. */.#define
01c0: 20 53 48 41 31 48 61 73 68 53 69 7a 65 20 32 30 SHA1HashSize 20
01d0: 0a 23 64 65 66 69 6e 65 20 73 68 61 53 75 63 63 .#define shaSucc
01e0: 65 73 73 20 30 0a 23 64 65 66 69 6e 65 20 73 68 ess 0.#define sh
01f0: 61 49 6e 70 75 74 54 6f 6f 4c 6f 6e 67 20 31 0a aInputTooLong 1.
0200: 23 64 65 66 69 6e 65 20 73 68 61 53 74 61 74 65 #define shaState
0210: 45 72 72 6f 72 20 32 0a 0a 2f 2a 0a 20 2a 20 20 Error 2../*. *
0220: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 77 This structure w
0230: 69 6c 6c 20 68 6f 6c 64 20 63 6f 6e 74 65 78 74 ill hold context
0240: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 information for
0250: 20 74 68 65 20 53 48 41 2d 31 0a 20 2a 20 20 68 the SHA-1. * h
0260: 61 73 68 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e ashing operation
0270: 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 . */.typedef str
0280: 75 63 74 20 53 48 41 31 43 6f 6e 74 65 78 74 20 uct SHA1Context
0290: 53 48 41 31 43 6f 6e 74 65 78 74 3b 0a 73 74 72 SHA1Context;.str
02a0: 75 63 74 20 53 48 41 31 43 6f 6e 74 65 78 74 20 uct SHA1Context
02b0: 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 49 {. uint32_t I
02c0: 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61 73 68 ntermediate_Hash
02d0: 5b 53 48 41 31 48 61 73 68 53 69 7a 65 2f 34 5d [SHA1HashSize/4]
02e0: 3b 20 2f 2a 20 4d 65 73 73 61 67 65 20 44 69 67 ; /* Message Dig
02f0: 65 73 74 20 20 2a 2f 0a 0a 20 20 20 20 75 69 6e est */.. uin
0300: 74 33 32 5f 74 20 4c 65 6e 67 74 68 5f 4c 6f 77 t32_t Length_Low
0310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
0320: 4d 65 73 73 61 67 65 20 6c 65 6e 67 74 68 20 69 Message length i
0330: 6e 20 62 69 74 73 20 20 20 20 20 20 2a 2f 0a 20 n bits */.
0340: 20 20 20 75 69 6e 74 33 32 5f 74 20 4c 65 6e 67 uint32_t Leng
0350: 74 68 5f 48 69 67 68 3b 20 20 20 20 20 20 20 20 th_High;
0360: 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 6c 65 /* Message le
0370: 6e 67 74 68 20 69 6e 20 62 69 74 73 20 20 20 20 ngth in bits
0380: 20 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 4d 65 */.. int Me
0390: 73 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 ssage_Block_Inde
03a0: 78 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e x; /* Index in
03b0: 74 6f 20 6d 65 73 73 61 67 65 20 62 6c 6f 63 6b to message block
03c0: 20 61 72 72 61 79 20 20 20 2a 2f 0a 20 20 20 20 array */.
03d0: 75 69 6e 74 38 5f 74 20 4d 65 73 73 61 67 65 5f uint8_t Message_
03e0: 42 6c 6f 63 6b 5b 36 34 5d 3b 20 20 20 20 20 20 Block[64];
03f0: 2f 2a 20 35 31 32 2d 62 69 74 20 6d 65 73 73 61 /* 512-bit messa
0400: 67 65 20 62 6c 6f 63 6b 73 20 20 20 20 20 20 2a ge blocks *
0410: 2f 0a 0a 20 20 20 20 69 6e 74 20 43 6f 6d 70 75 /.. int Compu
0420: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 ted;
0430: 20 20 20 2f 2a 20 49 73 20 74 68 65 20 64 69 67 /* Is the dig
0440: 65 73 74 20 63 6f 6d 70 75 74 65 64 3f 20 20 20 est computed?
0450: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 */. int
0460: 20 43 6f 72 72 75 70 74 65 64 3b 20 20 20 20 20 Corrupted;
0470: 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68 /* Is th
0480: 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 e message digest
0490: 20 63 6f 72 72 75 70 74 65 64 3f 20 2a 2f 0a 7d corrupted? */.}
04a0: 3b 0a 0a 2f 2a 0a 20 2a 20 20 73 68 61 31 2e 63 ;../*. * sha1.c
04b0: 0a 20 2a 0a 20 2a 20 20 44 65 73 63 72 69 70 74 . *. * Descript
04c0: 69 6f 6e 3a 0a 20 2a 20 20 20 20 20 20 54 68 69 ion:. * Thi
04d0: 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 s file implement
04e0: 73 20 74 68 65 20 53 65 63 75 72 65 20 48 61 73 s the Secure Has
04f0: 68 69 6e 67 20 41 6c 67 6f 72 69 74 68 6d 20 31 hing Algorithm 1
0500: 20 61 73 0a 20 2a 20 20 20 20 20 20 64 65 66 69 as. * defi
0510: 6e 65 64 20 69 6e 20 46 49 50 53 20 50 55 42 20 ned in FIPS PUB
0520: 31 38 30 2d 31 20 70 75 62 6c 69 73 68 65 64 20 180-1 published
0530: 41 70 72 69 6c 20 31 37 2c 20 31 39 39 35 2e 0a April 17, 1995..
0540: 20 2a 0a 20 2a 20 20 20 20 20 20 54 68 65 20 53 *. * The S
0550: 48 41 2d 31 2c 20 70 72 6f 64 75 63 65 73 20 61 HA-1, produces a
0560: 20 31 36 30 2d 62 69 74 20 6d 65 73 73 61 67 65 160-bit message
0570: 20 64 69 67 65 73 74 20 66 6f 72 20 61 20 67 69 digest for a gi
0580: 76 65 6e 0a 20 2a 20 20 20 20 20 20 64 61 74 61 ven. * data
0590: 20 73 74 72 65 61 6d 2e 20 20 49 74 20 73 68 6f stream. It sho
05a0: 75 6c 64 20 74 61 6b 65 20 61 62 6f 75 74 20 32 uld take about 2
05b0: 2a 2a 6e 20 73 74 65 70 73 20 74 6f 20 66 69 6e **n steps to fin
05c0: 64 20 61 0a 20 2a 20 20 20 20 20 20 6d 65 73 73 d a. * mess
05d0: 61 67 65 20 77 69 74 68 20 74 68 65 20 73 61 6d age with the sam
05e0: 65 20 64 69 67 65 73 74 20 61 73 20 61 20 67 69 e digest as a gi
05f0: 76 65 6e 20 6d 65 73 73 61 67 65 20 61 6e 64 0a ven message and.
0600: 20 2a 20 20 20 20 20 20 32 2a 2a 28 6e 2f 32 29 * 2**(n/2)
0610: 20 74 6f 20 66 69 6e 64 20 61 6e 79 20 74 77 6f to find any two
0620: 20 6d 65 73 73 61 67 65 73 20 77 69 74 68 20 74 messages with t
0630: 68 65 20 73 61 6d 65 20 64 69 67 65 73 74 2c 0a he same digest,.
0640: 20 2a 20 20 20 20 20 20 77 68 65 6e 20 6e 20 69 * when n i
0650: 73 20 74 68 65 20 64 69 67 65 73 74 20 73 69 7a s the digest siz
0660: 65 20 69 6e 20 62 69 74 73 2e 20 20 54 68 65 72 e in bits. Ther
0670: 65 66 6f 72 65 2c 20 74 68 69 73 0a 20 2a 20 20 efore, this. *
0680: 20 20 20 20 61 6c 67 6f 72 69 74 68 6d 20 63 61 algorithm ca
0690: 6e 20 73 65 72 76 65 20 61 73 20 61 20 6d 65 61 n serve as a mea
06a0: 6e 73 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 20 ns of providing
06b0: 61 0a 20 2a 20 20 20 20 20 20 22 66 69 6e 67 65 a. * "finge
06c0: 72 70 72 69 6e 74 22 20 66 6f 72 20 61 20 6d 65 rprint" for a me
06d0: 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 20 50 6f ssage.. *. * Po
06e0: 72 74 61 62 69 6c 69 74 79 20 49 73 73 75 65 73 rtability Issues
06f0: 3a 0a 20 2a 20 20 20 20 20 20 53 48 41 2d 31 20 :. * SHA-1
0700: 69 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 is defined in te
0710: 72 6d 73 20 6f 66 20 33 32 2d 62 69 74 20 22 77 rms of 32-bit "w
0720: 6f 72 64 73 22 2e 20 20 54 68 69 73 20 63 6f 64 ords". This cod
0730: 65 0a 20 2a 20 20 20 20 20 20 75 73 65 73 20 3c e. * uses <
0740: 73 74 64 69 6e 74 2e 68 3e 20 28 69 6e 63 6c 75 stdint.h> (inclu
0750: 64 65 64 20 76 69 61 20 22 73 68 61 31 2e 68 22 ded via "sha1.h"
0760: 20 74 6f 20 64 65 66 69 6e 65 20 33 32 20 61 6e to define 32 an
0770: 64 20 38 0a 20 2a 20 20 20 20 20 20 62 69 74 20 d 8. * bit
0780: 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 unsigned integer
0790: 20 74 79 70 65 73 2e 20 20 49 66 20 79 6f 75 72 types. If your
07a0: 20 43 20 63 6f 6d 70 69 6c 65 72 20 64 6f 65 73 C compiler does
07b0: 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 73 75 70 not. * sup
07c0: 70 6f 72 74 20 33 32 20 62 69 74 20 75 6e 73 69 port 32 bit unsi
07d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2c 20 74 gned integers, t
07e0: 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 74 0a his code is not.
07f0: 20 2a 20 20 20 20 20 20 61 70 70 72 6f 70 72 69 * appropri
0800: 61 74 65 2e 0a 20 2a 0a 20 2a 20 20 43 61 76 65 ate.. *. * Cave
0810: 61 74 73 3a 0a 20 2a 20 20 20 20 20 20 53 48 41 ats:. * SHA
0820: 2d 31 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 -1 is designed t
0830: 6f 20 77 6f 72 6b 20 77 69 74 68 20 6d 65 73 73 o work with mess
0840: 61 67 65 73 20 6c 65 73 73 20 74 68 61 6e 20 32 ages less than 2
0850: 5e 36 34 20 62 69 74 73 0a 20 2a 20 20 20 20 20 ^64 bits. *
0860: 20 6c 6f 6e 67 2e 20 20 41 6c 74 68 6f 75 67 68 long. Although
0870: 20 53 48 41 2d 31 20 61 6c 6c 6f 77 73 20 61 20 SHA-1 allows a
0880: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 74 message digest t
0890: 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 o be generated.
08a0: 2a 20 20 20 20 20 20 66 6f 72 20 6d 65 73 73 61 * for messa
08b0: 67 65 73 20 6f 66 20 61 6e 79 20 6e 75 6d 62 65 ges of any numbe
08c0: 72 20 6f 66 20 62 69 74 73 20 6c 65 73 73 20 74 r of bits less t
08d0: 68 61 6e 20 32 5e 36 34 2c 20 74 68 69 73 0a 20 han 2^64, this.
08e0: 2a 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 * implement
08f0: 61 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 ation only works
0900: 20 77 69 74 68 20 6d 65 73 73 61 67 65 73 20 77 with messages w
0910: 69 74 68 20 61 20 6c 65 6e 67 74 68 20 74 68 61 ith a length tha
0920: 74 20 69 73 0a 20 2a 20 20 20 20 20 20 61 20 6d t is. * a m
0930: 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 73 ultiple of the s
0940: 69 7a 65 20 6f 66 20 61 6e 20 38 2d 62 69 74 20 ize of an 8-bit
0950: 63 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a character.. *. *
0960: 2f 0a 0a 2f 2a 0a 20 2a 20 20 44 65 66 69 6e 65 /../*. * Define
0970: 20 74 68 65 20 53 48 41 31 20 63 69 72 63 75 6c the SHA1 circul
0980: 61 72 20 6c 65 66 74 20 73 68 69 66 74 20 6d 61 ar left shift ma
0990: 63 72 6f 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 cro. */.#define
09a0: 53 48 41 31 43 69 72 63 75 6c 61 72 53 68 69 66 SHA1CircularShif
09b0: 74 28 62 69 74 73 2c 77 6f 72 64 29 20 5c 0a 20 t(bits,word) \.
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
09d0: 28 28 77 6f 72 64 29 20 3c 3c 20 28 62 69 74 73 ((word) << (bits
09e0: 29 29 20 7c 20 28 28 77 6f 72 64 29 20 3e 3e 20 )) | ((word) >>
09f0: 28 33 32 2d 28 62 69 74 73 29 29 29 29 0a 0a 2f (32-(bits))))../
0a00: 2a 20 4c 6f 63 61 6c 20 46 75 6e 63 74 69 6f 6e * Local Function
0a10: 20 50 72 6f 74 6f 74 79 70 74 65 73 20 2a 2f 0a Prototyptes */.
0a20: 73 74 61 74 69 63 20 76 6f 69 64 20 53 48 41 31 static void SHA1
0a30: 50 61 64 4d 65 73 73 61 67 65 28 53 48 41 31 43 PadMessage(SHA1C
0a40: 6f 6e 74 65 78 74 20 2a 29 3b 0a 73 74 61 74 69 ontext *);.stati
0a50: 63 20 76 6f 69 64 20 53 48 41 31 50 72 6f 63 65 c void SHA1Proce
0a60: 73 73 4d 65 73 73 61 67 65 42 6c 6f 63 6b 28 53 ssMessageBlock(S
0a70: 48 41 31 43 6f 6e 74 65 78 74 20 2a 29 3b 0a 0a HA1Context *);..
0a80: 2f 2a 0a 20 2a 20 20 53 48 41 31 52 65 73 65 74 /*. * SHA1Reset
0a90: 0a 20 2a 0a 20 2a 20 20 44 65 73 63 72 69 70 74 . *. * Descript
0aa0: 69 6f 6e 3a 0a 20 2a 20 20 20 20 20 20 54 68 69 ion:. * Thi
0ab0: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 s function will
0ac0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 53 initialize the S
0ad0: 48 41 31 43 6f 6e 74 65 78 74 20 69 6e 20 70 72 HA1Context in pr
0ae0: 65 70 61 72 61 74 69 6f 6e 0a 20 2a 20 20 20 20 eparation. *
0af0: 20 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 for computing
0b00: 61 20 6e 65 77 20 53 48 41 31 20 6d 65 73 73 61 a new SHA1 messa
0b10: 67 65 20 64 69 67 65 73 74 2e 0a 20 2a 0a 20 2a ge digest.. *. *
0b20: 20 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 20 2a Parameters:. *
0b30: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 3a 20 5b context: [
0b40: 69 6e 2f 6f 75 74 5d 0a 20 2a 20 20 20 20 20 20 in/out]. *
0b50: 20 20 20 20 54 68 65 20 63 6f 6e 74 65 78 74 20 The context
0b60: 74 6f 20 72 65 73 65 74 2e 0a 20 2a 0a 20 2a 20 to reset.. *. *
0b70: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 20 20 20 20 Returns:. *
0b80: 20 20 73 68 61 20 45 72 72 6f 72 20 43 6f 64 65 sha Error Code
0b90: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 .. *. */.static
0ba0: 69 6e 74 20 53 48 41 31 52 65 73 65 74 28 53 48 int SHA1Reset(SH
0bb0: 41 31 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 A1Context *conte
0bc0: 78 74 29 0a 7b 0a 20 20 20 20 63 6f 6e 74 65 78 xt).{. contex
0bd0: 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f 77 20 20 20 t->Length_Low
0be0: 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 = 0;.
0bf0: 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4c 65 6e 67 context->Leng
0c00: 74 68 5f 48 69 67 68 20 20 20 20 20 20 20 20 20 th_High
0c10: 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 74 = 0;. cont
0c20: 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f ext->Message_Blo
0c30: 63 6b 5f 49 6e 64 65 78 20 20 20 20 3d 20 30 3b ck_Index = 0;
0c40: 0a 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 49 .. context->I
0c50: 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61 73 68 ntermediate_Hash
0c60: 5b 30 5d 20 20 20 3d 20 30 78 36 37 34 35 32 33 [0] = 0x674523
0c70: 30 31 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 01;. context-
0c80: 3e 49 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61 >Intermediate_Ha
0c90: 73 68 5b 31 5d 20 20 20 3d 20 30 78 45 46 43 44 sh[1] = 0xEFCD
0ca0: 41 42 38 39 3b 0a 20 20 20 20 63 6f 6e 74 65 78 AB89;. contex
0cb0: 74 2d 3e 49 6e 74 65 72 6d 65 64 69 61 74 65 5f t->Intermediate_
0cc0: 48 61 73 68 5b 32 5d 20 20 20 3d 20 30 78 39 38 Hash[2] = 0x98
0cd0: 42 41 44 43 46 45 3b 0a 20 20 20 20 63 6f 6e 74 BADCFE;. cont
0ce0: 65 78 74 2d 3e 49 6e 74 65 72 6d 65 64 69 61 74 ext->Intermediat
0cf0: 65 5f 48 61 73 68 5b 33 5d 20 20 20 3d 20 30 78 e_Hash[3] = 0x
0d00: 31 30 33 32 35 34 37 36 3b 0a 20 20 20 20 63 6f 10325476;. co
0d10: 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d 65 64 69 ntext->Intermedi
0d20: 61 74 65 5f 48 61 73 68 5b 34 5d 20 20 20 3d 20 ate_Hash[4] =
0d30: 30 78 43 33 44 32 45 31 46 30 3b 0a 0a 20 20 20 0xC3D2E1F0;..
0d40: 20 63 6f 6e 74 65 78 74 2d 3e 43 6f 6d 70 75 74 context->Comput
0d50: 65 64 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 6f ed = 0;. co
0d60: 6e 74 65 78 74 2d 3e 43 6f 72 72 75 70 74 65 64 ntext->Corrupted
0d70: 20 20 3d 20 30 3b 0a 0a 20 20 20 20 72 65 74 75 = 0;.. retu
0d80: 72 6e 20 73 68 61 53 75 63 63 65 73 73 3b 0a 7d rn shaSuccess;.}
0d90: 0a 0a 2f 2a 0a 20 2a 20 20 53 48 41 31 52 65 73 ../*. * SHA1Res
0da0: 75 6c 74 0a 20 2a 0a 20 2a 20 20 44 65 73 63 72 ult. *. * Descr
0db0: 69 70 74 69 6f 6e 3a 0a 20 2a 20 20 20 20 20 20 iption:. *
0dc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 This function wi
0dd0: 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 31 36 ll return the 16
0de0: 30 2d 62 69 74 20 6d 65 73 73 61 67 65 20 64 69 0-bit message di
0df0: 67 65 73 74 20 69 6e 74 6f 20 74 68 65 0a 20 2a gest into the. *
0e00: 20 20 20 20 20 20 4d 65 73 73 61 67 65 5f 44 69 Message_Di
0e10: 67 65 73 74 20 61 72 72 61 79 20 20 70 72 6f 76 gest array prov
0e20: 69 64 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c ided by the call
0e30: 65 72 2e 0a 20 2a 20 20 20 20 20 20 4e 4f 54 45 er.. * NOTE
0e40: 3a 20 54 68 65 20 66 69 72 73 74 20 6f 63 74 65 : The first octe
0e50: 74 20 6f 66 20 68 61 73 68 20 69 73 20 73 74 6f t of hash is sto
0e60: 72 65 64 20 69 6e 20 74 68 65 20 30 74 68 20 65 red in the 0th e
0e70: 6c 65 6d 65 6e 74 2c 0a 20 2a 20 20 20 20 20 20 lement,. *
0e80: 20 20 20 20 20 20 74 68 65 20 6c 61 73 74 20 6f the last o
0e90: 63 74 65 74 20 6f 66 20 68 61 73 68 20 69 6e 20 ctet of hash in
0ea0: 74 68 65 20 31 39 74 68 20 65 6c 65 6d 65 6e 74 the 19th element
0eb0: 2e 0a 20 2a 0a 20 2a 20 20 50 61 72 61 6d 65 74 .. *. * Paramet
0ec0: 65 72 73 3a 0a 20 2a 20 20 20 20 20 20 63 6f 6e ers:. * con
0ed0: 74 65 78 74 3a 20 5b 69 6e 2f 6f 75 74 5d 0a 20 text: [in/out].
0ee0: 2a 20 20 20 20 20 20 20 20 20 20 54 68 65 20 63 * The c
0ef0: 6f 6e 74 65 78 74 20 74 6f 20 75 73 65 20 74 6f ontext to use to
0f00: 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 53 calculate the S
0f10: 48 41 2d 31 20 68 61 73 68 2e 0a 20 2a 20 20 20 HA-1 hash.. *
0f20: 20 20 20 4d 65 73 73 61 67 65 5f 44 69 67 65 73 Message_Diges
0f30: 74 3a 20 5b 6f 75 74 5d 0a 20 2a 20 20 20 20 20 t: [out]. *
0f40: 20 20 20 20 20 57 68 65 72 65 20 74 68 65 20 64 Where the d
0f50: 69 67 65 73 74 20 69 73 20 72 65 74 75 72 6e 65 igest is returne
0f60: 64 2e 0a 20 2a 0a 20 2a 20 20 52 65 74 75 72 6e d.. *. * Return
0f70: 73 3a 0a 20 2a 20 20 20 20 20 20 73 68 61 20 45 s:. * sha E
0f80: 72 72 6f 72 20 43 6f 64 65 2e 0a 20 2a 0a 20 2a rror Code.. *. *
0f90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 48 41 /.static int SHA
0fa0: 31 52 65 73 75 6c 74 28 20 53 48 41 31 43 6f 6e 1Result( SHA1Con
0fb0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 text *context,.
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 u
0fd0: 69 6e 74 38 5f 74 20 4d 65 73 73 61 67 65 5f 44 int8_t Message_D
0fe0: 69 67 65 73 74 5b 53 48 41 31 48 61 73 68 53 69 igest[SHA1HashSi
0ff0: 7a 65 5d 29 0a 7b 0a 20 20 20 20 69 6e 74 20 69 ze]).{. int i
1000: 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f 6e 74 65 ;.. if (conte
1010: 78 74 2d 3e 43 6f 72 72 75 70 74 65 64 29 0a 20 xt->Corrupted).
1020: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 {. ret
1030: 75 72 6e 20 63 6f 6e 74 65 78 74 2d 3e 43 6f 72 urn context->Cor
1040: 72 75 70 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 rupted;. }..
1050: 20 20 20 69 66 20 28 21 63 6f 6e 74 65 78 74 2d if (!context-
1060: 3e 43 6f 6d 70 75 74 65 64 29 0a 20 20 20 20 7b >Computed). {
1070: 0a 20 20 20 20 20 20 20 20 53 48 41 31 50 61 64 . SHA1Pad
1080: 4d 65 73 73 61 67 65 28 63 6f 6e 74 65 78 74 29 Message(context)
1090: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d ;. for(i=
10a0: 30 3b 20 69 3c 36 34 3b 20 2b 2b 69 29 0a 20 20 0; i<64; ++i).
10b0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 {.
10c0: 20 20 20 20 2f 2a 20 6d 65 73 73 61 67 65 20 6d /* message m
10d0: 61 79 20 62 65 20 73 65 6e 73 69 74 69 76 65 2c ay be sensitive,
10e0: 20 63 6c 65 61 72 20 69 74 20 6f 75 74 20 2a 2f clear it out */
10f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e . con
1100: 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c text->Message_Bl
1110: 6f 63 6b 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 ock[i] = 0;.
1120: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6f }. co
1130: 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f ntext->Length_Lo
1140: 77 20 3d 20 30 3b 20 20 20 20 2f 2a 20 61 6e 64 w = 0; /* and
1150: 20 63 6c 65 61 72 20 6c 65 6e 67 74 68 20 2a 2f clear length */
1160: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 . context
1170: 2d 3e 4c 65 6e 67 74 68 5f 48 69 67 68 20 3d 20 ->Length_High =
1180: 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 0;. conte
1190: 78 74 2d 3e 43 6f 6d 70 75 74 65 64 20 3d 20 31 xt->Computed = 1
11a0: 3b 0a 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f ;.. }.. fo
11b0: 72 28 69 20 3d 20 30 3b 20 69 20 3c 20 53 48 41 r(i = 0; i < SHA
11c0: 31 48 61 73 68 53 69 7a 65 3b 20 2b 2b 69 29 0a 1HashSize; ++i).
11d0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 {. Me
11e0: 73 73 61 67 65 5f 44 69 67 65 73 74 5b 69 5d 20 ssage_Digest[i]
11f0: 3d 20 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 = context->Inter
1200: 6d 65 64 69 61 74 65 5f 48 61 73 68 5b 69 3e 3e mediate_Hash[i>>
1210: 32 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 2].
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3e >
1230: 3e 20 38 20 2a 20 28 20 33 20 2d 20 28 20 69 20 > 8 * ( 3 - ( i
1240: 26 20 30 78 30 33 20 29 20 29 3b 0a 20 20 20 20 & 0x03 ) );.
1250: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 73 68 }.. return sh
1260: 61 53 75 63 63 65 73 73 3b 0a 7d 0a 0a 2f 2a 0a aSuccess;.}../*.
1270: 20 2a 20 20 53 48 41 31 49 6e 70 75 74 0a 20 2a * SHA1Input. *
1280: 0a 20 2a 20 20 44 65 73 63 72 69 70 74 69 6f 6e . * Description
1290: 3a 0a 20 2a 20 20 20 20 20 20 54 68 69 73 20 66 :. * This f
12a0: 75 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20 unction accepts
12b0: 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 63 74 65 an array of octe
12c0: 74 73 20 61 73 20 74 68 65 20 6e 65 78 74 20 70 ts as the next p
12d0: 6f 72 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 6f ortion. * o
12e0: 66 20 74 68 65 20 6d 65 73 73 61 67 65 2e 0a 20 f the message..
12f0: 2a 0a 20 2a 20 20 50 61 72 61 6d 65 74 65 72 73 *. * Parameters
1300: 3a 0a 20 2a 20 20 20 20 20 20 63 6f 6e 74 65 78 :. * contex
1310: 74 3a 20 5b 69 6e 2f 6f 75 74 5d 0a 20 2a 20 20 t: [in/out]. *
1320: 20 20 20 20 20 20 20 20 54 68 65 20 53 48 41 20 The SHA
1330: 63 6f 6e 74 65 78 74 20 74 6f 20 75 70 64 61 74 context to updat
1340: 65 0a 20 2a 20 20 20 20 20 20 6d 65 73 73 61 67 e. * messag
1350: 65 5f 61 72 72 61 79 3a 20 5b 69 6e 5d 0a 20 2a e_array: [in]. *
1360: 20 20 20 20 20 20 20 20 20 20 41 6e 20 61 72 72 An arr
1370: 61 79 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 ay of characters
1380: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 representing th
1390: 65 20 6e 65 78 74 20 70 6f 72 74 69 6f 6e 20 6f e next portion o
13a0: 66 0a 20 2a 20 20 20 20 20 20 20 20 20 20 74 68 f. * th
13b0: 65 20 6d 65 73 73 61 67 65 2e 0a 20 2a 20 20 20 e message.. *
13c0: 20 20 20 6c 65 6e 67 74 68 3a 20 5b 69 6e 5d 0a length: [in].
13d0: 20 2a 20 20 20 20 20 20 20 20 20 20 54 68 65 20 * The
13e0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6d 65 length of the me
13f0: 73 73 61 67 65 20 69 6e 20 6d 65 73 73 61 67 65 ssage in message
1400: 5f 61 72 72 61 79 0a 20 2a 0a 20 2a 20 20 52 65 _array. *. * Re
1410: 74 75 72 6e 73 3a 0a 20 2a 20 20 20 20 20 20 73 turns:. * s
1420: 68 61 20 45 72 72 6f 72 20 43 6f 64 65 2e 0a 20 ha Error Code..
1430: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 0a 69 6e 74 *. */.static.int
1440: 20 53 48 41 31 49 6e 70 75 74 28 20 20 20 20 53 SHA1Input( S
1450: 48 41 31 43 6f 6e 74 65 78 74 20 20 20 20 2a 63 HA1Context *c
1460: 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 ontext,.
1470: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 const
1480: 75 69 6e 74 38 5f 74 20 20 2a 6d 65 73 73 61 67 uint8_t *messag
1490: 65 5f 61 72 72 61 79 2c 0a 20 20 20 20 20 20 20 e_array,.
14a0: 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 unsig
14b0: 6e 65 64 20 20 20 20 20 20 20 6c 65 6e 67 74 68 ned length
14c0: 29 0a 7b 0a 20 20 20 20 69 66 20 28 21 6c 65 6e ).{. if (!len
14d0: 67 74 68 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 gth). {.
14e0: 20 20 20 72 65 74 75 72 6e 20 73 68 61 53 75 63 return shaSuc
14f0: 63 65 73 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 cess;. }..
1500: 20 69 66 20 28 63 6f 6e 74 65 78 74 2d 3e 43 6f if (context->Co
1510: 6d 70 75 74 65 64 29 0a 20 20 20 20 7b 0a 20 20 mputed). {.
1520: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 43 context->C
1530: 6f 72 72 75 70 74 65 64 20 3d 20 73 68 61 53 74 orrupted = shaSt
1540: 61 74 65 45 72 72 6f 72 3b 0a 0a 20 20 20 20 20 ateError;..
1550: 20 20 20 72 65 74 75 72 6e 20 73 68 61 53 74 61 return shaSta
1560: 74 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a teError;. }..
1570: 20 20 20 20 69 66 20 28 63 6f 6e 74 65 78 74 2d if (context-
1580: 3e 43 6f 72 72 75 70 74 65 64 29 0a 20 20 20 20 >Corrupted).
1590: 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 {. retur
15a0: 6e 20 63 6f 6e 74 65 78 74 2d 3e 43 6f 72 72 75 n context->Corru
15b0: 70 74 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 pted;. }.
15c0: 77 68 69 6c 65 28 6c 65 6e 67 74 68 2d 2d 20 26 while(length-- &
15d0: 26 20 21 63 6f 6e 74 65 78 74 2d 3e 43 6f 72 72 & !context->Corr
15e0: 75 70 74 65 64 29 0a 20 20 20 20 7b 0a 20 20 20 upted). {.
15f0: 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67 context->Messag
1600: 65 5f 42 6c 6f 63 6b 5b 63 6f 6e 74 65 78 74 2d e_Block[context-
1610: 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 >Message_Block_I
1620: 6e 64 65 78 2b 2b 5d 20 3d 0a 20 20 20 20 20 20 ndex++] =.
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 2a (*
1640: 6d 65 73 73 61 67 65 5f 61 72 72 61 79 20 26 20 message_array &
1650: 30 78 46 46 29 3b 0a 0a 20 20 20 20 63 6f 6e 74 0xFF);.. cont
1660: 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f 77 20 ext->Length_Low
1670: 2b 3d 20 38 3b 0a 20 20 20 20 69 66 20 28 63 6f += 8;. if (co
1680: 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f ntext->Length_Lo
1690: 77 20 3d 3d 20 30 29 0a 20 20 20 20 7b 0a 20 20 w == 0). {.
16a0: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4c context->L
16b0: 65 6e 67 74 68 5f 48 69 67 68 2b 2b 3b 0a 20 20 ength_High++;.
16c0: 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74 65 78 if (contex
16d0: 74 2d 3e 4c 65 6e 67 74 68 5f 48 69 67 68 20 3d t->Length_High =
16e0: 3d 20 30 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 = 0). {.
16f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 /* Me
1700: 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 6f 6e ssage is too lon
1710: 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 g */.
1720: 20 63 6f 6e 74 65 78 74 2d 3e 43 6f 72 72 75 70 context->Corrup
1730: 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 ted = 1;.
1740: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 }. }.. if
1750: 20 28 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 (context->Messa
1760: 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 20 3d ge_Block_Index =
1770: 3d 20 36 34 29 0a 20 20 20 20 7b 0a 20 20 20 20 = 64). {.
1780: 20 20 20 20 53 48 41 31 50 72 6f 63 65 73 73 4d SHA1ProcessM
1790: 65 73 73 61 67 65 42 6c 6f 63 6b 28 63 6f 6e 74 essageBlock(cont
17a0: 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ext);. }..
17b0: 20 6d 65 73 73 61 67 65 5f 61 72 72 61 79 2b 2b message_array++
17c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
17d0: 75 72 6e 20 73 68 61 53 75 63 63 65 73 73 3b 0a urn shaSuccess;.
17e0: 7d 0a 0a 2f 2a 0a 20 2a 20 20 53 48 41 31 50 72 }../*. * SHA1Pr
17f0: 6f 63 65 73 73 4d 65 73 73 61 67 65 42 6c 6f 63 ocessMessageBloc
1800: 6b 0a 20 2a 0a 20 2a 20 20 44 65 73 63 72 69 70 k. *. * Descrip
1810: 74 69 6f 6e 3a 0a 20 2a 20 20 20 20 20 20 54 68 tion:. * Th
1820: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c is function will
1830: 20 70 72 6f 63 65 73 73 20 74 68 65 20 6e 65 78 process the nex
1840: 74 20 35 31 32 20 62 69 74 73 20 6f 66 20 74 68 t 512 bits of th
1850: 65 20 6d 65 73 73 61 67 65 0a 20 2a 20 20 20 20 e message. *
1860: 20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 stored in the
1870: 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 20 61 72 Message_Block ar
1880: 72 61 79 2e 0a 20 2a 0a 20 2a 20 20 50 61 72 61 ray.. *. * Para
1890: 6d 65 74 65 72 73 3a 0a 20 2a 20 20 20 20 20 20 meters:. *
18a0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 20 52 65 74 None.. *. * Ret
18b0: 75 72 6e 73 3a 0a 20 2a 20 20 20 20 20 20 4e 6f urns:. * No
18c0: 74 68 69 6e 67 2e 0a 20 2a 0a 20 2a 20 20 43 6f thing.. *. * Co
18d0: 6d 6d 65 6e 74 73 3a 0a 20 2a 20 20 20 20 20 20 mments:. *
18e0: 4d 61 6e 79 20 6f 66 20 74 68 65 20 76 61 72 69 Many of the vari
18f0: 61 62 6c 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 able names in th
1900: 69 73 20 63 6f 64 65 2c 20 65 73 70 65 63 69 61 is code, especia
1910: 6c 6c 79 20 74 68 65 0a 20 2a 20 20 20 20 20 20 lly the. *
1920: 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 single character
1930: 20 6e 61 6d 65 73 2c 20 77 65 72 65 20 75 73 65 names, were use
1940: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 d because those
1950: 77 65 72 65 20 74 68 65 0a 20 2a 20 20 20 20 20 were the. *
1960: 20 6e 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74 names used in t
1970: 68 65 20 70 75 62 6c 69 63 61 74 69 6f 6e 2e 0a he publication..
1980: 20 2a 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 *. *. */.static
1990: 20 76 6f 69 64 20 53 48 41 31 50 72 6f 63 65 73 void SHA1Proces
19a0: 73 4d 65 73 73 61 67 65 42 6c 6f 63 6b 28 53 48 sMessageBlock(SH
19b0: 41 31 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 A1Context *conte
19c0: 78 74 29 0a 7b 0a 20 20 20 20 63 6f 6e 73 74 20 xt).{. const
19d0: 75 69 6e 74 33 32 5f 74 20 4b 5b 5d 20 3d 20 20 uint32_t K[] =
19e0: 20 20 7b 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e { /* Con
19f0: 73 74 61 6e 74 73 20 64 65 66 69 6e 65 64 20 69 stants defined i
1a00: 6e 20 53 48 41 2d 31 20 20 20 2a 2f 0a 20 20 20 n SHA-1 */.
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a20: 20 20 20 20 20 20 20 20 20 30 78 35 41 38 32 37 0x5A827
1a30: 39 39 39 2c 0a 20 20 20 20 20 20 20 20 20 20 20 999,.
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a50: 20 30 78 36 45 44 39 45 42 41 31 2c 0a 20 20 20 0x6ED9EBA1,.
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a70: 20 20 20 20 20 20 20 20 20 30 78 38 46 31 42 42 0x8F1BB
1a80: 43 44 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 CDC,.
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1aa0: 20 30 78 43 41 36 32 43 31 44 36 0a 20 20 20 20 0xCA62C1D6.
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ac0: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 69 };. i
1ad0: 6e 74 20 20 20 20 20 20 20 20 20 20 20 74 3b 20 nt t;
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1af0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 /* Loop counter
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a *
1b10: 2f 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 20 /. uint32_t
1b20: 20 20 20 20 74 65 6d 70 3b 20 20 20 20 20 20 20 temp;
1b30: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 /* Tempor
1b40: 61 72 79 20 77 6f 72 64 20 76 61 6c 75 65 20 20 ary word value
1b50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 75 69 6e */. uin
1b60: 74 33 32 5f 74 20 20 20 20 20 20 57 5b 38 30 5d t32_t W[80]
1b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
1b80: 20 57 6f 72 64 20 73 65 71 75 65 6e 63 65 20 20 Word sequence
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a */.
1ba0: 20 20 20 20 75 69 6e 74 33 32 5f 74 20 20 20 20 uint32_t
1bb0: 20 20 41 2c 20 42 2c 20 43 2c 20 44 2c 20 45 3b A, B, C, D, E;
1bc0: 20 20 20 20 20 2f 2a 20 57 6f 72 64 20 62 75 66 /* Word buf
1bd0: 66 65 72 73 20 20 20 20 20 20 20 20 20 20 20 20 fers
1be0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 */.. /*.
1bf0: 20 20 20 20 2a 20 20 49 6e 69 74 69 61 6c 69 7a * Initializ
1c00: 65 20 74 68 65 20 66 69 72 73 74 20 31 36 20 77 e the first 16 w
1c10: 6f 72 64 73 20 69 6e 20 74 68 65 20 61 72 72 61 ords in the arra
1c20: 79 20 57 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 y W. */.
1c30: 66 6f 72 28 74 20 3d 20 30 3b 20 74 20 3c 20 31 for(t = 0; t < 1
1c40: 36 3b 20 74 2b 2b 29 0a 20 20 20 20 7b 0a 20 20 6; t++). {.
1c50: 20 20 20 20 20 20 57 5b 74 5d 20 3d 20 63 6f 6e W[t] = con
1c60: 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c text->Message_Bl
1c70: 6f 63 6b 5b 74 20 2a 20 34 5d 20 3c 3c 20 32 34 ock[t * 4] << 24
1c80: 3b 0a 20 20 20 20 20 20 20 20 57 5b 74 5d 20 7c ;. W[t] |
1c90: 3d 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 = context->Messa
1ca0: 67 65 5f 42 6c 6f 63 6b 5b 74 20 2a 20 34 20 2b ge_Block[t * 4 +
1cb0: 20 31 5d 20 3c 3c 20 31 36 3b 0a 20 20 20 20 20 1] << 16;.
1cc0: 20 20 20 57 5b 74 5d 20 7c 3d 20 63 6f 6e 74 65 W[t] |= conte
1cd0: 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 xt->Message_Bloc
1ce0: 6b 5b 74 20 2a 20 34 20 2b 20 32 5d 20 3c 3c 20 k[t * 4 + 2] <<
1cf0: 38 3b 0a 20 20 20 20 20 20 20 20 57 5b 74 5d 20 8;. W[t]
1d00: 7c 3d 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 |= context->Mess
1d10: 61 67 65 5f 42 6c 6f 63 6b 5b 74 20 2a 20 34 20 age_Block[t * 4
1d20: 2b 20 33 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 + 3];. }..
1d30: 20 66 6f 72 28 74 20 3d 20 31 36 3b 20 74 20 3c for(t = 16; t <
1d40: 20 38 30 3b 20 74 2b 2b 29 0a 20 20 20 20 7b 0a 80; t++). {.
1d50: 20 20 20 20 20 20 20 57 5b 74 5d 20 3d 20 53 48 W[t] = SH
1d60: 41 31 43 69 72 63 75 6c 61 72 53 68 69 66 74 28 A1CircularShift(
1d70: 31 2c 57 5b 74 2d 33 5d 20 5e 20 57 5b 74 2d 38 1,W[t-3] ^ W[t-8
1d80: 5d 20 5e 20 57 5b 74 2d 31 34 5d 20 5e 20 57 5b ] ^ W[t-14] ^ W[
1d90: 74 2d 31 36 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 t-16]);. }..
1da0: 20 20 20 41 20 3d 20 63 6f 6e 74 65 78 74 2d 3e A = context->
1db0: 49 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61 73 Intermediate_Has
1dc0: 68 5b 30 5d 3b 0a 20 20 20 20 42 20 3d 20 63 6f h[0];. B = co
1dd0: 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d 65 64 69 ntext->Intermedi
1de0: 61 74 65 5f 48 61 73 68 5b 31 5d 3b 0a 20 20 20 ate_Hash[1];.
1df0: 20 43 20 3d 20 63 6f 6e 74 65 78 74 2d 3e 49 6e C = context->In
1e00: 74 65 72 6d 65 64 69 61 74 65 5f 48 61 73 68 5b termediate_Hash[
1e10: 32 5d 3b 0a 20 20 20 20 44 20 3d 20 63 6f 6e 74 2];. D = cont
1e20: 65 78 74 2d 3e 49 6e 74 65 72 6d 65 64 69 61 74 ext->Intermediat
1e30: 65 5f 48 61 73 68 5b 33 5d 3b 0a 20 20 20 20 45 e_Hash[3];. E
1e40: 20 3d 20 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 = context->Inte
1e50: 72 6d 65 64 69 61 74 65 5f 48 61 73 68 5b 34 5d rmediate_Hash[4]
1e60: 3b 0a 0a 20 20 20 20 66 6f 72 28 74 20 3d 20 30 ;.. for(t = 0
1e70: 3b 20 74 20 3c 20 32 30 3b 20 74 2b 2b 29 0a 20 ; t < 20; t++).
1e80: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 74 65 6d {. tem
1e90: 70 20 3d 20 20 53 48 41 31 43 69 72 63 75 6c 61 p = SHA1Circula
1ea0: 72 53 68 69 66 74 28 35 2c 41 29 20 2b 0a 20 20 rShift(5,A) +.
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 ((
1ec0: 42 20 26 20 43 29 20 7c 20 28 28 7e 42 29 20 26 B & C) | ((~B) &
1ed0: 20 44 29 29 20 2b 20 45 20 2b 20 57 5b 74 5d 20 D)) + E + W[t]
1ee0: 2b 20 4b 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 + K[0];.
1ef0: 45 20 3d 20 44 3b 0a 20 20 20 20 20 20 20 20 44 E = D;. D
1f00: 20 3d 20 43 3b 0a 20 20 20 20 20 20 20 20 43 20 = C;. C
1f10: 3d 20 53 48 41 31 43 69 72 63 75 6c 61 72 53 68 = SHA1CircularSh
1f20: 69 66 74 28 33 30 2c 42 29 3b 0a 0a 20 20 20 20 ift(30,B);..
1f30: 20 20 20 20 42 20 3d 20 41 3b 0a 20 20 20 20 20 B = A;.
1f40: 20 20 20 41 20 3d 20 74 65 6d 70 3b 0a 20 20 20 A = temp;.
1f50: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 74 20 3d 20 }.. for(t =
1f60: 32 30 3b 20 74 20 3c 20 34 30 3b 20 74 2b 2b 29 20; t < 40; t++)
1f70: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 74 . {. t
1f80: 65 6d 70 20 3d 20 53 48 41 31 43 69 72 63 75 6c emp = SHA1Circul
1f90: 61 72 53 68 69 66 74 28 35 2c 41 29 20 2b 20 28 arShift(5,A) + (
1fa0: 42 20 5e 20 43 20 5e 20 44 29 20 2b 20 45 20 2b B ^ C ^ D) + E +
1fb0: 20 57 5b 74 5d 20 2b 20 4b 5b 31 5d 3b 0a 20 20 W[t] + K[1];.
1fc0: 20 20 20 20 20 20 45 20 3d 20 44 3b 0a 20 20 20 E = D;.
1fd0: 20 20 20 20 20 44 20 3d 20 43 3b 0a 20 20 20 20 D = C;.
1fe0: 20 20 20 20 43 20 3d 20 53 48 41 31 43 69 72 63 C = SHA1Circ
1ff0: 75 6c 61 72 53 68 69 66 74 28 33 30 2c 42 29 3b ularShift(30,B);
2000: 0a 20 20 20 20 20 20 20 20 42 20 3d 20 41 3b 0a . B = A;.
2010: 20 20 20 20 20 20 20 20 41 20 3d 20 74 65 6d 70 A = temp
2020: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 ;. }.. for
2030: 28 74 20 3d 20 34 30 3b 20 74 20 3c 20 36 30 3b (t = 40; t < 60;
2040: 20 74 2b 2b 29 0a 20 20 20 20 7b 0a 20 20 20 20 t++). {.
2050: 20 20 20 20 74 65 6d 70 20 3d 20 53 48 41 31 43 temp = SHA1C
2060: 69 72 63 75 6c 61 72 53 68 69 66 74 28 35 2c 41 ircularShift(5,A
2070: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ) +.
2080: 20 20 20 28 28 42 20 26 20 43 29 20 7c 20 28 42 ((B & C) | (B
2090: 20 26 20 44 29 20 7c 20 28 43 20 26 20 44 29 29 & D) | (C & D))
20a0: 20 2b 20 45 20 2b 20 57 5b 74 5d 20 2b 20 4b 5b + E + W[t] + K[
20b0: 32 5d 3b 0a 20 20 20 20 20 20 20 20 45 20 3d 20 2];. E =
20c0: 44 3b 0a 20 20 20 20 20 20 20 20 44 20 3d 20 43 D;. D = C
20d0: 3b 0a 20 20 20 20 20 20 20 20 43 20 3d 20 53 48 ;. C = SH
20e0: 41 31 43 69 72 63 75 6c 61 72 53 68 69 66 74 28 A1CircularShift(
20f0: 33 30 2c 42 29 3b 0a 20 20 20 20 20 20 20 20 42 30,B);. B
2100: 20 3d 20 41 3b 0a 20 20 20 20 20 20 20 20 41 20 = A;. A
2110: 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 0a 20 = temp;. }..
2120: 20 20 20 66 6f 72 28 74 20 3d 20 36 30 3b 20 74 for(t = 60; t
2130: 20 3c 20 38 30 3b 20 74 2b 2b 29 0a 20 20 20 20 < 80; t++).
2140: 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 20 3d {. temp =
2150: 20 53 48 41 31 43 69 72 63 75 6c 61 72 53 68 69 SHA1CircularShi
2160: 66 74 28 35 2c 41 29 20 2b 20 28 42 20 5e 20 43 ft(5,A) + (B ^ C
2170: 20 5e 20 44 29 20 2b 20 45 20 2b 20 57 5b 74 5d ^ D) + E + W[t]
2180: 20 2b 20 4b 5b 33 5d 3b 0a 20 20 20 20 20 20 20 + K[3];.
2190: 20 45 20 3d 20 44 3b 0a 20 20 20 20 20 20 20 20 E = D;.
21a0: 44 20 3d 20 43 3b 0a 20 20 20 20 20 20 20 20 43 D = C;. C
21b0: 20 3d 20 53 48 41 31 43 69 72 63 75 6c 61 72 53 = SHA1CircularS
21c0: 68 69 66 74 28 33 30 2c 42 29 3b 0a 20 20 20 20 hift(30,B);.
21d0: 20 20 20 20 42 20 3d 20 41 3b 0a 20 20 20 20 20 B = A;.
21e0: 20 20 20 41 20 3d 20 74 65 6d 70 3b 0a 20 20 20 A = temp;.
21f0: 20 7d 0a 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d }.. context-
2200: 3e 49 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61 >Intermediate_Ha
2210: 73 68 5b 30 5d 20 2b 3d 20 41 3b 0a 20 20 20 20 sh[0] += A;.
2220: 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d 65 context->Interme
2230: 64 69 61 74 65 5f 48 61 73 68 5b 31 5d 20 2b 3d diate_Hash[1] +=
2240: 20 42 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d B;. context-
2250: 3e 49 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61 >Intermediate_Ha
2260: 73 68 5b 32 5d 20 2b 3d 20 43 3b 0a 20 20 20 20 sh[2] += C;.
2270: 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d 65 context->Interme
2280: 64 69 61 74 65 5f 48 61 73 68 5b 33 5d 20 2b 3d diate_Hash[3] +=
2290: 20 44 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d D;. context-
22a0: 3e 49 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61 >Intermediate_Ha
22b0: 73 68 5b 34 5d 20 2b 3d 20 45 3b 0a 0a 20 20 20 sh[4] += E;..
22c0: 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67 context->Messag
22d0: 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 20 3d 20 e_Block_Index =
22e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 20 53 48 41 0;.}../*. * SHA
22f0: 31 50 61 64 4d 65 73 73 61 67 65 0a 20 2a 0a 0a 1PadMessage. *..
2300: 20 2a 20 20 44 65 73 63 72 69 70 74 69 6f 6e 3a * Description:
2310: 0a 20 2a 20 20 20 20 20 20 41 63 63 6f 72 64 69 . * Accordi
2320: 6e 67 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 ng to the standa
2330: 72 64 2c 20 74 68 65 20 6d 65 73 73 61 67 65 20 rd, the message
2340: 6d 75 73 74 20 62 65 20 70 61 64 64 65 64 20 74 must be padded t
2350: 6f 20 61 6e 20 65 76 65 6e 0a 20 2a 20 20 20 20 o an even. *
2360: 20 20 35 31 32 20 62 69 74 73 2e 20 20 54 68 65 512 bits. The
2370: 20 66 69 72 73 74 20 70 61 64 64 69 6e 67 20 62 first padding b
2380: 69 74 20 6d 75 73 74 20 62 65 20 61 20 27 31 27 it must be a '1'
2390: 2e 20 20 54 68 65 20 6c 61 73 74 20 36 34 0a 20 . The last 64.
23a0: 2a 20 20 20 20 20 20 62 69 74 73 20 72 65 70 72 * bits repr
23b0: 65 73 65 6e 74 20 74 68 65 20 6c 65 6e 67 74 68 esent the length
23c0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c of the original
23d0: 20 6d 65 73 73 61 67 65 2e 20 20 41 6c 6c 20 62 message. All b
23e0: 69 74 73 20 69 6e 0a 20 2a 20 20 20 20 20 20 62 its in. * b
23f0: 65 74 77 65 65 6e 20 73 68 6f 75 6c 64 20 62 65 etween should be
2400: 20 30 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 0. This functi
2410: 6f 6e 20 77 69 6c 6c 20 70 61 64 20 74 68 65 20 on will pad the
2420: 6d 65 73 73 61 67 65 0a 20 2a 20 20 20 20 20 20 message. *
2430: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 6f according to tho
2440: 73 65 20 72 75 6c 65 73 20 62 79 20 66 69 6c 6c se rules by fill
2450: 69 6e 67 20 74 68 65 20 4d 65 73 73 61 67 65 5f ing the Message_
2460: 42 6c 6f 63 6b 20 61 72 72 61 79 0a 20 2a 20 20 Block array. *
2470: 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e accordingly.
2480: 20 20 49 74 20 77 69 6c 6c 20 61 6c 73 6f 20 63 It will also c
2490: 61 6c 6c 20 74 68 65 20 50 72 6f 63 65 73 73 4d all the ProcessM
24a0: 65 73 73 61 67 65 42 6c 6f 63 6b 20 66 75 6e 63 essageBlock func
24b0: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 70 72 6f tion. * pro
24c0: 76 69 64 65 64 20 61 70 70 72 6f 70 72 69 61 74 vided appropriat
24d0: 65 6c 79 2e 20 20 57 68 65 6e 20 69 74 20 72 65 ely. When it re
24e0: 74 75 72 6e 73 2c 20 69 74 20 63 61 6e 20 62 65 turns, it can be
24f0: 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 20 2a assumed that. *
2500: 20 20 20 20 20 20 74 68 65 20 6d 65 73 73 61 67 the messag
2510: 65 20 64 69 67 65 73 74 20 68 61 73 20 62 65 65 e digest has bee
2520: 6e 20 63 6f 6d 70 75 74 65 64 2e 0a 20 2a 0a 20 n computed.. *.
2530: 2a 20 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 20 * Parameters:.
2540: 2a 20 20 20 20 20 20 63 6f 6e 74 65 78 74 3a 20 * context:
2550: 5b 69 6e 2f 6f 75 74 5d 0a 20 2a 20 20 20 20 20 [in/out]. *
2560: 20 20 20 20 20 54 68 65 20 63 6f 6e 74 65 78 74 The context
2570: 20 74 6f 20 70 61 64 0a 20 2a 20 20 20 20 20 20 to pad. *
2580: 50 72 6f 63 65 73 73 4d 65 73 73 61 67 65 42 6c ProcessMessageBl
2590: 6f 63 6b 3a 20 5b 69 6e 5d 0a 20 2a 20 20 20 20 ock: [in]. *
25a0: 20 20 20 20 20 20 54 68 65 20 61 70 70 72 6f 70 The approp
25b0: 72 69 61 74 65 20 53 48 41 2a 50 72 6f 63 65 73 riate SHA*Proces
25c0: 73 4d 65 73 73 61 67 65 42 6c 6f 63 6b 20 66 75 sMessageBlock fu
25d0: 6e 63 74 69 6f 6e 0a 20 2a 20 20 52 65 74 75 72 nction. * Retur
25e0: 6e 73 3a 0a 20 2a 20 20 20 20 20 20 4e 6f 74 68 ns:. * Noth
25f0: 69 6e 67 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 ing.. *. */.stat
2600: 69 63 20 76 6f 69 64 20 53 48 41 31 50 61 64 4d ic void SHA1PadM
2610: 65 73 73 61 67 65 28 53 48 41 31 43 6f 6e 74 65 essage(SHA1Conte
2620: 78 74 20 2a 63 6f 6e 74 65 78 74 29 0a 7b 0a 20 xt *context).{.
2630: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 20 43 68 /*. * Ch
2640: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 eck to see if th
2650: 65 20 63 75 72 72 65 6e 74 20 6d 65 73 73 61 67 e current messag
2660: 65 20 62 6c 6f 63 6b 20 69 73 20 74 6f 6f 20 73 e block is too s
2670: 6d 61 6c 6c 20 74 6f 20 68 6f 6c 64 0a 20 20 20 mall to hold.
2680: 20 20 2a 20 20 74 68 65 20 69 6e 69 74 69 61 6c * the initial
2690: 20 70 61 64 64 69 6e 67 20 62 69 74 73 20 61 6e padding bits an
26a0: 64 20 6c 65 6e 67 74 68 2e 20 20 49 66 20 73 6f d length. If so
26b0: 2c 20 77 65 20 77 69 6c 6c 20 70 61 64 20 74 68 , we will pad th
26c0: 65 0a 20 20 20 20 20 2a 20 20 62 6c 6f 63 6b 2c e. * block,
26d0: 20 70 72 6f 63 65 73 73 20 69 74 2c 20 61 6e 64 process it, and
26e0: 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 70 then continue p
26f0: 61 64 64 69 6e 67 20 69 6e 74 6f 20 61 20 73 65 adding into a se
2700: 63 6f 6e 64 0a 20 20 20 20 20 2a 20 20 62 6c 6f cond. * blo
2710: 63 6b 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ck.. */.
2720: 69 66 20 28 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 if (context->Mes
2730: 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 sage_Block_Index
2740: 20 3e 20 35 35 29 0a 20 20 20 20 7b 0a 20 20 20 > 55). {.
2750: 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 context->Me
2760: 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 63 6f 6e 74 ssage_Block[cont
2770: 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f ext->Message_Blo
2780: 63 6b 5f 49 6e 64 65 78 2b 2b 5d 20 3d 20 30 78 ck_Index++] = 0x
2790: 38 30 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 80;. whil
27a0: 65 28 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 e(context->Messa
27b0: 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 20 3c ge_Block_Index <
27c0: 20 36 34 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 64). {.
27d0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 conte
27e0: 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 xt->Message_Bloc
27f0: 6b 5b 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 k[context->Messa
2800: 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 2b 2b ge_Block_Index++
2810: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d ] = 0;. }
2820: 0a 0a 20 20 20 20 20 20 20 20 53 48 41 31 50 72 .. SHA1Pr
2830: 6f 63 65 73 73 4d 65 73 73 61 67 65 42 6c 6f 63 ocessMessageBloc
2840: 6b 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 20 k(context);..
2850: 20 20 20 20 20 77 68 69 6c 65 28 63 6f 6e 74 65 while(conte
2860: 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 xt->Message_Bloc
2870: 6b 5f 49 6e 64 65 78 20 3c 20 35 36 29 0a 20 20 k_Index < 56).
2880: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 {.
2890: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 context->Mes
28a0: 73 61 67 65 5f 42 6c 6f 63 6b 5b 63 6f 6e 74 65 sage_Block[conte
28b0: 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 xt->Message_Bloc
28c0: 6b 5f 49 6e 64 65 78 2b 2b 5d 20 3d 20 30 3b 0a k_Index++] = 0;.
28d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a }. }.
28e0: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 7b 0a 20 else. {.
28f0: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e context->
2900: 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 63 6f Message_Block[co
2910: 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 ntext->Message_B
2920: 6c 6f 63 6b 5f 49 6e 64 65 78 2b 2b 5d 20 3d 20 lock_Index++] =
2930: 30 78 38 30 3b 0a 20 20 20 20 20 20 20 20 77 68 0x80;. wh
2940: 69 6c 65 28 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 ile(context->Mes
2950: 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 sage_Block_Index
2960: 20 3c 20 35 36 29 0a 20 20 20 20 20 20 20 20 7b < 56). {
2970: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f .. co
2980: 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 ntext->Message_B
2990: 6c 6f 63 6b 5b 63 6f 6e 74 65 78 74 2d 3e 4d 65 lock[context->Me
29a0: 73 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 ssage_Block_Inde
29b0: 78 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 x++] = 0;.
29c0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f }. }.. /
29d0: 2a 0a 20 20 20 20 20 2a 20 20 53 74 6f 72 65 20 *. * Store
29e0: 74 68 65 20 6d 65 73 73 61 67 65 20 6c 65 6e 67 the message leng
29f0: 74 68 20 61 73 20 74 68 65 20 6c 61 73 74 20 38 th as the last 8
2a00: 20 6f 63 74 65 74 73 0a 20 20 20 20 20 2a 2f 0a octets. */.
2a10: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 context->Mes
2a20: 73 61 67 65 5f 42 6c 6f 63 6b 5b 35 36 5d 20 3d sage_Block[56] =
2a30: 20 63 6f 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 context->Length
2a40: 5f 48 69 67 68 20 3e 3e 20 32 34 3b 0a 20 20 20 _High >> 24;.
2a50: 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67 context->Messag
2a60: 65 5f 42 6c 6f 63 6b 5b 35 37 5d 20 3d 20 63 6f e_Block[57] = co
2a70: 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 48 69 ntext->Length_Hi
2a80: 67 68 20 3e 3e 20 31 36 3b 0a 20 20 20 20 63 6f gh >> 16;. co
2a90: 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 ntext->Message_B
2aa0: 6c 6f 63 6b 5b 35 38 5d 20 3d 20 63 6f 6e 74 65 lock[58] = conte
2ab0: 78 74 2d 3e 4c 65 6e 67 74 68 5f 48 69 67 68 20 xt->Length_High
2ac0: 3e 3e 20 38 3b 0a 20 20 20 20 63 6f 6e 74 65 78 >> 8;. contex
2ad0: 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b t->Message_Block
2ae0: 5b 35 39 5d 20 3d 20 63 6f 6e 74 65 78 74 2d 3e [59] = context->
2af0: 4c 65 6e 67 74 68 5f 48 69 67 68 3b 0a 20 20 20 Length_High;.
2b00: 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67 context->Messag
2b10: 65 5f 42 6c 6f 63 6b 5b 36 30 5d 20 3d 20 63 6f e_Block[60] = co
2b20: 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f ntext->Length_Lo
2b30: 77 20 3e 3e 20 32 34 3b 0a 20 20 20 20 63 6f 6e w >> 24;. con
2b40: 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c text->Message_Bl
2b50: 6f 63 6b 5b 36 31 5d 20 3d 20 63 6f 6e 74 65 78 ock[61] = contex
2b60: 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f 77 20 3e 3e t->Length_Low >>
2b70: 20 31 36 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 16;. context
2b80: 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5b ->Message_Block[
2b90: 36 32 5d 20 3d 20 63 6f 6e 74 65 78 74 2d 3e 4c 62] = context->L
2ba0: 65 6e 67 74 68 5f 4c 6f 77 20 3e 3e 20 38 3b 0a ength_Low >> 8;.
2bb0: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 context->Mes
2bc0: 73 61 67 65 5f 42 6c 6f 63 6b 5b 36 33 5d 20 3d sage_Block[63] =
2bd0: 20 63 6f 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 context->Length
2be0: 5f 4c 6f 77 3b 0a 0a 20 20 20 20 53 48 41 31 50 _Low;.. SHA1P
2bf0: 72 6f 63 65 73 73 4d 65 73 73 61 67 65 42 6c 6f rocessMessageBlo
2c00: 63 6b 28 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a ck(context);.}..
2c10: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 ./*.** Convert a
2c20: 20 64 69 67 65 73 74 20 69 6e 74 6f 20 62 61 73 digest into bas
2c30: 65 2d 31 36 2e 20 20 64 69 67 65 73 74 20 73 68 e-16. digest sh
2c40: 6f 75 6c 64 20 62 65 20 64 65 63 6c 61 72 65 64 ould be declared
2c50: 20 61 73 0a 2a 2a 20 22 75 6e 73 69 67 6e 65 64 as.** "unsigned
2c60: 20 63 68 61 72 20 64 69 67 65 73 74 5b 32 30 5d char digest[20]
2c70: 22 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 " in the calling
2c80: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 function. The
2c90: 53 48 41 31 0a 2a 2a 20 64 69 67 65 73 74 20 69 SHA1.** digest i
2ca0: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 s stored in the
2cb0: 66 69 72 73 74 20 32 30 20 62 79 74 65 73 2e 20 first 20 bytes.
2cc0: 20 7a 42 75 66 20 73 68 6f 75 6c 64 0a 2a 2a 20 zBuf should.**
2cd0: 62 65 20 22 63 68 61 72 20 7a 42 75 66 5b 34 31 be "char zBuf[41
2ce0: 5d 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ]"..*/.static vo
2cf0: 69 64 20 44 69 67 65 73 74 54 6f 42 61 73 65 31 id DigestToBase1
2d00: 36 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6(unsigned char
2d10: 2a 64 69 67 65 73 74 2c 20 63 68 61 72 20 2a 7a *digest, char *z
2d20: 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 Buf){. static c
2d30: 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e 63 6f 64 har const zEncod
2d40: 65 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 e[] = "012345678
2d50: 39 61 62 63 64 65 66 22 3b 0a 20 20 69 6e 74 20 9abcdef";. int
2d60: 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28 6a 3d 69 i, j;.. for(j=i
2d70: 3d 30 3b 20 69 3c 32 30 3b 20 69 2b 2b 29 7b 0a =0; i<20; i++){.
2d80: 20 20 20 20 69 6e 74 20 61 20 3d 20 64 69 67 65 int a = dige
2d90: 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42 75 66 5b st[i];. zBuf[
2da0: 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 28 j++] = zEncode[(
2db0: 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20 a>>4)&0xf];.
2dc0: 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 zBuf[j++] = zEnc
2dd0: 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b 0a 20 20 ode[a & 0xf];.
2de0: 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b }. zBuf[j] = 0;
2df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 .}../*.** The st
2e00: 61 74 65 20 6f 66 20 61 20 69 6e 63 72 65 6d 65 ate of a increme
2e10: 6e 74 61 6c 20 53 48 41 31 20 63 68 65 63 6b 73 ntal SHA1 checks
2e20: 75 6d 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20 um computation.
2e30: 20 4f 6e 6c 79 20 6f 6e 65 0a 2a 2a 20 73 75 63 Only one.** suc
2e40: 68 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 63 61 h computation ca
2e50: 6e 20 62 65 20 75 6e 64 65 72 77 61 79 20 61 74 n be underway at
2e60: 20 61 20 74 69 6d 65 2c 20 6f 66 20 63 6f 75 72 a time, of cour
2e70: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 48 se..*/.static SH
2e80: 41 31 43 6f 6e 74 65 78 74 20 69 6e 63 72 43 74 A1Context incrCt
2e90: 78 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e x;.static int in
2ea0: 63 72 49 6e 69 74 20 3d 20 30 3b 0a 0a 2f 2a 0a crInit = 0;../*.
2eb0: 2a 2a 20 41 64 64 20 6d 6f 72 65 20 74 65 78 74 ** Add more text
2ec0: 20 74 6f 20 74 68 65 20 69 6e 63 72 65 6d 65 6e to the incremen
2ed0: 74 61 6c 20 53 48 41 31 20 63 68 65 63 6b 73 75 tal SHA1 checksu
2ee0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 68 61 31 73 m..*/.void sha1s
2ef0: 75 6d 5f 73 74 65 70 5f 74 65 78 74 28 63 6f 6e um_step_text(con
2f00: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 st char *zText,
2f10: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 69 int nBytes){. i
2f20: 66 28 20 21 69 6e 63 72 49 6e 69 74 20 29 7b 0a f( !incrInit ){.
2f30: 20 20 20 20 53 48 41 31 52 65 73 65 74 28 26 69 SHA1Reset(&i
2f40: 6e 63 72 43 74 78 29 3b 0a 20 20 20 20 69 6e 63 ncrCtx);. inc
2f50: 72 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 rInit = 1;. }.
2f60: 20 69 66 28 20 6e 42 79 74 65 73 3c 3d 30 20 29 if( nBytes<=0 )
2f70: 7b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 73 {. if( nBytes
2f80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 ==0 ) return;.
2f90: 20 20 6e 42 79 74 65 73 20 3d 20 73 74 72 6c 65 nBytes = strle
2fa0: 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 n(zText);. }.
2fb0: 53 48 41 31 49 6e 70 75 74 28 26 69 6e 63 72 43 SHA1Input(&incrC
2fc0: 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 tx, (unsigned ch
2fd0: 61 72 2a 29 7a 54 65 78 74 2c 20 6e 42 79 74 65 ar*)zText, nByte
2fe0: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 s);.}../*.** Add
2ff0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 the content of
3000: 61 20 62 6c 6f 62 20 74 6f 20 74 68 65 20 69 6e a blob to the in
3010: 63 72 65 6d 65 6e 74 61 6c 20 53 48 41 31 20 63 cremental SHA1 c
3020: 68 65 63 6b 73 75 6d 2e 0a 2a 2f 0a 76 6f 69 64 hecksum..*/.void
3030: 20 73 68 61 31 73 75 6d 5f 73 74 65 70 5f 62 6c sha1sum_step_bl
3040: 6f 62 28 42 6c 6f 62 20 2a 70 29 7b 0a 20 20 73 ob(Blob *p){. s
3050: 68 61 31 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 ha1sum_step_text
3060: 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 29 2c (blob_buffer(p),
3070: 20 62 6c 6f 62 5f 73 69 7a 65 28 70 29 29 3b 0a blob_size(p));.
3080: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 69 73 68 20 }../*.** Finish
3090: 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 the incremental
30a0: 53 48 41 31 20 63 68 65 63 6b 73 75 6d 2e 20 20 SHA1 checksum.
30b0: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 Store the result
30c0: 20 69 6e 20 62 6c 6f 62 20 70 4f 75 74 0a 2a 2a in blob pOut.**
30d0: 20 69 66 20 70 4f 75 74 21 3d 30 2e 20 20 41 6c if pOut!=0. Al
30e0: 73 6f 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e so return a poin
30f0: 74 65 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c ter to the resul
3100: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 t. .**.** This
3110: 72 65 73 65 74 73 20 74 68 65 20 69 6e 63 72 65 resets the incre
3120: 6d 65 6e 74 61 6c 20 63 68 65 63 6b 73 75 6d 20 mental checksum
3130: 70 72 65 70 61 72 69 6e 67 20 66 6f 72 20 74 68 preparing for th
3140: 65 20 6e 65 78 74 20 72 6f 75 6e 64 0a 2a 2a 20 e next round.**
3150: 6f 66 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20 of computation.
3160: 20 54 68 65 20 72 65 74 75 72 6e 20 70 6f 69 6e The return poin
3170: 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 ter points to a
3180: 73 74 61 74 69 63 20 62 75 66 66 65 72 20 74 68 static buffer th
3190: 61 74 0a 2a 2a 20 69 73 20 6f 76 65 72 77 72 69 at.** is overwri
31a0: 74 74 65 6e 20 62 79 20 73 75 62 73 65 71 75 65 tten by subseque
31b0: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 nt calls to this
31c0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 function..*/.ch
31d0: 61 72 20 2a 73 68 61 31 73 75 6d 5f 66 69 6e 69 ar *sha1sum_fini
31e0: 73 68 28 42 6c 6f 62 20 2a 70 4f 75 74 29 7b 0a sh(Blob *pOut){.
31f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
3200: 7a 52 65 73 75 6c 74 5b 32 30 5d 3b 0a 20 20 73 zResult[20];. s
3210: 74 61 74 69 63 20 63 68 61 72 20 7a 4f 75 74 5b tatic char zOut[
3220: 34 31 5d 3b 0a 20 20 73 68 61 31 73 75 6d 5f 73 41];. sha1sum_s
3230: 74 65 70 5f 74 65 78 74 28 30 2c 30 29 3b 0a 20 tep_text(0,0);.
3240: 20 53 48 41 31 52 65 73 75 6c 74 28 26 69 6e 63 SHA1Result(&inc
3250: 72 43 74 78 2c 20 7a 52 65 73 75 6c 74 29 3b 0a rCtx, zResult);.
3260: 20 20 69 6e 63 72 49 6e 69 74 20 3d 20 30 3b 0a incrInit = 0;.
3270: 20 20 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 DigestToBase16
3280: 28 7a 52 65 73 75 6c 74 2c 20 7a 4f 75 74 29 3b (zResult, zOut);
3290: 0a 20 20 69 66 28 20 70 4f 75 74 20 29 7b 0a 20 . if( pOut ){.
32a0: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 4f 75 blob_zero(pOu
32b0: 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 t);. blob_app
32c0: 65 6e 64 28 70 4f 75 74 2c 20 7a 4f 75 74 2c 20 end(pOut, zOut,
32d0: 34 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 40);. }. retur
32e0: 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a n zOut;.}.../*.*
32f0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 53 48 * Compute the SH
3300: 41 31 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 A1 checksum of a
3310: 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 20 file on disk.
3320: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 Store the result
3330: 69 6e 67 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 ing.** checksum
3340: 69 6e 20 74 68 65 20 62 6c 6f 62 20 70 43 6b 73 in the blob pCks
3350: 75 6d 2e 20 20 70 43 6b 73 75 6d 20 69 73 20 61 um. pCksum is a
3360: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 69 6e 69 ssumed to be ini
3370: 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 0a 2a nitialized..**.*
3380: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d * Return the num
3390: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a ber of errors..*
33a0: 2f 0a 69 6e 74 20 73 68 61 31 73 75 6d 5f 66 69 /.int sha1sum_fi
33b0: 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a le(const char *z
33c0: 46 69 6c 65 6e 61 6d 65 2c 20 42 6c 6f 62 20 2a Filename, Blob *
33d0: 70 43 6b 73 75 6d 29 7b 0a 20 20 46 49 4c 45 20 pCksum){. FILE
33e0: 2a 69 6e 3b 0a 20 20 53 48 41 31 43 6f 6e 74 65 *in;. SHA1Conte
33f0: 78 74 20 63 74 78 3b 0a 20 20 75 6e 73 69 67 6e xt ctx;. unsign
3400: 65 64 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b ed char zResult[
3410: 32 30 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 20];. char zBuf
3420: 5b 31 30 32 34 30 5d 3b 0a 0a 20 20 69 6e 20 3d [10240];.. in =
3430: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 fopen(zFilename
3440: 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e ,"rb");. if( in
3450: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ==0 ){. retur
3460: 6e 20 31 3b 0a 20 20 7d 0a 20 20 53 48 41 31 52 n 1;. }. SHA1R
3470: 65 73 65 74 28 26 63 74 78 29 3b 0a 20 20 66 6f eset(&ctx);. fo
3480: 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6e r(;;){. int n
3490: 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28 ;. n = fread(
34a0: 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f 66 28 zBuf, 1, sizeof(
34b0: 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20 20 20 20 zBuf), in);.
34c0: 69 66 28 20 6e 3c 3d 30 20 29 20 62 72 65 61 6b if( n<=0 ) break
34d0: 3b 0a 20 20 20 20 53 48 41 31 49 6e 70 75 74 28 ;. SHA1Input(
34e0: 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 &ctx, (unsigned
34f0: 63 68 61 72 2a 29 7a 42 75 66 2c 20 28 75 6e 73 char*)zBuf, (uns
3500: 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d 0a 20 20 igned)n);. }.
3510: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 62 6c fclose(in);. bl
3520: 6f 62 5f 7a 65 72 6f 28 70 43 6b 73 75 6d 29 3b ob_zero(pCksum);
3530: 0a 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 28 70 . blob_resize(p
3540: 43 6b 73 75 6d 2c 20 34 30 29 3b 0a 20 20 53 48 Cksum, 40);. SH
3550: 41 31 52 65 73 75 6c 74 28 26 63 74 78 2c 20 7a A1Result(&ctx, z
3560: 52 65 73 75 6c 74 29 3b 0a 20 20 44 69 67 65 73 Result);. Diges
3570: 74 54 6f 42 61 73 65 31 36 28 7a 52 65 73 75 6c tToBase16(zResul
3580: 74 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 t, blob_buffer(p
3590: 43 6b 73 75 6d 29 29 3b 0a 20 20 72 65 74 75 72 Cksum));. retur
35a0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f n 0;.}../*.** Co
35b0: 6d 70 75 74 65 20 74 68 65 20 53 48 41 31 20 63 mpute the SHA1 c
35c0: 68 65 63 6b 73 75 6d 20 6f 66 20 61 20 62 6c 6f hecksum of a blo
35d0: 62 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 53 74 b in memory. St
35e0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e ore the resultin
35f0: 67 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 69 6e g.** checksum in
3600: 20 74 68 65 20 62 6c 6f 62 20 70 43 6b 73 75 6d the blob pCksum
3610: 2e 20 20 70 43 6b 73 75 6d 20 69 73 20 61 73 73 . pCksum is ass
3620: 75 6d 65 64 20 74 6f 20 62 65 20 65 69 74 68 65 umed to be eithe
3630: 72 0a 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a r.** uninitializ
3640: 65 64 20 6f 72 20 74 68 65 20 73 61 6d 65 20 62 ed or the same b
3650: 6c 6f 62 20 61 73 20 70 49 6e 2e 0a 2a 2a 0a 2a lob as pIn..**.*
3660: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d * Return the num
3670: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a ber of errors..*
3680: 2f 0a 69 6e 74 20 73 68 61 31 73 75 6d 5f 62 6c /.int sha1sum_bl
3690: 6f 62 28 63 6f 6e 73 74 20 42 6c 6f 62 20 2a 70 ob(const Blob *p
36a0: 49 6e 2c 20 42 6c 6f 62 20 2a 70 43 6b 73 75 6d In, Blob *pCksum
36b0: 29 7b 0a 20 20 53 48 41 31 43 6f 6e 74 65 78 74 ){. SHA1Context
36c0: 20 63 74 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 ctx;. unsigned
36d0: 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b 32 30 char zResult[20
36e0: 5d 3b 0a 0a 20 20 53 48 41 31 52 65 73 65 74 28 ];.. SHA1Reset(
36f0: 26 63 74 78 29 3b 0a 20 20 53 48 41 31 49 6e 70 &ctx);. SHA1Inp
3700: 75 74 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e ut(&ctx, (unsign
3710: 65 64 20 63 68 61 72 2a 29 62 6c 6f 62 5f 62 75 ed char*)blob_bu
3720: 66 66 65 72 28 70 49 6e 29 2c 20 62 6c 6f 62 5f ffer(pIn), blob_
3730: 73 69 7a 65 28 70 49 6e 29 29 3b 0a 20 20 69 66 size(pIn));. if
3740: 28 20 70 49 6e 3d 3d 70 43 6b 73 75 6d 20 29 7b ( pIn==pCksum ){
3750: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 . blob_reset(
3760: 70 43 6b 73 75 6d 29 3b 0a 20 20 7d 65 6c 73 65 pCksum);. }else
3770: 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 {. blob_zero(
3780: 70 43 6b 73 75 6d 29 3b 0a 20 20 7d 0a 20 20 62 pCksum);. }. b
3790: 6c 6f 62 5f 72 65 73 69 7a 65 28 70 43 6b 73 75 lob_resize(pCksu
37a0: 6d 2c 20 34 30 29 3b 0a 20 20 53 48 41 31 52 65 m, 40);. SHA1Re
37b0: 73 75 6c 74 28 26 63 74 78 2c 20 7a 52 65 73 75 sult(&ctx, zResu
37c0: 6c 74 29 3b 0a 20 20 44 69 67 65 73 74 54 6f 42 lt);. DigestToB
37d0: 61 73 65 31 36 28 7a 52 65 73 75 6c 74 2c 20 62 ase16(zResult, b
37e0: 6c 6f 62 5f 62 75 66 66 65 72 28 70 43 6b 73 75 lob_buffer(pCksu
37f0: 6d 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b m));. return 0;
3800: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 .}.../*.** COMMA
3810: 4e 44 3a 20 74 65 73 74 2d 73 68 61 31 73 75 6d ND: test-sha1sum
3820: 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 .**.** Compute a
3830: 6e 20 53 48 41 31 20 63 68 65 63 6b 73 75 6d 20 n SHA1 checksum
3840: 6f 66 20 61 6c 6c 20 66 69 6c 65 73 20 6e 61 6d of all files nam
3850: 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e ed on the comman
3860: 64 2d 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 61 6e d-line..** If an
3870: 20 66 69 6c 65 20 69 73 20 6e 61 6d 65 64 20 22 file is named "
3880: 2d 22 20 74 68 65 6e 20 74 61 6b 65 20 69 74 73 -" then take its
3890: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 73 74 content from st
38a0: 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f andard input..*/
38b0: 0a 76 6f 69 64 20 73 68 61 31 73 75 6d 5f 74 65 .void sha1sum_te
38c0: 73 74 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 st(void){. int
38d0: 69 3b 0a 20 20 42 6c 6f 62 20 69 6e 3b 0a 20 20 i;. Blob in;.
38e0: 42 6c 6f 62 20 63 6b 73 75 6d 3b 0a 20 20 0a 20 Blob cksum;. .
38f0: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 67 2e 61 72 for(i=2; i<g.ar
3900: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 gc; i++){. if
3910: 28 20 67 2e 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d ( g.argv[i][0]==
3920: 27 2d 27 20 26 26 20 67 2e 61 72 67 76 5b 69 5d '-' && g.argv[i]
3930: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 [1]==0 ){.
3940: 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 63 blob_read_from_c
3950: 68 61 6e 6e 65 6c 28 26 69 6e 2c 20 73 74 64 69 hannel(&in, stdi
3960: 6e 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 68 n, -1);. sh
3970: 61 31 73 75 6d 5f 62 6c 6f 62 28 26 69 6e 2c 20 a1sum_blob(&in,
3980: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 7d 65 6c &cksum);. }el
3990: 73 65 7b 0a 20 20 20 20 20 20 73 68 61 31 73 75 se{. sha1su
39a0: 6d 5f 66 69 6c 65 28 67 2e 61 72 67 76 5b 69 5d m_file(g.argv[i]
39b0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 7d , &cksum);. }
39c0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 20 . printf("%s
39d0: 20 25 73 5c 6e 22 2c 20 62 6c 6f 62 5f 73 74 72 %s\n", blob_str
39e0: 28 26 63 6b 73 75 6d 29 2c 20 67 2e 61 72 67 76 (&cksum), g.argv
39f0: 5b 69 5d 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 [i]);. blob_r
3a00: 65 73 65 74 28 26 63 6b 73 75 6d 29 3b 0a 20 20 eset(&cksum);.
3a10: 7d 0a 7d 0a }.}.