Larry D'Agostino
2010-Oct-19 18:08 UTC
[R] R script help needed for RFC 2104 HMAC algorithm
I'm trying to create an R script that will execute the HMAC algorithm for
key-hashing messages. My hope is to use this script for some web
authentication via R.
The algorithm is found at http://www.ietf.org/rfc/rfc2104.txt
Here is some example code that I have done that does not work for HMAC-MD5.
I'm a big confused by the algorithm since I don't have a very good
working
knowledge of digests or hex strings. I would really appreciate some
assistance if anyone can take a look at this code and offer advice.
The RFC website does offer C code to execute the HMAC algorithm but I am not
a C expert.
################ HMAC Code #############
library(digest)
########## hex to binary
hexdat <- replicate(10,
paste(format.hexmode(sample(16,4)-1),collapse=''))
bin <- apply(outer(0:15,3:0,function(x,y)
x%/%(2^y)%%2),1,paste,collapse="")
names(bin) <- format.hexmode( 0:15 )
## test
## cbind( hexdat, sapply( strsplit(hexdat,'') , function(x) paste(
bin[x],
collapse='' ) ) )
########## binary to hex
hex <- names(bin)
names(hex) <- bin
############ Test HMAC_MD5 ####################
### B=64
### L=16
#key <- "0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"
##key_len = 16 bytes
data <- "Hi There"
##data_len = 8 bytes
## digest = "0x9294727a3638bb1c13f48ef8158bfc9d"
ipad <- rep("36",64)
opad <- rep("5c",64)
k <- rep("0b", 16)
zeros <- rep("00",48)
K <- c(k, zeros)
K_bin <- cbind(K, sapply( strsplit(K,'') , function(x) paste( bin[x],
collapse='' ) ) )
ipad_bin <- cbind(ipad, sapply( strsplit(ipad,'') , function(x)
paste(
bin[x], collapse='' ) ) )
#cbind(K_bin, sapply( strsplit(K_bin[,2],'') , as.numeric) )
K_binnum <- sapply( strsplit(K_bin[,2],'') , as.numeric)
ipad_binnum <- sapply( strsplit(ipad_bin[,2],'') , as.numeric)
InnerXOR <- as.numeric(xor(K_binnum, ipad_binnum))
InnerXOR <- matrix(InnerXOR, 4, 128)
InnerXOR <- t(InnerXOR)
InnerXORbin <- apply(InnerXOR, 1, paste, collapse='')
InnerXORhex <- cbind(InnerXORbin, sapply(InnerXORbin, function(x)
paste(hex[x], collapse='') ))
InnerXORhex <- t(matrix(InnerXORhex[,2],2,64))
InnerXORhex <- apply(InnerXORhex, 1, paste, collapse='')
dataHex <- charToRaw(data)
cmb <- c(InnerXORhex, dataHex)
cmb <- paste(cmb, collapse='')
InnerHash <- digest(cmb, algo="md5")
opad_bin <- cbind(opad, sapply( strsplit(opad,'') , function(x)
paste(
bin[x], collapse='' ) ) )
opad_binnum <- sapply( strsplit(opad_bin[,2],'') , as.numeric)
OuterXOR <- as.numeric(xor(K_binnum, opad_binnum))
OuterXOR <- matrix(OuterXOR, 4, 128)
OuterXOR <- t(OuterXOR)
OuterXORbin <- apply(OuterXOR, 1, paste, collapse='')
OuterXORhex <- cbind(OuterXORbin, sapply(OuterXORbin, function(x)
paste(hex[x], collapse='') ))
OuterXORhex <- t(matrix(OuterXORhex[,2],2,64))
OuterXORhex <- apply(OuterXORhex, 1, paste, collapse='')
OuterXORhex <- paste(OuterXORhex, collapse='')
outercmb <- paste(OuterXORhex, InnerHash, sep="")
HMAC_MD5 <- digest(outercmb, algo="md5") ######## should equal
the digest
example above
[[alternative HTML version deleted]]