(root)/
util-linux-2.39/
lib/
sha1.c
       1  /*
       2   * SHA-1 in C by Steve Reid <steve@edmweb.com>
       3   * 100% Public Domain
       4   *
       5   * Test Vectors (from FIPS PUB 180-1)
       6   * 1) "abc": A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
       7   * 2) "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq":  84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
       8   * 3) A million repetitions of "a":  34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
       9   */
      10  
      11  #define UL_SHA1HANDSOFF
      12  
      13  #include <stdio.h>
      14  #include <string.h>
      15  #include <stdint.h>
      16  
      17  #include "sha1.h"
      18  
      19  #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
      20  
      21  /* blk0() and blk() perform the initial expand. */
      22  #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
      23  # define blk0(i) block->l[i]
      24  #else
      25  # define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
      26      |(rol(block->l[i],8)&0x00FF00FF))
      27  #endif
      28  
      29  #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
      30      ^block->l[(i+2)&15]^block->l[i&15],1))
      31  
      32  /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
      33  #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
      34  #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
      35  #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
      36  #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
      37  #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
      38  
      39  /* Hash a single 512-bit block. This is the core of the algorithm. */
      40  
      41  void ul_SHA1Transform(uint32_t state[5], const unsigned char buffer[64])
      42  {
      43  	uint32_t a, b, c, d, e;
      44  
      45  	typedef union {
      46  		unsigned char c[64];
      47  		uint32_t l[16];
      48  	} CHAR64LONG16;
      49  
      50  #ifdef UL_SHA1HANDSOFF
      51  	CHAR64LONG16 block[1];	/* use array to appear as a pointer */
      52  
      53  	memcpy(block, buffer, 64);
      54  #else
      55  	/* The following had better never be used because it causes the
      56  	 * pointer-to-const buffer to be cast into a pointer to non-const.
      57  	 * And the result is written through.  I threw a "const" in, hoping
      58  	 * this will cause a diagnostic.
      59  	 */
      60  	CHAR64LONG16 *block = (const CHAR64LONG16 *)buffer;
      61  #endif
      62  	/* Copy context->state[] to working vars */
      63  	a = state[0];
      64  	b = state[1];
      65  	c = state[2];
      66  	d = state[3];
      67  	e = state[4];
      68  	/* 4 rounds of 20 operations each. Loop unrolled. */
      69  	R0(a, b, c, d, e, 0);
      70  	R0(e, a, b, c, d, 1);
      71  	R0(d, e, a, b, c, 2);
      72  	R0(c, d, e, a, b, 3);
      73  	R0(b, c, d, e, a, 4);
      74  	R0(a, b, c, d, e, 5);
      75  	R0(e, a, b, c, d, 6);
      76  	R0(d, e, a, b, c, 7);
      77  	R0(c, d, e, a, b, 8);
      78  	R0(b, c, d, e, a, 9);
      79  	R0(a, b, c, d, e, 10);
      80  	R0(e, a, b, c, d, 11);
      81  	R0(d, e, a, b, c, 12);
      82  	R0(c, d, e, a, b, 13);
      83  	R0(b, c, d, e, a, 14);
      84  	R0(a, b, c, d, e, 15);
      85  	R1(e, a, b, c, d, 16);
      86  	R1(d, e, a, b, c, 17);
      87  	R1(c, d, e, a, b, 18);
      88  	R1(b, c, d, e, a, 19);
      89  	R2(a, b, c, d, e, 20);
      90  	R2(e, a, b, c, d, 21);
      91  	R2(d, e, a, b, c, 22);
      92  	R2(c, d, e, a, b, 23);
      93  	R2(b, c, d, e, a, 24);
      94  	R2(a, b, c, d, e, 25);
      95  	R2(e, a, b, c, d, 26);
      96  	R2(d, e, a, b, c, 27);
      97  	R2(c, d, e, a, b, 28);
      98  	R2(b, c, d, e, a, 29);
      99  	R2(a, b, c, d, e, 30);
     100  	R2(e, a, b, c, d, 31);
     101  	R2(d, e, a, b, c, 32);
     102  	R2(c, d, e, a, b, 33);
     103  	R2(b, c, d, e, a, 34);
     104  	R2(a, b, c, d, e, 35);
     105  	R2(e, a, b, c, d, 36);
     106  	R2(d, e, a, b, c, 37);
     107  	R2(c, d, e, a, b, 38);
     108  	R2(b, c, d, e, a, 39);
     109  	R3(a, b, c, d, e, 40);
     110  	R3(e, a, b, c, d, 41);
     111  	R3(d, e, a, b, c, 42);
     112  	R3(c, d, e, a, b, 43);
     113  	R3(b, c, d, e, a, 44);
     114  	R3(a, b, c, d, e, 45);
     115  	R3(e, a, b, c, d, 46);
     116  	R3(d, e, a, b, c, 47);
     117  	R3(c, d, e, a, b, 48);
     118  	R3(b, c, d, e, a, 49);
     119  	R3(a, b, c, d, e, 50);
     120  	R3(e, a, b, c, d, 51);
     121  	R3(d, e, a, b, c, 52);
     122  	R3(c, d, e, a, b, 53);
     123  	R3(b, c, d, e, a, 54);
     124  	R3(a, b, c, d, e, 55);
     125  	R3(e, a, b, c, d, 56);
     126  	R3(d, e, a, b, c, 57);
     127  	R3(c, d, e, a, b, 58);
     128  	R3(b, c, d, e, a, 59);
     129  	R4(a, b, c, d, e, 60);
     130  	R4(e, a, b, c, d, 61);
     131  	R4(d, e, a, b, c, 62);
     132  	R4(c, d, e, a, b, 63);
     133  	R4(b, c, d, e, a, 64);
     134  	R4(a, b, c, d, e, 65);
     135  	R4(e, a, b, c, d, 66);
     136  	R4(d, e, a, b, c, 67);
     137  	R4(c, d, e, a, b, 68);
     138  	R4(b, c, d, e, a, 69);
     139  	R4(a, b, c, d, e, 70);
     140  	R4(e, a, b, c, d, 71);
     141  	R4(d, e, a, b, c, 72);
     142  	R4(c, d, e, a, b, 73);
     143  	R4(b, c, d, e, a, 74);
     144  	R4(a, b, c, d, e, 75);
     145  	R4(e, a, b, c, d, 76);
     146  	R4(d, e, a, b, c, 77);
     147  	R4(c, d, e, a, b, 78);
     148  	R4(b, c, d, e, a, 79);
     149  	/* Add the working vars back into context.state[] */
     150  	state[0] += a;
     151  	state[1] += b;
     152  	state[2] += c;
     153  	state[3] += d;
     154  	state[4] += e;
     155  	/* Wipe variables */
     156  	a = b = c = d = e = 0;
     157  #ifdef UL_SHA1HANDSOFF
     158  	memset(block, '\0', sizeof(block));
     159  #endif
     160  }
     161  
     162  /* SHA1Init - Initialize new context */
     163  
     164  void ul_SHA1Init(UL_SHA1_CTX *context)
     165  {
     166  	/* SHA1 initialization constants */
     167  	context->state[0] = 0x67452301;
     168  	context->state[1] = 0xEFCDAB89;
     169  	context->state[2] = 0x98BADCFE;
     170  	context->state[3] = 0x10325476;
     171  	context->state[4] = 0xC3D2E1F0;
     172  	context->count[0] = context->count[1] = 0;
     173  }
     174  
     175  /* Run your data through this. */
     176  
     177  void ul_SHA1Update(UL_SHA1_CTX *context, const unsigned char *data, uint32_t len)
     178  {
     179  	uint32_t i;
     180  
     181  	uint32_t j;
     182  
     183  	j = context->count[0];
     184  	if ((context->count[0] += len << 3) < j)
     185  		context->count[1]++;
     186  	context->count[1] += (len >> 29);
     187  	j = (j >> 3) & 63;
     188  	if ((j + len) > 63) {
     189  		memcpy(&context->buffer[j], data, (i = 64 - j));
     190  		ul_SHA1Transform(context->state, context->buffer);
     191  		for (; i + 63 < len; i += 64) {
     192  			ul_SHA1Transform(context->state, &data[i]);
     193  		}
     194  		j = 0;
     195  	} else
     196  		i = 0;
     197  	memcpy(&context->buffer[j], &data[i], len - i);
     198  }
     199  
     200  /* Add padding and return the message digest. */
     201  
     202  void ul_SHA1Final(unsigned char digest[20], UL_SHA1_CTX *context)
     203  {
     204  	unsigned i;
     205  
     206  	unsigned char finalcount[8];
     207  
     208  	unsigned char c;
     209  
     210  #if 0				/* untested "improvement" by DHR */
     211  	/* Convert context->count to a sequence of bytes
     212  	 * in finalcount.  Second element first, but
     213  	 * big-endian order within element.
     214  	 * But we do it all backwards.
     215  	 */
     216  	unsigned char *fcp = &finalcount[8];
     217  
     218  	for (i = 0; i < 2; i++) {
     219  		uint32_t t = context->count[i];
     220  
     221  		int j;
     222  
     223  		for (j = 0; j < 4; t >>= 8, j++)
     224  			*--fcp = (unsigned char)t}
     225  #else
     226  	for (i = 0; i < 8; i++) {
     227  		finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8)) & 255);	/* Endian independent */
     228  	}
     229  #endif
     230  	c = 0200;
     231  	ul_SHA1Update(context, &c, 1);
     232  	while ((context->count[0] & 504) != 448) {
     233  		c = 0000;
     234  		ul_SHA1Update(context, &c, 1);
     235  	}
     236  	ul_SHA1Update(context, finalcount, 8);	/* Should cause a SHA1Transform() */
     237  	for (i = 0; i < 20; i++) {
     238  		digest[i] = (unsigned char)
     239  		    ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
     240  	}
     241  	/* Wipe variables */
     242  	memset(context, '\0', sizeof(*context));
     243  	memset(&finalcount, '\0', sizeof(finalcount));
     244  }
     245  
     246  void ul_SHA1(char *hash_out, const char *str, unsigned len)
     247  {
     248  	UL_SHA1_CTX ctx;
     249  	unsigned int ii;
     250  
     251  	ul_SHA1Init(&ctx);
     252  	for (ii = 0; ii < len; ii += 1)
     253  		ul_SHA1Update(&ctx, (const unsigned char *)str + ii, 1);
     254  	ul_SHA1Final((unsigned char *)hash_out, &ctx);
     255  	hash_out[20] = '\0';
     256  }