点击(此处)折叠或打开
-
/******************************************************************************
-
*
-
* Copyright (C) 2012 kelo.yang
-
*
-
* Permission to use, copy, modify, and distribute this software and its
-
* documentation under the terms of the GNU General Public License is hereby
-
* granted. No representations are made about the suitability of this software
-
* for any purpose. It is provided "as is" without express or implied warranty.
-
* See the GNU General Public License for more details.
-
*
-
*/
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
-
#if defined(__WIN32__) || defined(_WIN32)
-
typedef unsigned long __u32;
-
typedef unsigned char __u8;
-
-
#else
-
typedef unsigned int __u32;
-
typedef unsigned char __u8;
-
#endif
-
-
typedef struct {
-
__u32 state[5];
-
__u32 count[2];
-
__u8 buffer[64];
-
} SHA1_CTX;
-
-
#if defined(rol)
-
#undef rol
-
#endif
-
-
#define SHA1HANDSOFF
-
-
#ifndef SHA_DIGESTSIZE
-
#define SHA_DIGESTSIZE 20
-
#endif
-
-
#ifndef SHA_BLOCKSIZE
-
#define SHA_BLOCKSIZE 64
-
#endif
-
-
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
-
-
/* blk0() and blk() perform the initial expand. */
-
/* I got the idea of expanding during the round function from SSLeay */
-
#ifndef ___LITTLE_ENDIAN
-
#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
-
|(rol(block->l[i],8)&0x00FF00FF))
-
#else
-
#define blk0(i) block->l[i]
-
#endif
-
#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
-
^block->l[(i+2)&15]^block->l[i&15],1))
-
-
/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
-
#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
-
#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
-
#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
-
#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
-
#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
-
-
-
#define DBG printf
-
-
//-----------------------------------------------------------------------------------------------
-
-
/* Hash a single 512-bit block. This is the core of the algorithm. */
-
void SHA1Transform(__u32 state[5], __u8 buffer[64])
-
{
-
__u32 a, b, c, d, e;
-
typedef union {
-
unsigned char c[64];
-
__u32 l[16];
-
} CHAR64LONG16;
-
-
CHAR64LONG16* block;
-
-
#ifdef SHA1HANDSOFF
-
static unsigned char workspace[64];
-
block = (CHAR64LONG16*)workspace;
-
//NdisMoveMemory(block, buffer, 64);
-
memcpy(block, buffer, 64);
-
-
#else
-
block = (CHAR64LONG16*)buffer;
-
#endif
-
/* Copy context->state[] to working vars */
-
a = state[0];
-
b = state[1];
-
c = state[2];
-
d = state[3];
-
e = state[4];
-
/* 4 rounds of 20 operations each. Loop unrolled. */
-
R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
-
R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
-
R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
-
R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
-
R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
-
R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
-
R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
-
R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
-
R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
-
R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
-
R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
-
R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
-
R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
-
R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
-
R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
-
R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
-
R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
-
R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
-
R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
-
R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
-
/* Add the working vars back into context.state[] */
-
state[0] += a;
-
state[1] += b;
-
state[2] += c;
-
state[3] += d;
-
state[4] += e;
-
/* Wipe variables */
-
a = b = c = d = e = 0;
-
}
-
-
/* SHA1Init - Initialize new context */
-
void SHA1Init(SHA1_CTX* context)
-
{
-
/* SHA1 initialization constants */
-
context->state[0] = 0x67452301;
-
context->state[1] = 0xEFCDAB89;
-
context->state[2] = 0x98BADCFE;
-
context->state[3] = 0x10325476;
-
context->state[4] = 0xC3D2E1F0;
-
context->count[0] = context->count[1] = 0;
-
}
-
-
/* Run your data through this. */
-
void SHA1Update(SHA1_CTX* context, unsigned char* data, __u32 len)
-
{
-
__u32 i, j;
-
-
j = context->count[0];
-
if ((context->count[0] += len << 3) < j)
-
context->count[1]++;
-
context->count[1] += (len>>29);
-
j = (j >> 3) & 63;
-
if ((j + len) > 63) {
-
//NdisMoveMemory(&context->buffer[j], data, (i = 64-j));
-
memcpy(&context->buffer[j], data, (i = 64-j));
-
SHA1Transform(context->state, context->buffer);
-
for ( ; i + 63 < len; i += 64) {
-
SHA1Transform(context->state, &data[i]);
-
}
-
j = 0;
-
}
-
else i = 0;
-
//NdisMoveMemory(&context->buffer[j], &data[i], len - i);
-
memcpy(&context->buffer[j], &data[i], len - i);
-
}
-
-
/* Add padding and return the message digest. */
-
void SHA1Final(unsigned char digest[20], SHA1_CTX* context)
-
{
-
__u32 i, j;
-
unsigned char finalcount[8];
-
-
for (i = 0; i < 8; i++) {
-
finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
-
>> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */
-
}
-
SHA1Update(context, (unsigned char *)"\200", 1);
-
while ((context->count[0] & 504) != 448) {
-
SHA1Update(context, (unsigned char *)"\0", 1);
-
}
-
SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */
-
for (i = 0; i < 20; i++) {
-
digest[i] = (unsigned char)
-
((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
-
}
-
i = j = 0;
-
memset(context->buffer, 0x00, 64);
-
memset(context->state, 0x00, 20);
-
memset(context->count, 0x00, 8);
-
memset(&finalcount, 0x00, 8);
-
-
#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite its own static vars */
-
SHA1Transform(context->state, context->buffer);
-
#endif
-
}
-
-
void truncate(char* d1, char* d2, int len)
-
{
-
int i ;
-
for (i = 0 ; i < len ; i++) d2[i] = d1[i];
-
}
-
-
/* Function to compute the digest */
-
void hmac_sha(const char *k, const char *d, char *out)
-
{
-
int lk = strlen(k);
-
int ld = strlen(d);
-
-
SHA1_CTX ictx, octx ;
-
char isha[SHA_DIGESTSIZE], osha[SHA_DIGESTSIZE] ;
-
char key[SHA_DIGESTSIZE] ;
-
char buf[SHA_BLOCKSIZE] ;
-
int i , j;
-
char str[100];
-
-
DBG("lk = %d, ld = %d\n", lk, ld);
-
if (lk > SHA_BLOCKSIZE) {
-
SHA1_CTX tctx ;
-
SHA1Init(&tctx) ;
-
SHA1Update(&tctx, (unsigned char* )k, lk) ;
-
SHA1Final((unsigned char *)key, &tctx) ;
-
-
k = key ;
-
lk = SHA_DIGESTSIZE ;
-
}
-
-
/**** Inner Digest ****/
-
SHA1Init(&ictx) ;
-
-
/* Pad the key for inner digest */
-
for (i = 0 ; i < lk ; ++i) buf[i] = k[i] ^ 0x36 ;
-
for (i = lk ; i < SHA_BLOCKSIZE ; ++i) buf[i] = 0x36 ;
-
-
//SHA1Update(&ictx, buf, SHA_BLOCKSIZE) ;
-
SHA1Update(&ictx, (unsigned char *)buf, SHA_BLOCKSIZE) ;
-
SHA1Update(&ictx, (unsigned char *)d, ld) ;
-
SHA1Final((unsigned char *)isha, &ictx) ;
-
-
j = 0;
-
for (i=0; i<SHA_DIGESTSIZE; i++) {
-
j += sprintf(str+j, "%02X", (unsigned char)isha[i]);
-
}
-
DBG("hmac_sha: isha = %s\n", str);
-
-
/**** Outter Digest ****/
-
SHA1Init(&octx) ;
-
-
/* Pad the key for outter digest */
-
for (i = 0 ; i < lk ; ++i) buf[i] = k[i] ^ 0x5C ;
-
for (i = lk ; i < SHA_BLOCKSIZE ; ++i) buf[i] = 0x5C ;
-
-
//SHA1Update(&octx, buf, SHA_BLOCKSIZE) ;
-
//SHA1Update(&octx, isha, SHA_DIGESTSIZE) ;
-
//SHA1Final(osha, &octx) ;
-
SHA1Update(&octx, (unsigned char *)buf, SHA_BLOCKSIZE) ;
-
SHA1Update(&octx, (unsigned char *)isha, SHA_DIGESTSIZE) ;
-
SHA1Final((unsigned char *)osha, &octx) ;
-
-
j = 0;
-
for (i=0; i<SHA_DIGESTSIZE; i++) {
-
j += sprintf(str+j, "%02X", (unsigned char)osha[i]);
-
}
-
DBG("hmac_sha: osha = %s\n", str);
-
-
truncate(osha, out, SHA_DIGESTSIZE);
-
j = 0;
-
for (i=0; i<SHA_DIGESTSIZE; i++) {
-
j += sprintf(str+j, "%02X", (unsigned char)out[i]);
-
}
-
DBG("hmac_sha: ret = %s\n", str);
- }
点击(此处)折叠或打开
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
-
#include "hmacSha1.h"
-
-
#define HMAC_SHA1_OUT_LEN 21
-
-
int main(int agrc, char *argv[])
-
{
-
int i, j, len;
-
char str_tmp[100];
-
-
//---- hmac_sha1,
-
char *access_key = "E1y1RIxovXBM3riJ28fhhUU6auL7Ok";
-
//char access_key_len = strlen(access_key);
-
char *string_to_sign = "1234567890";
-
//char string_to_sign_len = strlen(string_to_sign);
-
char *hmac_sha1_out = (char *)malloc(sizeof(char) * HMAC_SHA1_OUT_LEN);
-
-
memset(hmac_sha1_out, 0, sizeof(hmac_sha1_out));
-
memset(str_tmp, 0, sizeof(str_tmp));
-
hmac_sha(access_key, string_to_sign, hmac_sha1_out);
-
j = 0;
-
len = strlen(hmac_sha1_out);
-
for (i=0; i<len; i++) {
-
j += sprintf(str_tmp +j, "%02X", (unsigned char)hmac_sha1_out[i]);
-
}
-
printf("hmac_sha : len = %d, %s\n", strlen(hmac_sha1_out), str_tmp); //len = 20, BB86B7E01129ABB02826D69BC285B39771762759
-
-
free(hmac_sha1_out);
-
//---- hmac_sha1 End
-
-
return 1;
- }
#Makefile:
点击(此处)折叠或打开
-
OPENWRT = 0
-
-
ifeq ($(OPENWRT), 1)
-
CC = ~/OpenWrt-SDK-ar71xx-for-linux-i486-gcc-4.6-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gcc
-
-
else
-
CC = gcc
-
endif
-
-
CFLAGS += -Wall -O2
-
#CFLAGS += -g
-
-
#可执行文件名和相关的obj文件
-
APP_BINARY = hello
-
OBJ = hmac_sha1.o hmacSha1.o
-
-
all: APP_FILE
-
-
%.o: %.c
-
$(CC) $(CFLAGS) -c -o $@ $<
-
-
#单独编译的文件部分放在此
-
APP_FILE: $(OBJ)
-
$(CC) $(CFLAGS) $(OBJ) -o $(APP_BINARY) $(LFLAGS)
-
-
clean:
-
@echo "cleanning project"
-
$(RM) *.a *.o *~ *.so *.lo $(APP_BINARY)
-
@echo "clean completed"
-
- .PHONY: clean
1. 虚拟机, 运行结果如下
xxg@xxg-desktop:~/1-wire/hmac_sha1$ ./hello
lk = 30, ld = 10
hmac_sha: isha = 1C09351EBE14071F3EBD455E687C0182C69BD4BE
hmac_sha: osha = BB86B7E01129ABB02826D69BC285B39771762759
hmac_sha: ret = BB86B7E01129ABB02826D69BC285B39771762759
hmac_sha : len = 20, BB86B7E01129ABB02826D69BC285B39771762759
root@OpenWrt:/xutest# chmod +x hello
root@OpenWrt:/xutest# ./hello
lk = 30, ld = 10
hmac_sha: isha = 0BB90C8EA6E0E18D1EBD8EAFF173BABAA4596860
hmac_sha: osha = DAE4FD3CC9B58CBE23BABCCE5B62C14880FECEEB
hmac_sha: ret = DAE4FD3CC9B58CBE23BABCCE5B62C14880FECEEB
hmac_sha : len = 20, DAE4FD3CC9B58CBE23BABCCE5B62C14880FECEEB
解决: Makefile修改如下
点击(此处)折叠或打开
-
OPENWRT = 0
-
-
ifeq ($(OPENWRT), 1)
-
CC = ~/OpenWrt-SDK-ar71xx-for-linux-i486-gcc-4.6-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gcc
-
DEFS = -D___LITTLE_ENDIAN
-
else
-
CC = gcc
-
endif
-
-
CFLAGS += -Wall -O2 $(DEFS)
- #CFLAGS += -g