Click here to Skip to main content
12,509,228 members (54,997 online)
Click here to Skip to main content
Add your own
alternative version

Stats

64.8K views
2.7K downloads
20 bookmarked
Posted

C++ Class Implementation of HMAC-SHA

, 2 May 2010 CPOL
Rate this:
Please Sign up or sign in to vote.
C++ class of HMAC-SHA1

Introduction

This is my first article on CodeProject. Sorry for my poor English.

The reason I think it might be helpful that I share this HMAC-SHA1 class is because I found no related source I could refer to. This is a simple C++ class of HMAC-SHA1 with only single byte character support. You could add double bytes character support if needed. You will find this class contains only a function HMAC_SHA1 that accept test input and hash key, then generates a digest.

Background

Thanks to Dominik Reichl, the SHA1 class I wrapped is from his amazing class. I simply implemented the HMAC algorithm on it. For MD5, you could refer to RFC. There is a detailed programming flow of it.

Using the Code

The usage of this class is extremely simple. Declare CHMAC_SHA1, call its HMAC_SHA1 function. That's it!

You may use HMAC-SHA1 in RFC 2202 test case to verify your implementation.

Following is test case 1 in RFC 2202.

#include "HMAC_SHA1.h"
 
BYTE Key[20] ;
BYTE digest[20] ; 

unsigned char *test = "Hi There" ; 
memset(Key, 0x0b, 20) ;
CHMAC_SHA1 HMAC_SHA1 ;
HMAC_SHA1.HMAC_SHA1(test, strlen(test), Key, sizeof(Key), digest) ;
 
// Check with digest equal to 0xb617318655057264e28bc0b6fb378c8ef146be00
// or not

History

  • 2007/12/17: Updated sample code with RFC 2202 test case 1

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Chien-Chung, Chung
Software Developer (Senior)
Taiwan Taiwan
Life is nothing but choices.

You may also be interested in...

Pro
Pro

Comments and Discussions

 
QuestionUnicode or Multi-Byte Matters? Pin
Member 1207894322-Oct-15 17:21
memberMember 1207894322-Oct-15 17:21 
Questionfeedback Pin
Member 120473359-Oct-15 21:48
memberMember 120473359-Oct-15 21:48 
GeneralMy vote of 5 Pin
nicklin026-Mar-13 3:57
membernicklin026-Mar-13 3:57 
QuestionCode Segfaults with messages longer than buffersize minus digestsize Pin
Member 932791917-Sep-12 6:16
memberMember 932791917-Sep-12 6:16 
QuestionIs the digest same as the one computed by C# code ? Pin
BeckDai12-Apr-12 17:55
memberBeckDai12-Apr-12 17:55 
AnswerRe: Is the digest same as the one computed by C# code ? Pin
Chien-Chung, Chung7-May-12 22:49
memberChien-Chung, Chung7-May-12 22:49 
Questionthe result is not right Pin
haolifengwang1-Jan-12 18:49
memberhaolifengwang1-Jan-12 18:49 
AnswerRe: the result is not right Pin
Chien-Chung, Chung7-May-12 22:47
memberChien-Chung, Chung7-May-12 22:47 
Generalhelp me Pin
kalyan41927-Aug-09 18:41
memberkalyan41927-Aug-09 18:41 
QuestionError message Pin
Godwin Ansa5-Aug-08 3:05
memberGodwin Ansa5-Aug-08 3:05 
AnswerRe: Error message Pin
Chien-Chung, Chung2-May-10 16:38
memberChien-Chung, Chung2-May-10 16:38 
Generalmemset used wrongly Pin
Dante Shamest21-Jul-08 21:06
memberDante Shamest21-Jul-08 21:06 
GeneralRe: memset used wrongly Pin
hetcorp1-Apr-09 4:41
memberhetcorp1-Apr-09 4:41 
GeneralRe: memset used wrongly Pin
Jim Chung2-May-10 16:10
memberJim Chung2-May-10 16:10 
Questionreceiver processing for HMAC-SHA? Pin
Adam Harding3-Jun-08 12:49
memberAdam Harding3-Jun-08 12:49 
GeneralBugfix for long key's [modified] Pin
bruno19996-Mar-08 3:31
memberbruno19996-Mar-08 3:31 
GeneralThanks Pin
bruno19995-Mar-08 9:37
memberbruno19995-Mar-08 9:37 
GeneralRe: Thanks Pin
Godwin Ansa27-Aug-08 3:01
memberGodwin Ansa27-Aug-08 3:01 
hi Bruno1999,

Can u offer some advice here on how to use the HMAC implementation.
I tried using it by got some error messages which I posted for help.


I used the following test data:

int main()
{
BYTE Key[20] ;
BYTE digest[20] ;
char *test = "Hi There";
unsigned char* y;
y = (unsigned char) test;
memset(Key, 0x0b, 20 ) ;
CHMAC_SHA1 HMAC_SHA1 ;
HMAC_SHA1.HMAC_SHA1(y, sizeof(y), Key, sizeof(Key), digest) ;

cout << "Digest: " << digest << endl;
}

Error encountered on the following lines:

CSHA1::Update((UNIT_8 *)key, key_len);

CSHA1::Update((UNIT_8 *)AppendBuf1, sizeof(m_ipad) + text_len);

CSHA1::Update((UNIT_8 *)AppendBuf2, sizeof(m_opad) + SHA1_DIGEST_LENGTH);

Error: undefined reference to 'CSHA1::Update(unsigned char*, unsigned long)'


I will be grateful to hear from you.

Godwin.

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.160927.1 | Last Updated 2 May 2010
Article Copyright 2007 by Chien-Chung, Chung
Everything else Copyright © CodeProject, 1999-2016
Layout: fixed | fluid