require("tools")

## -- MD5 test vectors
## RFC 1321 A.5:
stopifnot(identical(md5sum(bytes=raw()),
  "d41d8cd98f00b204e9800998ecf8427e"))
stopifnot(identical(md5sum(bytes=charToRaw("a")),
  "0cc175b9c0f1b6a831c399e269772661"))
stopifnot(identical(md5sum(bytes=charToRaw("abc")),
    "900150983cd24fb0d6963f7d28e17f72"))
## not official, but the FIPS180-2 vectors
stopifnot(identical(md5sum(bytes=rep(charToRaw("a"),1e6)),
  "7707d6ae4e027c70eea2a935c2296f21"))
stopifnot(identical(md5sum(bytes=charToRaw("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq")),
  "8215ef0796a20bcaaae116d3876c664a"))

## -- SHA256 test vectors
stopifnot(identical(sha256sum(bytes=raw()),
  "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"))

## FIPS180-2 Appendix B.3 test vectors
stopifnot(identical(sha256sum(bytes=charToRaw("abc")),
  "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"))
stopifnot(identical(sha256sum(bytes=charToRaw("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq")),
  "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"))
stopifnot(identical(sha256sum(bytes=rep(charToRaw("a"),1e6)),
  "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0"))

## let's see if there are hidden HMAC functions - if so, test them
if (!is.null(environment(tools::sha256sum)[["hmac"]])) { 

## [[ we have not exported HMAC functions yet ]]
hmac.md5 <- tools:::hmac.md5
hmac.sha256 <- tools:::hmac.sha256

## -- HMAC test vectors
## RFC 2202 HMAC-MD5
stopifnot(identical(hmac.md5(rep(as.raw(0xb),16), charToRaw("Hi There")),
  "9294727a3638bb1c13f48ef8158bfc9d"))
stopifnot(identical(hmac.md5(charToRaw("Jefe"), charToRaw("what do ya want for nothing?")),
  "750c783e6ab0b503eaa86e310a5db738"))
stopifnot(identical(hmac.md5(rep(as.raw(0xaa),16), rep(as.raw(0xdd), 50)),
  "56be34521d144c88dbb8c733f0e8b3f6"))
## skipping test_case = 4,5
stopifnot(identical(hmac.md5(rep(as.raw(0xaa),80), charToRaw("Test Using Larger Than Block-Size Key - Hash Key First")),
  "6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd"))
stopifnot(identical(hmac.md5(rep(as.raw(0xaa),80), charToRaw("Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data")),
  "6f630fad67cda0ee1fb1f562db3aa53e"))

## RFC 4231 HMAC-SHA256
stopifnot(identical(hmac.sha256(rep(as.raw(0xb),20), charToRaw("Hi There")),
  "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"))
stopifnot(identical(hmac.sha256(charToRaw("Jefe"), charToRaw("what do ya want for nothing?")),
  "5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843"))
stopifnot(identical(hmac.sha256(rep(as.raw(0xaa),20), rep(as.raw(0xdd), 50)),
  "773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe"))
## skipping test_case = 4,5 (we don't truncate - left to the user)
stopifnot(identical(hmac.sha256(rep(as.raw(0xaa),131), charToRaw("Test Using Larger Than Block-Size Key - Hash Key First")),
  "60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54"))
stopifnot(identical(hmac.sha256(rep(as.raw(0xaa),131),
  charToRaw("This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.")),
  "9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2"))

}
