version 1.3, 2004/05/16 15:02:39 |
version 1.4, 2004/06/20 10:59:01 |
|
|
/* $OpenXM: OpenXM/src/ox_ntl/crypt/sha1/sha1.c,v 1.2 2004/03/25 13:34:19 iwane Exp $ */ |
/* $OpenXM: OpenXM/src/ox_ntl/crypt/sha1/sha1.c,v 1.3 2004/05/16 15:02:39 iwane Exp $ */ |
/* RFC 3174 - SHA-1 (US Secure Hash Algorithm 1 (SHA1))*/ |
/* RFC 3174 - SHA-1 (US Secure Hash Algorithm 1 (SHA1))*/ |
|
|
#include <stdio.h> |
#include <stdio.h> |
|
|
#include "sha1.h" |
#include "sha1.h" |
|
|
|
#include <unistd.h> |
|
#include <errno.h> |
|
#include <sys/stat.h> |
|
|
/* Global Constant */ |
/* Global Constant */ |
static const unsigned int K[4] = {0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6}; |
static const uint32_t K[4] = {0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6}; |
static const unsigned int H[5] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0}; |
static const uint32_t H[5] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0}; |
|
|
#define BLOCK (512 / 8) |
#define BLOCK (512 / 8) |
|
|
|
|
static inline unsigned int lshift32(unsigned int x, int n) |
static inline uint32_t lshift32(uint32_t x, int n) |
{ |
{ |
return ((x << n) | (x >> (32 - n))); |
return ((x << n) | (x >> (32 - n))); |
}; |
}; |
Line 23 static inline unsigned int lshift32(unsigned int x, in |
|
Line 27 static inline unsigned int lshift32(unsigned int x, in |
|
* sizeof(buf) >= 512 * ((len * 8 + 1) / 64) |
* sizeof(buf) >= 512 * ((len * 8 + 1) / 64) |
* len * 8 < 2^64 ==> len < 2^61 |
* len * 8 < 2^64 ==> len < 2^61 |
*/ |
*/ |
static unsigned int |
static uint32_t |
padding(unsigned char *buf, const unsigned char *msg, int length) |
padding(unsigned char *buf, const unsigned char *msg, size_t length) |
{ |
{ |
int n; |
int n; |
int i; |
int i; |
int len = length % BLOCK; |
size_t len = length % BLOCK; |
|
|
if (len == 0) |
|
len = BLOCK; |
|
|
|
memcpy(buf, msg, len); |
memcpy(buf, msg, len); |
|
|
buf[len++] = 0x80; |
buf[len++] = 0x80; |
Line 61 padding(unsigned char *buf, const unsigned char *msg, |
|
Line 62 padding(unsigned char *buf, const unsigned char *msg, |
|
|
|
|
|
|
|
static unsigned int |
static uint32_t |
f(unsigned int t, unsigned int b, unsigned int c, unsigned int d) |
f(uint32_t t, uint32_t b, uint32_t c, uint32_t d) |
{ |
{ |
if (t < 20) { |
if (t < 20) { |
return ((b & c) | ((~b) & d)); |
return ((b & c) | ((~b) & d)); |
Line 84 f(unsigned int t, unsigned int b, unsigned int c, unsi |
|
Line 85 f(unsigned int t, unsigned int b, unsigned int c, unsi |
|
* padding. |
* padding. |
*/ |
*/ |
void |
void |
sha1_md(unsigned int *h, const unsigned char *msg) |
sha1_md(uint32_t *h, const unsigned char *msg) |
{ |
{ |
int t; |
int t; |
unsigned int a, b, c, d, e, temp; |
|
int i; |
int i; |
unsigned int w[80]; |
|
|
|
|
uint32_t a, b, c, d, e, temp; |
|
uint32_t w[80]; |
|
|
/* ... */ |
/* ... */ |
for (t = 0; t < 16; t++) { |
for (t = 0; t < 16; t++) { |
w[t] = 0; |
w[t] = 0; |
Line 126 sha1_md(unsigned int *h, const unsigned char *msg) |
|
Line 128 sha1_md(unsigned int *h, const unsigned char *msg) |
|
} |
} |
|
|
int |
int |
sha1_h(unsigned char *Ph, const unsigned char *msg, int len, const unsigned int *hp) |
sha1_h(unsigned char *Ph, const unsigned char *msg, size_t len, const uint32_t *hp) |
{ |
{ |
int i, j, cnt, l = len; |
int i, j, cnt; |
|
size_t l = len; |
unsigned char buf[1024]; |
unsigned char buf[1024]; |
unsigned int h[sizeof(H) / sizeof(H[0])]; |
uint32_t h[sizeof(H) / sizeof(H[0])]; |
|
|
if (hp == NULL) |
if (hp == NULL) |
memcpy(h, H, sizeof(H)); |
memcpy(h, H, sizeof(H)); |
else |
else |
memcpy(h, hp, sizeof(h)); |
memcpy(h, hp, sizeof(h)); |
|
|
while (l > BLOCK) { |
while (l >= BLOCK) { |
sha1_md(h, msg); |
sha1_md(h, msg); |
msg += BLOCK; |
msg += BLOCK; |
l -= BLOCK; |
l -= BLOCK; |
Line 160 sha1_h(unsigned char *Ph, const unsigned char *msg, in |
|
Line 163 sha1_h(unsigned char *Ph, const unsigned char *msg, in |
|
|
|
|
|
int |
int |
sha1(unsigned char *Ph, const unsigned char *msg, int len) |
sha1(unsigned char *Ph, const unsigned char *msg, size_t len) |
{ |
{ |
return (sha1_h(Ph, msg, len, NULL)); |
return (sha1_h(Ph, msg, len, NULL)); |
} |
} |
|
|
|
|
#ifdef SHA_DEBUG |
|
/* debug */ |
|
#include <stdio.h> |
|
|
|
int |
int |
main() |
fsha1_h(unsigned char *Ph, int fd, const uint32_t *hp) |
{ |
{ |
char *a; |
int i, j, cnt, ret; |
int m, i; |
size_t l; |
unsigned char h[32 * 5]; |
off_t len; |
char b[10000000]; |
unsigned char buf[1024], *msg, msgbuf[1024]; |
|
uint32_t h[sizeof(H) / sizeof(H[0])]; |
|
int pad = 0; |
|
struct stat stbuf; |
|
|
for (i = 0; i < 1000000; i++) |
if (hp == NULL) |
b[i] = 'a'; |
memcpy(h, H, sizeof(H)); |
b[i] = '\0'; |
else |
|
memcpy(h, hp, sizeof(h)); |
|
|
a = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; |
ret = fstat(fd, &stbuf); |
a = b; |
len = stbuf.st_size; |
a = "abc"; |
if (len == 0) |
|
goto _PADDING; |
|
|
m = sha1(h, a, strlen(a)); |
for (;;) { |
|
l = read(fd, msgbuf, sizeof(msgbuf)); |
|
if (l < 0) { |
|
return (errno); |
|
} |
|
if (l == 0) |
|
break; |
|
|
for (i = 0; i < 160 / 8; i++) { |
len -= l; |
printf("%02x", h[i] & 0xff); |
msg = msgbuf; |
if (i % 4 == 3) |
|
printf(" "); |
while (l >= BLOCK) { |
|
sha1_md(h, msg); |
|
msg += BLOCK; |
|
l -= BLOCK; |
|
} |
|
|
|
if (len == 0) { |
|
_PADDING: |
|
cnt = padding(buf, msg, stbuf.st_size); |
|
for (i = 0; i < cnt; i++) { |
|
sha1_md(h, buf + BLOCK * i); |
|
} |
|
} |
} |
} |
printf("\n"); |
|
|
|
|
|
|
memset(Ph, 0x00, sizeof(H)); |
|
for (i = 0; i < sizeof(H) / sizeof(H[0]); i++) { |
|
for (j = 0; j < 32; j++) { |
|
Ph[4 * i + j / 8] |= ((h[i] >> (31 - j)) & 1) << (7 - j % 8); |
|
} |
|
} |
|
|
return (0); |
return (0); |
} |
} |
|
|
#endif |
|
|
|
|
int |
|
fsha1(unsigned char *Ph, int fd) |
|
{ |
|
return (fsha1_h(Ph, fd, NULL)); |
|
} |
|
|