R/hmac.R

Defines functions makeRaw makeRaw.raw makeRaw.character makeRaw.digest makeRaw.default padWithZeros hmac

Documented in hmac

# $Id: hmac.R 62 2013-02-06 15:32:59Z hannes $

makeRaw <- function(object)
  ## generic function, converts an object to a raw
  UseMethod('makeRaw')

makeRaw.raw <- function(object) object

makeRaw.character <- function(object) charToRaw(object)

# splits a hex-string into the values it contains.
makeRaw.digest <- function(x) {
  parts <- sapply(seq(1, nchar(x), 2),
                  function(i) { substr(x, i, i + 1) })
  as.raw(as.hexmode(parts))
}

makeRaw.default <- function(object) as.raw(object)

# key shall be padded if its length is smaller than the block size of the 
# respective algorithm, hashed if longer. block sizes are as follows:
#
# md5		64
# sha1		64
# crc32	 	??
# sha256 	64
# sha512	128 (doh!)

padWithZeros <- function(k,algo) {
  blocksize <- 64 
  if (algo == "sha512") blocksize <- 128
  k <- makeRaw(k)
  if(length(k) > blocksize) # not while() 
    k <-digest(k, algo=algo, serialize=FALSE,raw=TRUE)
  makeRaw(c(k, rep(0, blocksize - length(k))))
}

hmac <- function(key, object, algo=c("md5", "sha1", "crc32", "sha256", "sha512"), serialize=FALSE, raw=FALSE, ...) {
  padded.key <- padWithZeros(key,algo)
  i.xored.key <- xor(padded.key, makeRaw(0x36))
  character.digest <- digest(c(i.xored.key, makeRaw(object)), algo=algo, serialize=serialize, ...)
  raw.digest <- makeRaw.digest(character.digest)
  o.xored.key <- xor(padded.key, makeRaw(0x5c))
  result <- digest(c(o.xored.key, raw.digest), algo=algo, serialize=serialize, ...)
  if(raw)
    result <- makeRaw.digest(result)
  return(result)
}

Try the digest package in your browser

Any scripts or data that you put into this service are public.

digest documentation built on May 2, 2019, 6:03 p.m.