Hex Artifact Content

Artifact e3f79ad8a19458765b4923970b7d7dd5088ce6f7:


0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 68  ************* sh
0020: 61 31 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  a1.c ***********
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0040: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
0050: 2a 2a 2a 2a 20 53 65 65 20 52 46 43 20 36 32 33  **** See RFC 623
0060: 34 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  4 for details. *
0070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0080: 2a 2a 2f 0a 2f 2a 20 43 6f 70 79 72 69 67 68 74  **/./* Copyright
0090: 20 28 63 29 20 32 30 31 31 20 49 45 54 46 20 54   (c) 2011 IETF T
00a0: 72 75 73 74 20 61 6e 64 20 74 68 65 20 70 65 72  rust and the per
00b0: 73 6f 6e 73 20 69 64 65 6e 74 69 66 69 65 64 20  sons identified 
00c0: 61 73 20 2a 2f 0a 2f 2a 20 61 75 74 68 6f 72 73  as */./* authors
00d0: 20 6f 66 20 74 68 65 20 63 6f 64 65 2e 20 20 41   of the code.  A
00e0: 6c 6c 20 72 69 67 68 74 73 20 72 65 73 65 72 76  ll rights reserv
00f0: 65 64 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  ed.             
0100: 20 20 20 20 20 2a 2f 0a 2f 2a 20 53 65 65 20 73       */./* See s
0110: 68 61 2e 68 20 66 6f 72 20 74 65 72 6d 73 20 6f  ha.h for terms o
0120: 66 20 75 73 65 20 61 6e 64 20 72 65 64 69 73 74  f use and redist
0130: 72 69 62 75 74 69 6f 6e 2e 20 20 20 20 20 20 20  ribution.       
0140: 20 20 20 20 20 20 20 2a 2f 0a 0a 2f 2a 0a 20 2a         */../*. *
0150: 20 20 44 65 73 63 72 69 70 74 69 6f 6e 3a 0a 20    Description:. 
0160: 2a 20 20 20 20 20 20 54 68 69 73 20 66 69 6c 65  *      This file
0170: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
0180: 53 65 63 75 72 65 20 48 61 73 68 20 41 6c 67 6f  Secure Hash Algo
0190: 72 69 74 68 6d 20 53 48 41 2d 31 0a 20 2a 20 20  rithm SHA-1. *  
01a0: 20 20 20 20 61 73 20 64 65 66 69 6e 65 64 20 69      as defined i
01b0: 6e 20 74 68 65 20 55 2e 53 2e 20 4e 61 74 69 6f  n the U.S. Natio
01c0: 6e 61 6c 20 49 6e 73 74 69 74 75 74 65 20 6f 66  nal Institute of
01d0: 20 53 74 61 6e 64 61 72 64 73 0a 20 2a 20 20 20   Standards. *   
01e0: 20 20 20 61 6e 64 20 54 65 63 68 6e 6f 6c 6f 67     and Technolog
01f0: 79 20 46 65 64 65 72 61 6c 20 49 6e 66 6f 72 6d  y Federal Inform
0200: 61 74 69 6f 6e 20 50 72 6f 63 65 73 73 69 6e 67  ation Processing
0210: 20 53 74 61 6e 64 61 72 64 73 0a 20 2a 20 20 20   Standards. *   
0220: 20 20 20 50 75 62 6c 69 63 61 74 69 6f 6e 20 28     Publication (
0230: 46 49 50 53 20 50 55 42 29 20 31 38 30 2d 33 20  FIPS PUB) 180-3 
0240: 70 75 62 6c 69 73 68 65 64 20 69 6e 20 4f 63 74  published in Oct
0250: 6f 62 65 72 20 32 30 30 38 0a 20 2a 20 20 20 20  ober 2008. *    
0260: 20 20 61 6e 64 20 66 6f 72 6d 65 72 6c 79 20 64    and formerly d
0270: 65 66 69 6e 65 64 20 69 6e 20 69 74 73 20 70 72  efined in its pr
0280: 65 64 65 63 65 73 73 6f 72 73 2c 20 46 49 50 53  edecessors, FIPS
0290: 20 50 55 42 20 31 38 30 2d 31 0a 20 2a 20 20 20   PUB 180-1. *   
02a0: 20 20 20 61 6e 64 20 46 49 50 20 50 55 42 20 31     and FIP PUB 1
02b0: 38 30 2d 32 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  80-2.. *. *     
02c0: 20 41 20 63 6f 6d 62 69 6e 65 64 20 64 6f 63 75   A combined docu
02d0: 6d 65 6e 74 20 73 68 6f 77 69 6e 67 20 61 6c 6c  ment showing all
02e0: 20 61 6c 67 6f 72 69 74 68 6d 73 20 69 73 20 61   algorithms is a
02f0: 76 61 69 6c 61 62 6c 65 20 61 74 0a 20 2a 20 20  vailable at. *  
0300: 20 20 20 20 20 20 20 20 20 20 20 20 68 74 74 70              http
0310: 3a 2f 2f 63 73 72 63 2e 6e 69 73 74 2e 67 6f 76  ://csrc.nist.gov
0320: 2f 70 75 62 6c 69 63 61 74 69 6f 6e 73 2f 66 69  /publications/fi
0330: 70 73 2f 0a 20 2a 20 20 20 20 20 20 20 20 20 20  ps/. *          
0340: 20 20 20 20 20 20 20 20 20 20 20 66 69 70 73 31             fips1
0350: 38 30 2d 33 2f 66 69 70 73 31 38 30 2d 33 5f 66  80-3/fips180-3_f
0360: 69 6e 61 6c 2e 70 64 66 0a 20 2a 0a 20 2a 20 20  inal.pdf. *. *  
0370: 20 20 20 20 54 68 65 20 53 48 41 2d 31 20 61 6c      The SHA-1 al
0380: 67 6f 72 69 74 68 6d 20 70 72 6f 64 75 63 65 73  gorithm produces
0390: 20 61 20 31 36 30 2d 62 69 74 20 6d 65 73 73 61   a 160-bit messa
03a0: 67 65 20 64 69 67 65 73 74 20 66 6f 72 20 61 0a  ge digest for a.
03b0: 20 2a 20 20 20 20 20 20 67 69 76 65 6e 20 64 61   *      given da
03c0: 74 61 20 73 74 72 65 61 6d 20 74 68 61 74 20 63  ta stream that c
03d0: 61 6e 20 73 65 72 76 65 20 61 73 20 61 20 6d 65  an serve as a me
03e0: 61 6e 73 20 6f 66 20 70 72 6f 76 69 64 69 6e 67  ans of providing
03f0: 20 61 0a 20 2a 20 20 20 20 20 20 22 66 69 6e 67   a. *      "fing
0400: 65 72 70 72 69 6e 74 22 20 66 6f 72 20 61 20 6d  erprint" for a m
0410: 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 20 50  essage.. *. *  P
0420: 6f 72 74 61 62 69 6c 69 74 79 20 49 73 73 75 65  ortability Issue
0430: 73 3a 0a 20 2a 20 20 20 20 20 20 53 48 41 2d 31  s:. *      SHA-1
0440: 20 69 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74   is defined in t
0450: 65 72 6d 73 20 6f 66 20 33 32 2d 62 69 74 20 22  erms of 32-bit "
0460: 77 6f 72 64 73 22 2e 20 20 54 68 69 73 20 63 6f  words".  This co
0470: 64 65 0a 20 2a 20 20 20 20 20 20 75 73 65 73 20  de. *      uses 
0480: 3c 73 74 64 69 6e 74 2e 68 3e 20 28 69 6e 63 6c  <stdint.h> (incl
0490: 75 64 65 64 20 76 69 61 20 22 73 68 61 2e 68 22  uded via "sha.h"
04a0: 29 20 74 6f 20 64 65 66 69 6e 65 20 33 32 2d 20  ) to define 32- 
04b0: 61 6e 64 0a 20 2a 20 20 20 20 20 20 38 2d 62 69  and. *      8-bi
04c0: 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  t unsigned integ
04d0: 65 72 20 74 79 70 65 73 2e 20 20 49 66 20 79 6f  er types.  If yo
04e0: 75 72 20 43 20 63 6f 6d 70 69 6c 65 72 20 64 6f  ur C compiler do
04f0: 65 73 0a 20 2a 20 20 20 20 20 20 6e 6f 74 20 73  es. *      not s
0500: 75 70 70 6f 72 74 20 33 32 2d 62 69 74 20 75 6e  upport 32-bit un
0510: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2c  signed integers,
0520: 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f   this code is no
0530: 74 0a 20 2a 20 20 20 20 20 20 61 70 70 72 6f 70  t. *      approp
0540: 72 69 61 74 65 2e 0a 20 2a 0a 20 2a 20 20 43 61  riate.. *. *  Ca
0550: 76 65 61 74 73 3a 0a 20 2a 20 20 20 20 20 20 53  veats:. *      S
0560: 48 41 2d 31 20 69 73 20 64 65 73 69 67 6e 65 64  HA-1 is designed
0570: 20 74 6f 20 77 6f 72 6b 20 77 69 74 68 20 6d 65   to work with me
0580: 73 73 61 67 65 73 20 6c 65 73 73 20 74 68 61 6e  ssages less than
0590: 20 32 5e 36 34 20 62 69 74 73 0a 20 2a 20 20 20   2^64 bits. *   
05a0: 20 20 20 6c 6f 6e 67 2e 20 20 54 68 69 73 20 69     long.  This i
05b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
05c0: 65 73 20 53 48 41 31 49 6e 70 75 74 28 29 20 74  es SHA1Input() t
05d0: 6f 20 68 61 73 68 20 74 68 65 20 62 69 74 73 0a  o hash the bits.
05e0: 20 2a 20 20 20 20 20 20 74 68 61 74 20 61 72 65   *      that are
05f0: 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74   a multiple of t
0600: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 38 2d  he size of an 8-
0610: 62 69 74 20 6f 63 74 65 74 2c 20 61 6e 64 20 74  bit octet, and t
0620: 68 65 6e 0a 20 2a 20 20 20 20 20 20 6f 70 74 69  hen. *      opti
0630: 6f 6e 61 6c 6c 79 20 75 73 65 73 20 53 48 41 31  onally uses SHA1
0640: 46 69 6e 61 6c 42 69 74 73 28 29 20 74 6f 20 68  FinalBits() to h
0650: 61 73 68 20 74 68 65 20 66 69 6e 61 6c 20 66 65  ash the final fe
0660: 77 20 62 69 74 73 20 6f 66 0a 20 2a 20 20 20 20  w bits of. *    
0670: 20 20 74 68 65 20 69 6e 70 75 74 2e 0a 20 2a 2f    the input.. */
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 68 61 2e  ..#include "sha.
0690: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 73 68 61  h".#include "sha
06a0: 2d 70 72 69 76 61 74 65 2e 68 22 0a 0a 2f 2a 0a  -private.h"../*.
06b0: 20 2a 20 20 44 65 66 69 6e 65 20 74 68 65 20 53   *  Define the S
06c0: 48 41 31 20 63 69 72 63 75 6c 61 72 20 6c 65 66  HA1 circular lef
06d0: 74 20 73 68 69 66 74 20 6d 61 63 72 6f 0a 20 2a  t shift macro. *
06e0: 2f 0a 23 64 65 66 69 6e 65 20 53 48 41 31 5f 52  /.#define SHA1_R
06f0: 4f 54 4c 28 62 69 74 73 2c 77 6f 72 64 29 20 5c  OTL(bits,word) \
0700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0710: 20 28 28 28 77 6f 72 64 29 20 3c 3c 20 28 62 69   (((word) << (bi
0720: 74 73 29 29 20 7c 20 28 28 77 6f 72 64 29 20 3e  ts)) | ((word) >
0730: 3e 20 28 33 32 2d 28 62 69 74 73 29 29 29 29 0a  > (32-(bits)))).
0740: 0a 2f 2a 0a 20 2a 20 41 64 64 20 22 6c 65 6e 67  ./*. * Add "leng
0750: 74 68 22 20 74 6f 20 74 68 65 20 6c 65 6e 67 74  th" to the lengt
0760: 68 2e 0a 20 2a 20 53 65 74 20 43 6f 72 72 75 70  h.. * Set Corrup
0770: 74 65 64 20 77 68 65 6e 20 6f 76 65 72 66 6c 6f  ted when overflo
0780: 77 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  w has occurred..
0790: 20 2a 2f 0a 73 74 61 74 69 63 20 75 69 6e 74 33   */.static uint3
07a0: 32 5f 74 20 61 64 64 54 65 6d 70 3b 0a 23 64 65  2_t addTemp;.#de
07b0: 66 69 6e 65 20 53 48 41 31 41 64 64 4c 65 6e 67  fine SHA1AddLeng
07c0: 74 68 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e 67  th(context, leng
07d0: 74 68 29 20 20 20 20 20 20 20 20 20 20 20 20 20  th)             
07e0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 28 61          \.    (a
07f0: 64 64 54 65 6d 70 20 3d 20 28 63 6f 6e 74 65 78  ddTemp = (contex
0800: 74 29 2d 3e 4c 65 6e 67 74 68 5f 4c 6f 77 2c 20  t)->Length_Low, 
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0820: 20 20 20 20 20 5c 0a 20 20 20 20 20 28 63 6f 6e       \.     (con
0830: 74 65 78 74 29 2d 3e 43 6f 72 72 75 70 74 65 64  text)->Corrupted
0840: 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 20 5c 0a 20 20 20 20 20 20 20 20 28 28 28 63    \.        (((c
0870: 6f 6e 74 65 78 74 29 2d 3e 4c 65 6e 67 74 68 5f  ontext)->Length_
0880: 4c 6f 77 20 2b 3d 20 28 6c 65 6e 67 74 68 29 29  Low += (length))
0890: 20 3c 20 61 64 64 54 65 6d 70 29 20 26 26 20 5c   < addTemp) && \
08a0: 0a 20 20 20 20 20 20 20 20 28 2b 2b 28 63 6f 6e  .        (++(con
08b0: 74 65 78 74 29 2d 3e 4c 65 6e 67 74 68 5f 48 69  text)->Length_Hi
08c0: 67 68 20 3d 3d 20 30 29 20 3f 20 73 68 61 49 6e  gh == 0) ? shaIn
08d0: 70 75 74 54 6f 6f 4c 6f 6e 67 20 20 5c 0a 20 20  putTooLong  \.  
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 20 20 3a 20 28 63 6f 6e 74 65 78 74        : (context
0910: 29 2d 3e 43 6f 72 72 75 70 74 65 64 20 29 0a 0a  )->Corrupted )..
0920: 2f 2a 20 4c 6f 63 61 6c 20 46 75 6e 63 74 69 6f  /* Local Functio
0930: 6e 20 50 72 6f 74 6f 74 79 70 65 73 20 2a 2f 0a  n Prototypes */.
0940: 73 74 61 74 69 63 20 76 6f 69 64 20 53 48 41 31  static void SHA1
0950: 50 72 6f 63 65 73 73 4d 65 73 73 61 67 65 42 6c  ProcessMessageBl
0960: 6f 63 6b 28 53 48 41 31 43 6f 6e 74 65 78 74 20  ock(SHA1Context 
0970: 2a 63 6f 6e 74 65 78 74 29 3b 0a 73 74 61 74 69  *context);.stati
0980: 63 20 76 6f 69 64 20 53 48 41 31 46 69 6e 61 6c  c void SHA1Final
0990: 69 7a 65 28 53 48 41 31 43 6f 6e 74 65 78 74 20  ize(SHA1Context 
09a0: 2a 63 6f 6e 74 65 78 74 2c 20 75 69 6e 74 38 5f  *context, uint8_
09b0: 74 20 50 61 64 5f 42 79 74 65 29 3b 0a 73 74 61  t Pad_Byte);.sta
09c0: 74 69 63 20 76 6f 69 64 20 53 48 41 31 50 61 64  tic void SHA1Pad
09d0: 4d 65 73 73 61 67 65 28 53 48 41 31 43 6f 6e 74  Message(SHA1Cont
09e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 75 69  ext *context, ui
09f0: 6e 74 38 5f 74 20 50 61 64 5f 42 79 74 65 29 3b  nt8_t Pad_Byte);
0a00: 0a 0a 2f 2a 0a 20 2a 20 20 53 48 41 31 52 65 73  ../*. *  SHA1Res
0a10: 65 74 0a 20 2a 0a 20 2a 20 20 44 65 73 63 72 69  et. *. *  Descri
0a20: 70 74 69 6f 6e 3a 0a 20 2a 20 20 20 20 20 20 54  ption:. *      T
0a30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
0a40: 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  l initialize the
0a50: 20 53 48 41 31 43 6f 6e 74 65 78 74 20 69 6e 20   SHA1Context in 
0a60: 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 2a 20 20  preparation. *  
0a70: 20 20 20 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e      for computin
0a80: 67 20 61 20 6e 65 77 20 53 48 41 31 20 6d 65 73  g a new SHA1 mes
0a90: 73 61 67 65 20 64 69 67 65 73 74 2e 0a 20 2a 0a  sage digest.. *.
0aa0: 20 2a 20 20 50 61 72 61 6d 65 74 65 72 73 3a 0a   *  Parameters:.
0ab0: 20 2a 20 20 20 20 20 20 63 6f 6e 74 65 78 74 3a   *      context:
0ac0: 20 5b 69 6e 2f 6f 75 74 5d 0a 20 2a 20 20 20 20   [in/out]. *    
0ad0: 20 20 20 20 20 20 54 68 65 20 63 6f 6e 74 65 78        The contex
0ae0: 74 20 74 6f 20 72 65 73 65 74 2e 0a 20 2a 0a 20  t to reset.. *. 
0af0: 2a 20 20 52 65 74 75 72 6e 73 3a 0a 20 2a 20 20  *  Returns:. *  
0b00: 20 20 20 20 73 68 61 20 45 72 72 6f 72 20 43 6f      sha Error Co
0b10: 64 65 2e 0a 20 2a 0a 20 2a 2f 0a 69 6e 74 20 53  de.. *. */.int S
0b20: 48 41 31 52 65 73 65 74 28 53 48 41 31 43 6f 6e  HA1Reset(SHA1Con
0b30: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 0a 7b  text *context).{
0b40: 0a 20 20 69 66 20 28 21 63 6f 6e 74 65 78 74 29  .  if (!context)
0b50: 20 72 65 74 75 72 6e 20 73 68 61 4e 75 6c 6c 3b   return shaNull;
0b60: 0a 0a 20 20 63 6f 6e 74 65 78 74 2d 3e 4c 65 6e  ..  context->Len
0b70: 67 74 68 5f 48 69 67 68 20 3d 20 63 6f 6e 74 65  gth_High = conte
0b80: 78 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f 77 20 3d  xt->Length_Low =
0b90: 20 30 3b 0a 20 20 63 6f 6e 74 65 78 74 2d 3e 4d   0;.  context->M
0ba0: 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64  essage_Block_Ind
0bb0: 65 78 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  ex = 0;..  /* In
0bc0: 69 74 69 61 6c 20 48 61 73 68 20 56 61 6c 75 65  itial Hash Value
0bd0: 73 3a 20 46 49 50 53 20 31 38 30 2d 33 20 73 65  s: FIPS 180-3 se
0be0: 63 74 69 6f 6e 20 35 2e 33 2e 31 20 2a 2f 0a 20  ction 5.3.1 */. 
0bf0: 20 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d   context->Interm
0c00: 65 64 69 61 74 65 5f 48 61 73 68 5b 30 5d 20 20  ediate_Hash[0]  
0c10: 20 3d 20 30 78 36 37 34 35 32 33 30 31 3b 0a 20   = 0x67452301;. 
0c20: 20 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d   context->Interm
0c30: 65 64 69 61 74 65 5f 48 61 73 68 5b 31 5d 20 20  ediate_Hash[1]  
0c40: 20 3d 20 30 78 45 46 43 44 41 42 38 39 3b 0a 20   = 0xEFCDAB89;. 
0c50: 20 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d   context->Interm
0c60: 65 64 69 61 74 65 5f 48 61 73 68 5b 32 5d 20 20  ediate_Hash[2]  
0c70: 20 3d 20 30 78 39 38 42 41 44 43 46 45 3b 0a 20   = 0x98BADCFE;. 
0c80: 20 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d   context->Interm
0c90: 65 64 69 61 74 65 5f 48 61 73 68 5b 33 5d 20 20  ediate_Hash[3]  
0ca0: 20 3d 20 30 78 31 30 33 32 35 34 37 36 3b 0a 20   = 0x10325476;. 
0cb0: 20 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d   context->Interm
0cc0: 65 64 69 61 74 65 5f 48 61 73 68 5b 34 5d 20 20  ediate_Hash[4]  
0cd0: 20 3d 20 30 78 43 33 44 32 45 31 46 30 3b 0a 0a   = 0xC3D2E1F0;..
0ce0: 20 20 63 6f 6e 74 65 78 74 2d 3e 43 6f 6d 70 75    context->Compu
0cf0: 74 65 64 20 20 20 3d 20 30 3b 0a 20 20 63 6f 6e  ted   = 0;.  con
0d00: 74 65 78 74 2d 3e 43 6f 72 72 75 70 74 65 64 20  text->Corrupted 
0d10: 20 3d 20 73 68 61 53 75 63 63 65 73 73 3b 0a 0a   = shaSuccess;..
0d20: 20 20 72 65 74 75 72 6e 20 73 68 61 53 75 63 63    return shaSucc
0d30: 65 73 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 20 53  ess;.}../*. *  S
0d40: 48 41 31 49 6e 70 75 74 0a 20 2a 0a 20 2a 20 20  HA1Input. *. *  
0d50: 44 65 73 63 72 69 70 74 69 6f 6e 3a 0a 20 2a 20  Description:. * 
0d60: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
0d70: 6f 6e 20 61 63 63 65 70 74 73 20 61 6e 20 61 72  on accepts an ar
0d80: 72 61 79 20 6f 66 20 6f 63 74 65 74 73 20 61 73  ray of octets as
0d90: 20 74 68 65 20 6e 65 78 74 20 70 6f 72 74 69 6f   the next portio
0da0: 6e 0a 20 2a 20 20 20 20 20 20 6f 66 20 74 68 65  n. *      of the
0db0: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20   message.. *. * 
0dc0: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 20 2a 20   Parameters:. * 
0dd0: 20 20 20 20 20 63 6f 6e 74 65 78 74 3a 20 5b 69       context: [i
0de0: 6e 2f 6f 75 74 5d 0a 20 2a 20 20 20 20 20 20 20  n/out]. *       
0df0: 20 20 20 54 68 65 20 53 48 41 20 63 6f 6e 74 65     The SHA conte
0e00: 78 74 20 74 6f 20 75 70 64 61 74 65 2e 0a 20 2a  xt to update.. *
0e10: 20 20 20 20 20 20 6d 65 73 73 61 67 65 5f 61 72        message_ar
0e20: 72 61 79 5b 20 5d 3a 20 5b 69 6e 5d 0a 20 2a 20  ray[ ]: [in]. * 
0e30: 20 20 20 20 20 20 20 20 20 41 6e 20 61 72 72 61           An arra
0e40: 79 20 6f 66 20 6f 63 74 65 74 73 20 72 65 70 72  y of octets repr
0e50: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 65 78  esenting the nex
0e60: 74 20 70 6f 72 74 69 6f 6e 20 6f 66 0a 20 2a 20  t portion of. * 
0e70: 20 20 20 20 20 20 20 20 20 74 68 65 20 6d 65 73           the mes
0e80: 73 61 67 65 2e 0a 20 2a 20 20 20 20 20 20 6c 65  sage.. *      le
0e90: 6e 67 74 68 3a 20 5b 69 6e 5d 0a 20 2a 20 20 20  ngth: [in]. *   
0ea0: 20 20 20 20 20 20 20 54 68 65 20 6c 65 6e 67 74         The lengt
0eb0: 68 20 6f 66 20 74 68 65 20 6d 65 73 73 61 67 65  h of the message
0ec0: 20 69 6e 20 6d 65 73 73 61 67 65 5f 61 72 72 61   in message_arra
0ed0: 79 2e 0a 20 2a 0a 20 2a 20 20 52 65 74 75 72 6e  y.. *. *  Return
0ee0: 73 3a 0a 20 2a 20 20 20 20 20 20 73 68 61 20 45  s:. *      sha E
0ef0: 72 72 6f 72 20 43 6f 64 65 2e 0a 20 2a 0a 20 2a  rror Code.. *. *
0f00: 2f 0a 69 6e 74 20 53 48 41 31 49 6e 70 75 74 28  /.int SHA1Input(
0f10: 53 48 41 31 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  SHA1Context *con
0f20: 74 65 78 74 2c 0a 20 20 20 20 63 6f 6e 73 74 20  text,.    const 
0f30: 75 69 6e 74 38 5f 74 20 2a 6d 65 73 73 61 67 65  uint8_t *message
0f40: 5f 61 72 72 61 79 2c 20 75 6e 73 69 67 6e 65 64  _array, unsigned
0f50: 20 6c 65 6e 67 74 68 29 0a 7b 0a 20 20 69 66 20   length).{.  if 
0f60: 28 21 63 6f 6e 74 65 78 74 29 20 72 65 74 75 72  (!context) retur
0f70: 6e 20 73 68 61 4e 75 6c 6c 3b 0a 20 20 69 66 20  n shaNull;.  if 
0f80: 28 21 6c 65 6e 67 74 68 29 20 72 65 74 75 72 6e  (!length) return
0f90: 20 73 68 61 53 75 63 63 65 73 73 3b 0a 20 20 69   shaSuccess;.  i
0fa0: 66 20 28 21 6d 65 73 73 61 67 65 5f 61 72 72 61  f (!message_arra
0fb0: 79 29 20 72 65 74 75 72 6e 20 73 68 61 4e 75 6c  y) return shaNul
0fc0: 6c 3b 0a 20 20 69 66 20 28 63 6f 6e 74 65 78 74  l;.  if (context
0fd0: 2d 3e 43 6f 6d 70 75 74 65 64 29 20 72 65 74 75  ->Computed) retu
0fe0: 72 6e 20 63 6f 6e 74 65 78 74 2d 3e 43 6f 72 72  rn context->Corr
0ff0: 75 70 74 65 64 20 3d 20 73 68 61 53 74 61 74 65  upted = shaState
1000: 45 72 72 6f 72 3b 0a 20 20 69 66 20 28 63 6f 6e  Error;.  if (con
1010: 74 65 78 74 2d 3e 43 6f 72 72 75 70 74 65 64 29  text->Corrupted)
1020: 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 78 74 2d   return context-
1030: 3e 43 6f 72 72 75 70 74 65 64 3b 0a 0a 20 20 77  >Corrupted;..  w
1040: 68 69 6c 65 20 28 6c 65 6e 67 74 68 2d 2d 29 20  hile (length--) 
1050: 7b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4d  {.    context->M
1060: 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 63 6f 6e  essage_Block[con
1070: 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c  text->Message_Bl
1080: 6f 63 6b 5f 49 6e 64 65 78 2b 2b 5d 20 3d 0a 20  ock_Index++] =. 
1090: 20 20 20 20 20 2a 6d 65 73 73 61 67 65 5f 61 72       *message_ar
10a0: 72 61 79 3b 0a 0a 20 20 20 20 69 66 20 28 28 53  ray;..    if ((S
10b0: 48 41 31 41 64 64 4c 65 6e 67 74 68 28 63 6f 6e  HA1AddLength(con
10c0: 74 65 78 74 2c 20 38 29 20 3d 3d 20 73 68 61 53  text, 8) == shaS
10d0: 75 63 63 65 73 73 29 20 26 26 0a 20 20 20 20 20  uccess) &&.     
10e0: 20 28 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61   (context->Messa
10f0: 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 20 3d  ge_Block_Index =
1100: 3d 20 53 48 41 31 5f 4d 65 73 73 61 67 65 5f 42  = SHA1_Message_B
1110: 6c 6f 63 6b 5f 53 69 7a 65 29 29 0a 20 20 20 20  lock_Size)).    
1120: 20 20 53 48 41 31 50 72 6f 63 65 73 73 4d 65 73    SHA1ProcessMes
1130: 73 61 67 65 42 6c 6f 63 6b 28 63 6f 6e 74 65 78  sageBlock(contex
1140: 74 29 3b 0a 0a 20 20 20 20 6d 65 73 73 61 67 65  t);..    message
1150: 5f 61 72 72 61 79 2b 2b 3b 0a 20 20 7d 0a 0a 20  _array++;.  }.. 
1160: 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 78 74 2d   return context-
1170: 3e 43 6f 72 72 75 70 74 65 64 3b 0a 7d 0a 0a 2f  >Corrupted;.}../
1180: 2a 0a 20 2a 20 53 48 41 31 46 69 6e 61 6c 42 69  *. * SHA1FinalBi
1190: 74 73 0a 20 2a 0a 20 2a 20 44 65 73 63 72 69 70  ts. *. * Descrip
11a0: 74 69 6f 6e 3a 0a 20 2a 20 20 20 54 68 69 73 20  tion:. *   This 
11b0: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 64  function will ad
11c0: 64 20 69 6e 20 61 6e 79 20 66 69 6e 61 6c 20 62  d in any final b
11d0: 69 74 73 20 6f 66 20 74 68 65 20 6d 65 73 73 61  its of the messa
11e0: 67 65 2e 0a 20 2a 0a 20 2a 20 50 61 72 61 6d 65  ge.. *. * Parame
11f0: 74 65 72 73 3a 0a 20 2a 20 20 20 63 6f 6e 74 65  ters:. *   conte
1200: 78 74 3a 20 5b 69 6e 2f 6f 75 74 5d 0a 20 2a 20  xt: [in/out]. * 
1210: 20 20 20 20 54 68 65 20 53 48 41 20 63 6f 6e 74      The SHA cont
1220: 65 78 74 20 74 6f 20 75 70 64 61 74 65 2e 0a 20  ext to update.. 
1230: 2a 20 20 20 6d 65 73 73 61 67 65 5f 62 69 74 73  *   message_bits
1240: 3a 20 5b 69 6e 5d 0a 20 2a 20 20 20 20 20 54 68  : [in]. *     Th
1250: 65 20 66 69 6e 61 6c 20 62 69 74 73 20 6f 66 20  e final bits of 
1260: 74 68 65 20 6d 65 73 73 61 67 65 2c 20 69 6e 20  the message, in 
1270: 74 68 65 20 75 70 70 65 72 20 70 6f 72 74 69 6f  the upper portio
1280: 6e 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20  n of the. *     
1290: 62 79 74 65 2e 20 20 28 55 73 65 20 30 62 23 23  byte.  (Use 0b##
12a0: 23 30 30 30 30 30 20 69 6e 73 74 65 61 64 20 6f  #00000 instead o
12b0: 66 20 30 62 30 30 30 30 30 23 23 23 20 74 6f 20  f 0b00000### to 
12c0: 69 6e 70 75 74 20 74 68 65 0a 20 2a 20 20 20 20  input the. *    
12d0: 20 74 68 72 65 65 20 62 69 74 73 20 23 23 23 2e   three bits ###.
12e0: 29 0a 20 2a 20 20 20 6c 65 6e 67 74 68 3a 20 5b  ). *   length: [
12f0: 69 6e 5d 0a 20 2a 20 20 20 20 20 54 68 65 20 6e  in]. *     The n
1300: 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e  umber of bits in
1310: 20 6d 65 73 73 61 67 65 5f 62 69 74 73 2c 20 62   message_bits, b
1320: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 37 2e 0a  etween 1 and 7..
1330: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
1340: 2a 20 20 20 73 68 61 20 45 72 72 6f 72 20 43 6f  *   sha Error Co
1350: 64 65 2e 0a 20 2a 2f 0a 69 6e 74 20 53 48 41 31  de.. */.int SHA1
1360: 46 69 6e 61 6c 42 69 74 73 28 53 48 41 31 43 6f  FinalBits(SHA1Co
1370: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
1380: 75 69 6e 74 38 5f 74 20 6d 65 73 73 61 67 65 5f  uint8_t message_
1390: 62 69 74 73 2c 0a 20 20 20 20 75 6e 73 69 67 6e  bits,.    unsign
13a0: 65 64 20 69 6e 74 20 6c 65 6e 67 74 68 29 0a 7b  ed int length).{
13b0: 0a 20 20 73 74 61 74 69 63 20 75 69 6e 74 38 5f  .  static uint8_
13c0: 74 20 6d 61 73 6b 73 5b 38 5d 20 3d 20 7b 0a 20  t masks[8] = {. 
13d0: 20 20 20 20 20 2f 2a 20 30 20 30 62 30 30 30 30       /* 0 0b0000
13e0: 30 30 30 30 20 2a 2f 20 30 78 30 30 2c 20 2f 2a  0000 */ 0x00, /*
13f0: 20 31 20 30 62 31 30 30 30 30 30 30 30 20 2a 2f   1 0b10000000 */
1400: 20 30 78 38 30 2c 0a 20 20 20 20 20 20 2f 2a 20   0x80,.      /* 
1410: 32 20 30 62 31 31 30 30 30 30 30 30 20 2a 2f 20  2 0b11000000 */ 
1420: 30 78 43 30 2c 20 2f 2a 20 33 20 30 62 31 31 31  0xC0, /* 3 0b111
1430: 30 30 30 30 30 20 2a 2f 20 30 78 45 30 2c 0a 20  00000 */ 0xE0,. 
1440: 20 20 20 20 20 2f 2a 20 34 20 30 62 31 31 31 31       /* 4 0b1111
1450: 30 30 30 30 20 2a 2f 20 30 78 46 30 2c 20 2f 2a  0000 */ 0xF0, /*
1460: 20 35 20 30 62 31 31 31 31 31 30 30 30 20 2a 2f   5 0b11111000 */
1470: 20 30 78 46 38 2c 0a 20 20 20 20 20 20 2f 2a 20   0xF8,.      /* 
1480: 36 20 30 62 31 31 31 31 31 31 30 30 20 2a 2f 20  6 0b11111100 */ 
1490: 30 78 46 43 2c 20 2f 2a 20 37 20 30 62 31 31 31  0xFC, /* 7 0b111
14a0: 31 31 31 31 30 20 2a 2f 20 30 78 46 45 0a 20 20  11110 */ 0xFE.  
14b0: 7d 3b 0a 0a 20 20 73 74 61 74 69 63 20 75 69 6e  };..  static uin
14c0: 74 38 5f 74 20 6d 61 72 6b 62 69 74 5b 38 5d 20  t8_t markbit[8] 
14d0: 3d 20 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 30  = {.      /* 0 0
14e0: 62 31 30 30 30 30 30 30 30 20 2a 2f 20 30 78 38  b10000000 */ 0x8
14f0: 30 2c 20 2f 2a 20 31 20 30 62 30 31 30 30 30 30  0, /* 1 0b010000
1500: 30 30 20 2a 2f 20 30 78 34 30 2c 0a 20 20 20 20  00 */ 0x40,.    
1510: 20 20 2f 2a 20 32 20 30 62 30 30 31 30 30 30 30    /* 2 0b0010000
1520: 30 20 2a 2f 20 30 78 32 30 2c 20 2f 2a 20 33 20  0 */ 0x20, /* 3 
1530: 30 62 30 30 30 31 30 30 30 30 20 2a 2f 20 30 78  0b00010000 */ 0x
1540: 31 30 2c 0a 20 20 20 20 20 20 2f 2a 20 34 20 30  10,.      /* 4 0
1550: 62 30 30 30 30 31 30 30 30 20 2a 2f 20 30 78 30  b00001000 */ 0x0
1560: 38 2c 20 2f 2a 20 35 20 30 62 30 30 30 30 30 31  8, /* 5 0b000001
1570: 30 30 20 2a 2f 20 30 78 30 34 2c 0a 20 20 20 20  00 */ 0x04,.    
1580: 20 20 2f 2a 20 36 20 30 62 30 30 30 30 30 30 31    /* 6 0b0000001
1590: 30 20 2a 2f 20 30 78 30 32 2c 20 2f 2a 20 37 20  0 */ 0x02, /* 7 
15a0: 30 62 30 30 30 30 30 30 30 31 20 2a 2f 20 30 78  0b00000001 */ 0x
15b0: 30 31 0a 20 20 7d 3b 0a 0a 20 20 69 66 20 28 21  01.  };..  if (!
15c0: 63 6f 6e 74 65 78 74 29 20 72 65 74 75 72 6e 20  context) return 
15d0: 73 68 61 4e 75 6c 6c 3b 0a 20 20 69 66 20 28 21  shaNull;.  if (!
15e0: 6c 65 6e 67 74 68 29 20 72 65 74 75 72 6e 20 73  length) return s
15f0: 68 61 53 75 63 63 65 73 73 3b 0a 20 20 69 66 20  haSuccess;.  if 
1600: 28 63 6f 6e 74 65 78 74 2d 3e 43 6f 72 72 75 70  (context->Corrup
1610: 74 65 64 29 20 72 65 74 75 72 6e 20 63 6f 6e 74  ted) return cont
1620: 65 78 74 2d 3e 43 6f 72 72 75 70 74 65 64 3b 0a  ext->Corrupted;.
1630: 20 20 69 66 20 28 63 6f 6e 74 65 78 74 2d 3e 43    if (context->C
1640: 6f 6d 70 75 74 65 64 29 20 72 65 74 75 72 6e 20  omputed) return 
1650: 63 6f 6e 74 65 78 74 2d 3e 43 6f 72 72 75 70 74  context->Corrupt
1660: 65 64 20 3d 20 73 68 61 53 74 61 74 65 45 72 72  ed = shaStateErr
1670: 6f 72 3b 0a 20 20 69 66 20 28 6c 65 6e 67 74 68  or;.  if (length
1680: 20 3e 3d 20 38 29 20 72 65 74 75 72 6e 20 63 6f   >= 8) return co
1690: 6e 74 65 78 74 2d 3e 43 6f 72 72 75 70 74 65 64  ntext->Corrupted
16a0: 20 3d 20 73 68 61 42 61 64 50 61 72 61 6d 3b 0a   = shaBadParam;.
16b0: 0a 20 20 53 48 41 31 41 64 64 4c 65 6e 67 74 68  .  SHA1AddLength
16c0: 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e 67 74 68  (context, length
16d0: 29 3b 0a 20 20 53 48 41 31 46 69 6e 61 6c 69 7a  );.  SHA1Finaliz
16e0: 65 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 28  e(context,.    (
16f0: 75 69 6e 74 38 5f 74 29 20 28 28 6d 65 73 73 61  uint8_t) ((messa
1700: 67 65 5f 62 69 74 73 20 26 20 6d 61 73 6b 73 5b  ge_bits & masks[
1710: 6c 65 6e 67 74 68 5d 29 20 7c 20 6d 61 72 6b 62  length]) | markb
1720: 69 74 5b 6c 65 6e 67 74 68 5d 29 29 3b 0a 0a 20  it[length]));.. 
1730: 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 78 74 2d   return context-
1740: 3e 43 6f 72 72 75 70 74 65 64 3b 0a 7d 0a 0a 2f  >Corrupted;.}../
1750: 2a 0a 20 2a 20 53 48 41 31 52 65 73 75 6c 74 0a  *. * SHA1Result.
1760: 20 2a 0a 20 2a 20 44 65 73 63 72 69 70 74 69 6f   *. * Descriptio
1770: 6e 3a 0a 20 2a 20 20 20 54 68 69 73 20 66 75 6e  n:. *   This fun
1780: 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72  ction will retur
1790: 6e 20 74 68 65 20 31 36 30 2d 62 69 74 20 6d 65  n the 160-bit me
17a0: 73 73 61 67 65 20 64 69 67 65 73 74 0a 20 2a 20  ssage digest. * 
17b0: 20 20 69 6e 74 6f 20 74 68 65 20 4d 65 73 73 61    into the Messa
17c0: 67 65 5f 44 69 67 65 73 74 20 61 72 72 61 79 20  ge_Digest array 
17d0: 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20  provided by the 
17e0: 63 61 6c 6c 65 72 2e 0a 20 2a 20 20 20 4e 4f 54  caller.. *   NOT
17f0: 45 3a 0a 20 2a 20 20 20 20 54 68 65 20 66 69 72  E:. *    The fir
1800: 73 74 20 6f 63 74 65 74 20 6f 66 20 68 61 73 68  st octet of hash
1810: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
1820: 65 20 65 6c 65 6d 65 6e 74 20 77 69 74 68 20 69  e element with i
1830: 6e 64 65 78 20 30 2c 0a 20 2a 20 20 20 20 20 20  ndex 0,. *      
1840: 74 68 65 20 6c 61 73 74 20 6f 63 74 65 74 20 6f  the last octet o
1850: 66 20 68 61 73 68 20 69 6e 20 74 68 65 20 65 6c  f hash in the el
1860: 65 6d 65 6e 74 20 77 69 74 68 20 69 6e 64 65 78  ement with index
1870: 20 31 39 2e 0a 20 2a 0a 20 2a 20 50 61 72 61 6d   19.. *. * Param
1880: 65 74 65 72 73 3a 0a 20 2a 20 20 20 63 6f 6e 74  eters:. *   cont
1890: 65 78 74 3a 20 5b 69 6e 2f 6f 75 74 5d 0a 20 2a  ext: [in/out]. *
18a0: 20 20 20 20 20 54 68 65 20 63 6f 6e 74 65 78 74       The context
18b0: 20 74 6f 20 75 73 65 20 74 6f 20 63 61 6c 63 75   to use to calcu
18c0: 6c 61 74 65 20 74 68 65 20 53 48 41 2d 31 20 68  late the SHA-1 h
18d0: 61 73 68 2e 0a 20 2a 20 20 20 4d 65 73 73 61 67  ash.. *   Messag
18e0: 65 5f 44 69 67 65 73 74 5b 20 5d 3a 20 5b 6f 75  e_Digest[ ]: [ou
18f0: 74 5d 0a 20 2a 20 20 20 20 20 57 68 65 72 65 20  t]. *     Where 
1900: 74 68 65 20 64 69 67 65 73 74 20 69 73 20 72 65  the digest is re
1910: 74 75 72 6e 65 64 2e 0a 20 2a 0a 20 2a 20 52 65  turned.. *. * Re
1920: 74 75 72 6e 73 3a 0a 20 2a 20 20 20 73 68 61 20  turns:. *   sha 
1930: 45 72 72 6f 72 20 43 6f 64 65 2e 0a 20 2a 0a 20  Error Code.. *. 
1940: 2a 2f 0a 69 6e 74 20 53 48 41 31 52 65 73 75 6c  */.int SHA1Resul
1950: 74 28 53 48 41 31 43 6f 6e 74 65 78 74 20 2a 63  t(SHA1Context *c
1960: 6f 6e 74 65 78 74 2c 0a 20 20 20 20 75 69 6e 74  ontext,.    uint
1970: 38 5f 74 20 4d 65 73 73 61 67 65 5f 44 69 67 65  8_t Message_Dige
1980: 73 74 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d  st[SHA1HashSize]
1990: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ).{.  int i;..  
19a0: 69 66 20 28 21 63 6f 6e 74 65 78 74 29 20 72 65  if (!context) re
19b0: 74 75 72 6e 20 73 68 61 4e 75 6c 6c 3b 0a 20 20  turn shaNull;.  
19c0: 69 66 20 28 21 4d 65 73 73 61 67 65 5f 44 69 67  if (!Message_Dig
19d0: 65 73 74 29 20 72 65 74 75 72 6e 20 73 68 61 4e  est) return shaN
19e0: 75 6c 6c 3b 0a 20 20 69 66 20 28 63 6f 6e 74 65  ull;.  if (conte
19f0: 78 74 2d 3e 43 6f 72 72 75 70 74 65 64 29 20 72  xt->Corrupted) r
1a00: 65 74 75 72 6e 20 63 6f 6e 74 65 78 74 2d 3e 43  eturn context->C
1a10: 6f 72 72 75 70 74 65 64 3b 0a 0a 20 20 69 66 20  orrupted;..  if 
1a20: 28 21 63 6f 6e 74 65 78 74 2d 3e 43 6f 6d 70 75  (!context->Compu
1a30: 74 65 64 29 0a 20 20 20 20 53 48 41 31 46 69 6e  ted).    SHA1Fin
1a40: 61 6c 69 7a 65 28 63 6f 6e 74 65 78 74 2c 20 30  alize(context, 0
1a50: 78 38 30 29 3b 0a 0a 20 20 66 6f 72 20 28 69 20  x80);..  for (i 
1a60: 3d 20 30 3b 20 69 20 3c 20 53 48 41 31 48 61 73  = 0; i < SHA1Has
1a70: 68 53 69 7a 65 3b 20 2b 2b 69 29 0a 20 20 20 20  hSize; ++i).    
1a80: 4d 65 73 73 61 67 65 5f 44 69 67 65 73 74 5b 69  Message_Digest[i
1a90: 5d 20 3d 20 28 75 69 6e 74 38 5f 74 29 20 28 63  ] = (uint8_t) (c
1aa0: 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d 65 64  ontext->Intermed
1ab0: 69 61 74 65 5f 48 61 73 68 5b 69 3e 3e 32 5d 0a  iate_Hash[i>>2].
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae0: 20 20 20 3e 3e 20 28 38 20 2a 20 28 20 33 20 2d     >> (8 * ( 3 -
1af0: 20 28 20 69 20 26 20 30 78 30 33 20 29 20 29 29   ( i & 0x03 ) ))
1b00: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 68 61  );..  return sha
1b10: 53 75 63 63 65 73 73 3b 0a 7d 0a 0a 2f 2a 0a 20  Success;.}../*. 
1b20: 2a 20 53 48 41 31 50 72 6f 63 65 73 73 4d 65 73  * SHA1ProcessMes
1b30: 73 61 67 65 42 6c 6f 63 6b 0a 20 2a 0a 20 2a 20  sageBlock. *. * 
1b40: 44 65 73 63 72 69 70 74 69 6f 6e 3a 0a 20 2a 20  Description:. * 
1b50: 20 20 54 68 69 73 20 68 65 6c 70 65 72 20 66 75    This helper fu
1b60: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 70 72 6f 63  nction will proc
1b70: 65 73 73 20 74 68 65 20 6e 65 78 74 20 35 31 32  ess the next 512
1b80: 20 62 69 74 73 20 6f 66 20 74 68 65 0a 20 2a 20   bits of the. * 
1b90: 20 20 6d 65 73 73 61 67 65 20 73 74 6f 72 65 64    message stored
1ba0: 20 69 6e 20 74 68 65 20 4d 65 73 73 61 67 65 5f   in the Message_
1bb0: 42 6c 6f 63 6b 20 61 72 72 61 79 2e 0a 20 2a 0a  Block array.. *.
1bc0: 20 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 20   * Parameters:. 
1bd0: 2a 20 20 20 63 6f 6e 74 65 78 74 3a 20 5b 69 6e  *   context: [in
1be0: 2f 6f 75 74 5d 0a 20 2a 20 20 20 20 20 54 68 65  /out]. *     The
1bf0: 20 53 48 41 20 63 6f 6e 74 65 78 74 20 74 6f 20   SHA context to 
1c00: 75 70 64 61 74 65 2e 0a 20 2a 0a 20 2a 20 52 65  update.. *. * Re
1c10: 74 75 72 6e 73 3a 0a 20 2a 20 20 20 4e 6f 74 68  turns:. *   Noth
1c20: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 43 6f 6d 6d 65  ing.. *. * Comme
1c30: 6e 74 73 3a 0a 20 2a 20 20 20 4d 61 6e 79 20 6f  nts:. *   Many o
1c40: 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  f the variable n
1c50: 61 6d 65 73 20 69 6e 20 74 68 69 73 20 63 6f 64  ames in this cod
1c60: 65 2c 20 65 73 70 65 63 69 61 6c 6c 79 20 74 68  e, especially th
1c70: 65 0a 20 2a 20 20 20 73 69 6e 67 6c 65 20 63 68  e. *   single ch
1c80: 61 72 61 63 74 65 72 20 6e 61 6d 65 73 2c 20 77  aracter names, w
1c90: 65 72 65 20 75 73 65 64 20 62 65 63 61 75 73 65  ere used because
1ca0: 20 74 68 6f 73 65 20 77 65 72 65 20 74 68 65 0a   those were the.
1cb0: 20 2a 20 20 20 6e 61 6d 65 73 20 75 73 65 64 20   *   names used 
1cc0: 69 6e 20 74 68 65 20 53 65 63 75 72 65 20 48 61  in the Secure Ha
1cd0: 73 68 20 53 74 61 6e 64 61 72 64 2e 0a 20 2a 2f  sh Standard.. */
1ce0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 48 41  .static void SHA
1cf0: 31 50 72 6f 63 65 73 73 4d 65 73 73 61 67 65 42  1ProcessMessageB
1d00: 6c 6f 63 6b 28 53 48 41 31 43 6f 6e 74 65 78 74  lock(SHA1Context
1d10: 20 2a 63 6f 6e 74 65 78 74 29 0a 7b 0a 20 20 2f   *context).{.  /
1d20: 2a 20 43 6f 6e 73 74 61 6e 74 73 20 64 65 66 69  * Constants defi
1d30: 6e 65 64 20 69 6e 20 46 49 50 53 20 31 38 30 2d  ned in FIPS 180-
1d40: 33 2c 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31  3, section 4.2.1
1d50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 69 6e 74   */.  const uint
1d60: 33 32 5f 74 20 4b 5b 34 5d 20 3d 20 7b 0a 20 20  32_t K[4] = {.  
1d70: 20 20 20 20 30 78 35 41 38 32 37 39 39 39 2c 20      0x5A827999, 
1d80: 30 78 36 45 44 39 45 42 41 31 2c 20 30 78 38 46  0x6ED9EBA1, 0x8F
1d90: 31 42 42 43 44 43 2c 20 30 78 43 41 36 32 43 31  1BBCDC, 0xCA62C1
1da0: 44 36 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 20  D6.  };..  int  
1db0: 20 20 20 20 20 20 74 3b 20 20 20 20 20 20 20 20        t;        
1dc0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1dd0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 69 6e 74  ounter */.  uint
1de0: 33 32 5f 74 20 20 20 74 65 6d 70 3b 20 20 20 20  32_t   temp;    
1df0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
1e00: 72 61 72 79 20 77 6f 72 64 20 76 61 6c 75 65 20  rary word value 
1e10: 2a 2f 0a 20 20 75 69 6e 74 33 32 5f 74 20 20 20  */.  uint32_t   
1e20: 57 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20  W[80];          
1e30: 20 2f 2a 20 57 6f 72 64 20 73 65 71 75 65 6e 63   /* Word sequenc
1e40: 65 20 2a 2f 0a 20 20 75 69 6e 74 33 32 5f 74 20  e */.  uint32_t 
1e50: 20 20 41 2c 20 42 2c 20 43 2c 20 44 2c 20 45 3b    A, B, C, D, E;
1e60: 20 20 20 2f 2a 20 57 6f 72 64 20 62 75 66 66 65     /* Word buffe
1e70: 72 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 20 2a  rs */..  /*.   *
1e80: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1e90: 66 69 72 73 74 20 31 36 20 77 6f 72 64 73 20 69  first 16 words i
1ea0: 6e 20 74 68 65 20 61 72 72 61 79 20 57 0a 20 20  n the array W.  
1eb0: 20 2a 2f 0a 20 20 66 6f 72 20 28 74 20 3d 20 30   */.  for (t = 0
1ec0: 3b 20 74 20 3c 20 31 36 3b 20 74 2b 2b 29 20 7b  ; t < 16; t++) {
1ed0: 0a 20 20 20 20 57 5b 74 5d 20 20 3d 20 28 28 75  .    W[t]  = ((u
1ee0: 69 6e 74 33 32 5f 74 29 63 6f 6e 74 65 78 74 2d  int32_t)context-
1ef0: 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 74  >Message_Block[t
1f00: 20 2a 20 34 5d 29 20 3c 3c 20 32 34 3b 0a 20 20   * 4]) << 24;.  
1f10: 20 20 57 5b 74 5d 20 7c 3d 20 28 28 75 69 6e 74    W[t] |= ((uint
1f20: 33 32 5f 74 29 63 6f 6e 74 65 78 74 2d 3e 4d 65  32_t)context->Me
1f30: 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 74 20 2a 20  ssage_Block[t * 
1f40: 34 20 2b 20 31 5d 29 20 3c 3c 20 31 36 3b 0a 20  4 + 1]) << 16;. 
1f50: 20 20 20 57 5b 74 5d 20 7c 3d 20 28 28 75 69 6e     W[t] |= ((uin
1f60: 74 33 32 5f 74 29 63 6f 6e 74 65 78 74 2d 3e 4d  t32_t)context->M
1f70: 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 74 20 2a  essage_Block[t *
1f80: 20 34 20 2b 20 32 5d 29 20 3c 3c 20 38 3b 0a 20   4 + 2]) << 8;. 
1f90: 20 20 20 57 5b 74 5d 20 7c 3d 20 28 28 75 69 6e     W[t] |= ((uin
1fa0: 74 33 32 5f 74 29 63 6f 6e 74 65 78 74 2d 3e 4d  t32_t)context->M
1fb0: 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 74 20 2a  essage_Block[t *
1fc0: 20 34 20 2b 20 33 5d 29 3b 0a 20 20 7d 0a 0a 20   4 + 3]);.  }.. 
1fd0: 20 66 6f 72 20 28 74 20 3d 20 31 36 3b 20 74 20   for (t = 16; t 
1fe0: 3c 20 38 30 3b 20 74 2b 2b 29 0a 20 20 20 20 57  < 80; t++).    W
1ff0: 5b 74 5d 20 3d 20 53 48 41 31 5f 52 4f 54 4c 28  [t] = SHA1_ROTL(
2000: 31 2c 20 57 5b 74 2d 33 5d 20 5e 20 57 5b 74 2d  1, W[t-3] ^ W[t-
2010: 38 5d 20 5e 20 57 5b 74 2d 31 34 5d 20 5e 20 57  8] ^ W[t-14] ^ W
2020: 5b 74 2d 31 36 5d 29 3b 0a 0a 20 20 41 20 3d 20  [t-16]);..  A = 
2030: 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d 65  context->Interme
2040: 64 69 61 74 65 5f 48 61 73 68 5b 30 5d 3b 0a 20  diate_Hash[0];. 
2050: 20 42 20 3d 20 63 6f 6e 74 65 78 74 2d 3e 49 6e   B = context->In
2060: 74 65 72 6d 65 64 69 61 74 65 5f 48 61 73 68 5b  termediate_Hash[
2070: 31 5d 3b 0a 20 20 43 20 3d 20 63 6f 6e 74 65 78  1];.  C = contex
2080: 74 2d 3e 49 6e 74 65 72 6d 65 64 69 61 74 65 5f  t->Intermediate_
2090: 48 61 73 68 5b 32 5d 3b 0a 20 20 44 20 3d 20 63  Hash[2];.  D = c
20a0: 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d 65 64  ontext->Intermed
20b0: 69 61 74 65 5f 48 61 73 68 5b 33 5d 3b 0a 20 20  iate_Hash[3];.  
20c0: 45 20 3d 20 63 6f 6e 74 65 78 74 2d 3e 49 6e 74  E = context->Int
20d0: 65 72 6d 65 64 69 61 74 65 5f 48 61 73 68 5b 34  ermediate_Hash[4
20e0: 5d 3b 0a 0a 20 20 66 6f 72 20 28 74 20 3d 20 30  ];..  for (t = 0
20f0: 3b 20 74 20 3c 20 32 30 3b 20 74 2b 2b 29 20 7b  ; t < 20; t++) {
2100: 0a 20 20 20 20 74 65 6d 70 20 3d 20 53 48 41 31  .    temp = SHA1
2110: 5f 52 4f 54 4c 28 35 2c 41 29 20 2b 20 53 48 41  _ROTL(5,A) + SHA
2120: 5f 43 68 28 42 2c 20 43 2c 20 44 29 20 2b 20 45  _Ch(B, C, D) + E
2130: 20 2b 20 57 5b 74 5d 20 2b 20 4b 5b 30 5d 3b 0a   + W[t] + K[0];.
2140: 20 20 20 20 45 20 3d 20 44 3b 0a 20 20 20 20 44      E = D;.    D
2150: 20 3d 20 43 3b 0a 20 20 20 20 43 20 3d 20 53 48   = C;.    C = SH
2160: 41 31 5f 52 4f 54 4c 28 33 30 2c 42 29 3b 0a 20  A1_ROTL(30,B);. 
2170: 20 20 20 42 20 3d 20 41 3b 0a 20 20 20 20 41 20     B = A;.    A 
2180: 3d 20 74 65 6d 70 3b 0a 20 20 7d 0a 0a 20 20 66  = temp;.  }..  f
2190: 6f 72 20 28 74 20 3d 20 32 30 3b 20 74 20 3c 20  or (t = 20; t < 
21a0: 34 30 3b 20 74 2b 2b 29 20 7b 0a 20 20 20 20 74  40; t++) {.    t
21b0: 65 6d 70 20 3d 20 53 48 41 31 5f 52 4f 54 4c 28  emp = SHA1_ROTL(
21c0: 35 2c 41 29 20 2b 20 53 48 41 5f 50 61 72 69 74  5,A) + SHA_Parit
21d0: 79 28 42 2c 20 43 2c 20 44 29 20 2b 20 45 20 2b  y(B, C, D) + E +
21e0: 20 57 5b 74 5d 20 2b 20 4b 5b 31 5d 3b 0a 20 20   W[t] + K[1];.  
21f0: 20 20 45 20 3d 20 44 3b 0a 20 20 20 20 44 20 3d    E = D;.    D =
2200: 20 43 3b 0a 20 20 20 20 43 20 3d 20 53 48 41 31   C;.    C = SHA1
2210: 5f 52 4f 54 4c 28 33 30 2c 42 29 3b 0a 20 20 20  _ROTL(30,B);.   
2220: 20 42 20 3d 20 41 3b 0a 20 20 20 20 41 20 3d 20   B = A;.    A = 
2230: 74 65 6d 70 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  temp;.  }..  for
2240: 20 28 74 20 3d 20 34 30 3b 20 74 20 3c 20 36 30   (t = 40; t < 60
2250: 3b 20 74 2b 2b 29 20 7b 0a 20 20 20 20 74 65 6d  ; t++) {.    tem
2260: 70 20 3d 20 53 48 41 31 5f 52 4f 54 4c 28 35 2c  p = SHA1_ROTL(5,
2270: 41 29 20 2b 20 53 48 41 5f 4d 61 6a 28 42 2c 20  A) + SHA_Maj(B, 
2280: 43 2c 20 44 29 20 2b 20 45 20 2b 20 57 5b 74 5d  C, D) + E + W[t]
2290: 20 2b 20 4b 5b 32 5d 3b 0a 20 20 20 20 45 20 3d   + K[2];.    E =
22a0: 20 44 3b 0a 20 20 20 20 44 20 3d 20 43 3b 0a 20   D;.    D = C;. 
22b0: 20 20 20 43 20 3d 20 53 48 41 31 5f 52 4f 54 4c     C = SHA1_ROTL
22c0: 28 33 30 2c 42 29 3b 0a 20 20 20 20 42 20 3d 20  (30,B);.    B = 
22d0: 41 3b 0a 20 20 20 20 41 20 3d 20 74 65 6d 70 3b  A;.    A = temp;
22e0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 20 28 74 20 3d  .  }..  for (t =
22f0: 20 36 30 3b 20 74 20 3c 20 38 30 3b 20 74 2b 2b   60; t < 80; t++
2300: 29 20 7b 0a 20 20 20 20 74 65 6d 70 20 3d 20 53  ) {.    temp = S
2310: 48 41 31 5f 52 4f 54 4c 28 35 2c 41 29 20 2b 20  HA1_ROTL(5,A) + 
2320: 53 48 41 5f 50 61 72 69 74 79 28 42 2c 20 43 2c  SHA_Parity(B, C,
2330: 20 44 29 20 2b 20 45 20 2b 20 57 5b 74 5d 20 2b   D) + E + W[t] +
2340: 20 4b 5b 33 5d 3b 0a 20 20 20 20 45 20 3d 20 44   K[3];.    E = D
2350: 3b 0a 20 20 20 20 44 20 3d 20 43 3b 0a 20 20 20  ;.    D = C;.   
2360: 20 43 20 3d 20 53 48 41 31 5f 52 4f 54 4c 28 33   C = SHA1_ROTL(3
2370: 30 2c 42 29 3b 0a 20 20 20 20 42 20 3d 20 41 3b  0,B);.    B = A;
2380: 0a 20 20 20 20 41 20 3d 20 74 65 6d 70 3b 0a 20  .    A = temp;. 
2390: 20 7d 0a 0a 20 20 63 6f 6e 74 65 78 74 2d 3e 49   }..  context->I
23a0: 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61 73 68  ntermediate_Hash
23b0: 5b 30 5d 20 2b 3d 20 41 3b 0a 20 20 63 6f 6e 74  [0] += A;.  cont
23c0: 65 78 74 2d 3e 49 6e 74 65 72 6d 65 64 69 61 74  ext->Intermediat
23d0: 65 5f 48 61 73 68 5b 31 5d 20 2b 3d 20 42 3b 0a  e_Hash[1] += B;.
23e0: 20 20 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72    context->Inter
23f0: 6d 65 64 69 61 74 65 5f 48 61 73 68 5b 32 5d 20  mediate_Hash[2] 
2400: 2b 3d 20 43 3b 0a 20 20 63 6f 6e 74 65 78 74 2d  += C;.  context-
2410: 3e 49 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61  >Intermediate_Ha
2420: 73 68 5b 33 5d 20 2b 3d 20 44 3b 0a 20 20 63 6f  sh[3] += D;.  co
2430: 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d 65 64 69  ntext->Intermedi
2440: 61 74 65 5f 48 61 73 68 5b 34 5d 20 2b 3d 20 45  ate_Hash[4] += E
2450: 3b 0a 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73  ;.  context->Mes
2460: 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78  sage_Block_Index
2470: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53   = 0;.}../*. * S
2480: 48 41 31 46 69 6e 61 6c 69 7a 65 0a 20 2a 0a 20  HA1Finalize. *. 
2490: 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 3a 0a 20  * Description:. 
24a0: 2a 20 20 20 54 68 69 73 20 68 65 6c 70 65 72 20  *   This helper 
24b0: 66 75 6e 63 74 69 6f 6e 20 66 69 6e 69 73 68 65  function finishe
24c0: 73 20 6f 66 66 20 74 68 65 20 64 69 67 65 73 74  s off the digest
24d0: 20 63 61 6c 63 75 6c 61 74 69 6f 6e 73 2e 0a 20   calculations.. 
24e0: 2a 0a 20 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *. * Parameters:
24f0: 0a 20 2a 20 20 20 63 6f 6e 74 65 78 74 3a 20 5b  . *   context: [
2500: 69 6e 2f 6f 75 74 5d 0a 20 2a 20 20 20 20 20 54  in/out]. *     T
2510: 68 65 20 53 48 41 20 63 6f 6e 74 65 78 74 20 74  he SHA context t
2520: 6f 20 75 70 64 61 74 65 2e 0a 20 2a 20 20 20 50  o update.. *   P
2530: 61 64 5f 42 79 74 65 3a 20 5b 69 6e 5d 0a 20 2a  ad_Byte: [in]. *
2540: 20 20 20 20 20 54 68 65 20 6c 61 73 74 20 62 79       The last by
2550: 74 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  te to add to the
2560: 20 6d 65 73 73 61 67 65 20 62 6c 6f 63 6b 20 62   message block b
2570: 65 66 6f 72 65 20 74 68 65 20 30 2d 70 61 64 64  efore the 0-padd
2580: 69 6e 67 0a 20 2a 20 20 20 20 20 61 6e 64 20 6c  ing. *     and l
2590: 65 6e 67 74 68 2e 20 20 54 68 69 73 20 77 69 6c  ength.  This wil
25a0: 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6c 61  l contain the la
25b0: 73 74 20 62 69 74 73 20 6f 66 20 74 68 65 20 6d  st bits of the m
25c0: 65 73 73 61 67 65 0a 20 2a 20 20 20 20 20 66 6f  essage. *     fo
25d0: 6c 6c 6f 77 65 64 20 62 79 20 61 6e 6f 74 68 65  llowed by anothe
25e0: 72 20 73 69 6e 67 6c 65 20 62 69 74 2e 20 20 49  r single bit.  I
25f0: 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
2600: 73 20 61 6e 0a 20 2a 20 20 20 20 20 65 78 61 63  s an. *     exac
2610: 74 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 38 2d  t multiple of 8-
2620: 62 69 74 73 20 6c 6f 6e 67 2c 20 50 61 64 5f 42  bits long, Pad_B
2630: 79 74 65 20 77 69 6c 6c 20 62 65 20 30 78 38 30  yte will be 0x80
2640: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
2650: 0a 20 2a 20 20 20 73 68 61 20 45 72 72 6f 72 20  . *   sha Error 
2660: 43 6f 64 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  Code.. *. */.sta
2670: 74 69 63 20 76 6f 69 64 20 53 48 41 31 46 69 6e  tic void SHA1Fin
2680: 61 6c 69 7a 65 28 53 48 41 31 43 6f 6e 74 65 78  alize(SHA1Contex
2690: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 75 69 6e 74  t *context, uint
26a0: 38 5f 74 20 50 61 64 5f 42 79 74 65 29 0a 7b 0a  8_t Pad_Byte).{.
26b0: 20 20 69 6e 74 20 69 3b 0a 20 20 53 48 41 31 50    int i;.  SHA1P
26c0: 61 64 4d 65 73 73 61 67 65 28 63 6f 6e 74 65 78  adMessage(contex
26d0: 74 2c 20 50 61 64 5f 42 79 74 65 29 3b 0a 20 20  t, Pad_Byte);.  
26e0: 2f 2a 20 6d 65 73 73 61 67 65 20 6d 61 79 20 62  /* message may b
26f0: 65 20 73 65 6e 73 69 74 69 76 65 2c 20 63 6c 65  e sensitive, cle
2700: 61 72 20 69 74 20 6f 75 74 20 2a 2f 0a 20 20 66  ar it out */.  f
2710: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 53  or (i = 0; i < S
2720: 48 41 31 5f 4d 65 73 73 61 67 65 5f 42 6c 6f 63  HA1_Message_Bloc
2730: 6b 5f 53 69 7a 65 3b 20 2b 2b 69 29 0a 20 20 20  k_Size; ++i).   
2740: 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67   context->Messag
2750: 65 5f 42 6c 6f 63 6b 5b 69 5d 20 3d 20 30 3b 0a  e_Block[i] = 0;.
2760: 20 20 63 6f 6e 74 65 78 74 2d 3e 4c 65 6e 67 74    context->Lengt
2770: 68 5f 48 69 67 68 20 3d 20 30 3b 20 20 20 20 20  h_High = 0;     
2780: 2f 2a 20 61 6e 64 20 63 6c 65 61 72 20 6c 65 6e  /* and clear len
2790: 67 74 68 20 2a 2f 0a 20 20 63 6f 6e 74 65 78 74  gth */.  context
27a0: 2d 3e 4c 65 6e 67 74 68 5f 4c 6f 77 20 3d 20 30  ->Length_Low = 0
27b0: 3b 0a 20 20 63 6f 6e 74 65 78 74 2d 3e 43 6f 6d  ;.  context->Com
27c0: 70 75 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  puted = 1;.}../*
27d0: 0a 20 2a 20 53 48 41 31 50 61 64 4d 65 73 73 61  . * SHA1PadMessa
27e0: 67 65 0a 20 2a 0a 20 2a 20 44 65 73 63 72 69 70  ge. *. * Descrip
27f0: 74 69 6f 6e 3a 0a 20 2a 20 20 20 41 63 63 6f 72  tion:. *   Accor
2800: 64 69 6e 67 20 74 6f 20 74 68 65 20 73 74 61 6e  ding to the stan
2810: 64 61 72 64 2c 20 74 68 65 20 6d 65 73 73 61 67  dard, the messag
2820: 65 20 6d 75 73 74 20 62 65 20 70 61 64 64 65 64  e must be padded
2830: 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 20 2a 20   to the next. * 
2840: 20 20 65 76 65 6e 20 6d 75 6c 74 69 70 6c 65 20    even multiple 
2850: 6f 66 20 35 31 32 20 62 69 74 73 2e 20 20 54 68  of 512 bits.  Th
2860: 65 20 66 69 72 73 74 20 70 61 64 64 69 6e 67 20  e first padding 
2870: 62 69 74 20 6d 75 73 74 20 62 65 20 61 20 27 31  bit must be a '1
2880: 27 2e 0a 20 2a 20 20 20 54 68 65 20 6c 61 73 74  '.. *   The last
2890: 20 36 34 20 62 69 74 73 20 72 65 70 72 65 73 65   64 bits represe
28a0: 6e 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  nt the length of
28b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 65   the original me
28c0: 73 73 61 67 65 2e 0a 20 2a 20 20 20 41 6c 6c 20  ssage.. *   All 
28d0: 62 69 74 73 20 69 6e 20 62 65 74 77 65 65 6e 20  bits in between 
28e0: 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68  should be 0.  Th
28f0: 69 73 20 68 65 6c 70 65 72 20 66 75 6e 63 74 69  is helper functi
2900: 6f 6e 20 77 69 6c 6c 20 70 61 64 0a 20 2a 20 20  on will pad. *  
2910: 20 74 68 65 20 6d 65 73 73 61 67 65 20 61 63 63   the message acc
2920: 6f 72 64 69 6e 67 20 74 6f 20 74 68 6f 73 65 20  ording to those 
2930: 72 75 6c 65 73 20 62 79 20 66 69 6c 6c 69 6e 67  rules by filling
2940: 20 74 68 65 20 4d 65 73 73 61 67 65 5f 42 6c 6f   the Message_Blo
2950: 63 6b 0a 20 2a 20 20 20 61 72 72 61 79 20 61 63  ck. *   array ac
2960: 63 6f 72 64 69 6e 67 6c 79 2e 20 20 57 68 65 6e  cordingly.  When
2970: 20 69 74 20 72 65 74 75 72 6e 73 2c 20 69 74 20   it returns, it 
2980: 63 61 6e 20 62 65 20 61 73 73 75 6d 65 64 20 74  can be assumed t
2990: 68 61 74 20 74 68 65 0a 20 2a 20 20 20 6d 65 73  hat the. *   mes
29a0: 73 61 67 65 20 64 69 67 65 73 74 20 68 61 73 20  sage digest has 
29b0: 62 65 65 6e 20 63 6f 6d 70 75 74 65 64 2e 0a 20  been computed.. 
29c0: 2a 0a 20 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *. * Parameters:
29d0: 0a 20 2a 20 20 20 63 6f 6e 74 65 78 74 3a 20 5b  . *   context: [
29e0: 69 6e 2f 6f 75 74 5d 0a 20 2a 20 20 20 20 20 54  in/out]. *     T
29f0: 68 65 20 63 6f 6e 74 65 78 74 20 74 6f 20 70 61  he context to pa
2a00: 64 2e 0a 20 2a 20 20 20 50 61 64 5f 42 79 74 65  d.. *   Pad_Byte
2a10: 3a 20 5b 69 6e 5d 0a 20 2a 20 20 20 20 20 54 68  : [in]. *     Th
2a20: 65 20 6c 61 73 74 20 62 79 74 65 20 74 6f 20 61  e last byte to a
2a30: 64 64 20 74 6f 20 74 68 65 20 6d 65 73 73 61 67  dd to the messag
2a40: 65 20 62 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74  e block before t
2a50: 68 65 20 30 2d 70 61 64 64 69 6e 67 0a 20 2a 20  he 0-padding. * 
2a60: 20 20 20 20 61 6e 64 20 6c 65 6e 67 74 68 2e 20      and length. 
2a70: 20 54 68 69 73 20 77 69 6c 6c 20 63 6f 6e 74 61   This will conta
2a80: 69 6e 20 74 68 65 20 6c 61 73 74 20 62 69 74 73  in the last bits
2a90: 20 6f 66 20 74 68 65 20 6d 65 73 73 61 67 65 0a   of the message.
2aa0: 20 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 65 64 20   *     followed 
2ab0: 62 79 20 61 6e 6f 74 68 65 72 20 73 69 6e 67 6c  by another singl
2ac0: 65 20 62 69 74 2e 20 20 49 66 20 74 68 65 20 6d  e bit.  If the m
2ad0: 65 73 73 61 67 65 20 77 61 73 20 61 6e 0a 20 2a  essage was an. *
2ae0: 20 20 20 20 20 65 78 61 63 74 20 6d 75 6c 74 69       exact multi
2af0: 70 6c 65 20 6f 66 20 38 2d 62 69 74 73 20 6c 6f  ple of 8-bits lo
2b00: 6e 67 2c 20 50 61 64 5f 42 79 74 65 20 77 69 6c  ng, Pad_Byte wil
2b10: 6c 20 62 65 20 30 78 38 30 2e 0a 20 2a 0a 20 2a  l be 0x80.. *. *
2b20: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 20 20 20 4e   Returns:. *   N
2b30: 6f 74 68 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74  othing.. */.stat
2b40: 69 63 20 76 6f 69 64 20 53 48 41 31 50 61 64 4d  ic void SHA1PadM
2b50: 65 73 73 61 67 65 28 53 48 41 31 43 6f 6e 74 65  essage(SHA1Conte
2b60: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 75 69 6e  xt *context, uin
2b70: 74 38 5f 74 20 50 61 64 5f 42 79 74 65 29 0a 7b  t8_t Pad_Byte).{
2b80: 0a 20 20 2f 2a 0a 20 20 20 2a 20 43 68 65 63 6b  .  /*.   * Check
2b90: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
2ba0: 75 72 72 65 6e 74 20 6d 65 73 73 61 67 65 20 62  urrent message b
2bb0: 6c 6f 63 6b 20 69 73 20 74 6f 6f 20 73 6d 61 6c  lock is too smal
2bc0: 6c 20 74 6f 20 68 6f 6c 64 0a 20 20 20 2a 20 74  l to hold.   * t
2bd0: 68 65 20 69 6e 69 74 69 61 6c 20 70 61 64 64 69  he initial paddi
2be0: 6e 67 20 62 69 74 73 20 61 6e 64 20 6c 65 6e 67  ng bits and leng
2bf0: 74 68 2e 20 20 49 66 20 73 6f 2c 20 77 65 20 77  th.  If so, we w
2c00: 69 6c 6c 20 70 61 64 20 74 68 65 0a 20 20 20 2a  ill pad the.   *
2c10: 20 62 6c 6f 63 6b 2c 20 70 72 6f 63 65 73 73 20   block, process 
2c20: 69 74 2c 20 61 6e 64 20 74 68 65 6e 20 63 6f 6e  it, and then con
2c30: 74 69 6e 75 65 20 70 61 64 64 69 6e 67 20 69 6e  tinue padding in
2c40: 74 6f 20 61 20 73 65 63 6f 6e 64 0a 20 20 20 2a  to a second.   *
2c50: 20 62 6c 6f 63 6b 2e 0a 20 20 20 2a 2f 0a 20 20   block..   */.  
2c60: 69 66 20 28 63 6f 6e 74 65 78 74 2d 3e 4d 65 73  if (context->Mes
2c70: 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78  sage_Block_Index
2c80: 20 3e 3d 20 28 53 48 41 31 5f 4d 65 73 73 61 67   >= (SHA1_Messag
2c90: 65 5f 42 6c 6f 63 6b 5f 53 69 7a 65 20 2d 20 38  e_Block_Size - 8
2ca0: 29 29 20 7b 0a 20 20 20 20 63 6f 6e 74 65 78 74  )) {.    context
2cb0: 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5b  ->Message_Block[
2cc0: 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67 65  context->Message
2cd0: 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 2b 2b 5d 20  _Block_Index++] 
2ce0: 3d 20 50 61 64 5f 42 79 74 65 3b 0a 20 20 20 20  = Pad_Byte;.    
2cf0: 77 68 69 6c 65 20 28 63 6f 6e 74 65 78 74 2d 3e  while (context->
2d00: 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 6e  Message_Block_In
2d10: 64 65 78 20 3c 20 53 48 41 31 5f 4d 65 73 73 61  dex < SHA1_Messa
2d20: 67 65 5f 42 6c 6f 63 6b 5f 53 69 7a 65 29 0a 20  ge_Block_Size). 
2d30: 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65       context->Me
2d40: 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 63 6f 6e 74  ssage_Block[cont
2d50: 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f  ext->Message_Blo
2d60: 63 6b 5f 49 6e 64 65 78 2b 2b 5d 20 3d 20 30 3b  ck_Index++] = 0;
2d70: 0a 0a 20 20 20 20 53 48 41 31 50 72 6f 63 65 73  ..    SHA1Proces
2d80: 73 4d 65 73 73 61 67 65 42 6c 6f 63 6b 28 63 6f  sMessageBlock(co
2d90: 6e 74 65 78 74 29 3b 0a 20 20 7d 20 65 6c 73 65  ntext);.  } else
2da0: 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65  .    context->Me
2db0: 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 63 6f 6e 74  ssage_Block[cont
2dc0: 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f  ext->Message_Blo
2dd0: 63 6b 5f 49 6e 64 65 78 2b 2b 5d 20 3d 20 50 61  ck_Index++] = Pa
2de0: 64 5f 42 79 74 65 3b 0a 0a 20 20 77 68 69 6c 65  d_Byte;..  while
2df0: 20 28 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61   (context->Messa
2e00: 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 20 3c  ge_Block_Index <
2e10: 20 28 53 48 41 31 5f 4d 65 73 73 61 67 65 5f 42   (SHA1_Message_B
2e20: 6c 6f 63 6b 5f 53 69 7a 65 20 2d 20 38 29 29 0a  lock_Size - 8)).
2e30: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73      context->Mes
2e40: 73 61 67 65 5f 42 6c 6f 63 6b 5b 63 6f 6e 74 65  sage_Block[conte
2e50: 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63  xt->Message_Bloc
2e60: 6b 5f 49 6e 64 65 78 2b 2b 5d 20 3d 20 30 3b 0a  k_Index++] = 0;.
2e70: 0a 20 20 2f 2a 0a 20 20 20 2a 20 53 74 6f 72 65  .  /*.   * Store
2e80: 20 74 68 65 20 6d 65 73 73 61 67 65 20 6c 65 6e   the message len
2e90: 67 74 68 20 61 73 20 74 68 65 20 6c 61 73 74 20  gth as the last 
2ea0: 38 20 6f 63 74 65 74 73 0a 20 20 20 2a 2f 0a 20  8 octets.   */. 
2eb0: 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67   context->Messag
2ec0: 65 5f 42 6c 6f 63 6b 5b 35 36 5d 20 3d 20 28 75  e_Block[56] = (u
2ed0: 69 6e 74 38 5f 74 29 20 28 63 6f 6e 74 65 78 74  int8_t) (context
2ee0: 2d 3e 4c 65 6e 67 74 68 5f 48 69 67 68 20 3e 3e  ->Length_High >>
2ef0: 20 32 34 29 3b 0a 20 20 63 6f 6e 74 65 78 74 2d   24);.  context-
2f00: 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 35  >Message_Block[5
2f10: 37 5d 20 3d 20 28 75 69 6e 74 38 5f 74 29 20 28  7] = (uint8_t) (
2f20: 63 6f 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 5f  context->Length_
2f30: 48 69 67 68 20 3e 3e 20 31 36 29 3b 0a 20 20 63  High >> 16);.  c
2f40: 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f  ontext->Message_
2f50: 42 6c 6f 63 6b 5b 35 38 5d 20 3d 20 28 75 69 6e  Block[58] = (uin
2f60: 74 38 5f 74 29 20 28 63 6f 6e 74 65 78 74 2d 3e  t8_t) (context->
2f70: 4c 65 6e 67 74 68 5f 48 69 67 68 20 3e 3e 20 38  Length_High >> 8
2f80: 29 3b 0a 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65  );.  context->Me
2f90: 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 35 39 5d 20  ssage_Block[59] 
2fa0: 3d 20 28 75 69 6e 74 38 5f 74 29 20 28 63 6f 6e  = (uint8_t) (con
2fb0: 74 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 48 69 67  text->Length_Hig
2fc0: 68 29 3b 0a 20 20 63 6f 6e 74 65 78 74 2d 3e 4d  h);.  context->M
2fd0: 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 36 30 5d  essage_Block[60]
2fe0: 20 3d 20 28 75 69 6e 74 38 5f 74 29 20 28 63 6f   = (uint8_t) (co
2ff0: 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f  ntext->Length_Lo
3000: 77 20 3e 3e 20 32 34 29 3b 0a 20 20 63 6f 6e 74  w >> 24);.  cont
3010: 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f  ext->Message_Blo
3020: 63 6b 5b 36 31 5d 20 3d 20 28 75 69 6e 74 38 5f  ck[61] = (uint8_
3030: 74 29 20 28 63 6f 6e 74 65 78 74 2d 3e 4c 65 6e  t) (context->Len
3040: 67 74 68 5f 4c 6f 77 20 3e 3e 20 31 36 29 3b 0a  gth_Low >> 16);.
3050: 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61    context->Messa
3060: 67 65 5f 42 6c 6f 63 6b 5b 36 32 5d 20 3d 20 28  ge_Block[62] = (
3070: 75 69 6e 74 38 5f 74 29 20 28 63 6f 6e 74 65 78  uint8_t) (contex
3080: 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f 77 20 3e 3e  t->Length_Low >>
3090: 20 38 29 3b 0a 20 20 63 6f 6e 74 65 78 74 2d 3e   8);.  context->
30a0: 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 36 33  Message_Block[63
30b0: 5d 20 3d 20 28 75 69 6e 74 38 5f 74 29 20 28 63  ] = (uint8_t) (c
30c0: 6f 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 4c  ontext->Length_L
30d0: 6f 77 29 3b 0a 0a 20 20 53 48 41 31 50 72 6f 63  ow);..  SHA1Proc
30e0: 65 73 73 4d 65 73 73 61 67 65 42 6c 6f 63 6b 28  essMessageBlock(
30f0: 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a           context);.}..