Skip to content

Instantly share code, notes, and snippets.

@jmcastagnetto
Last active August 29, 2015 14:12
Show Gist options
  • Save jmcastagnetto/2253d846af1c60f5c0da to your computer and use it in GitHub Desktop.
Save jmcastagnetto/2253d846af1c60f5c0da to your computer and use it in GitHub Desktop.
A simple and naive example of using the NIST Randomness Beacon in R (https://beacon.nist.gov/home)
require(RCurl)
require(XML)
# Let's make a special class
NISTBeaconResponse <- function (ts) {
if(!is.integer(ts) &
!inherits(ts, "POSIXct") &
!inherits(ts, "POSIXlt")) {
stop("We expected a unix timestamp as an integer or a POSIXct or POSIXlt value")
}
tsval <- ifelse(inherits(ts, "POSIXct") | inherits(ts, "POSIXlt"),
as.integer(ts), ts)
url <- paste0("https://beacon.nist.gov/rest/record/", tsval)
headers <- basicTextGatherer() # might be a good idea to use this to check the HTTP status code
response <- getURL(url, headerfunction=headers$update)
# use the following line instead, if you get cert validation errors
# response <- getURL(url, .opts = list(ssl.verifypeer = FALSE), headerfunction=headers$update)
beacon <- structure(as.data.frame(xmlToList(xmlParse(response, asText=TRUE))),
class="NISTBeaconResponse")
beacon$frequency <- as.integer(beacon$frequency)
beacon$timeStamp <- as.integer(beacon$timeStamp)
beacon$statusCode <- as.integer(beacon$statusCode)
beacon
}
# and a way to print it
print.NISTBeaconResponse <- function(response) {
if(!inherits(response, "NISTBeaconResponse")) {
stop("An object of type NISTBeaconResponse was expected")
}
breakline <- function(longline) {
lines <- gsub('(.{1,50})', '\\1\n', longline)
lines <- gsub('\n', '\n\t\t\t', lines, fixed=TRUE)
lines
}
output <- "\tNIST Randomness Beacon Response\n\t===============================\n\n"
output <- paste0(output, "\t* version:\t", response$version, "\n")
output <- paste0(output, "\t* frequency:\t", response$frequency, " seconds\n")
output <- paste0(output, "\t* seed:\t\t", breakline(response$seedValue), "\n")
output <- paste0(output, "\t* status:\t", response$statusCode, "\n")
output <- paste0(output, "\t* timestamp:\t", as.POSIXct(response$timeStamp, origin="1970-01-01"),
" (", response$timeStamp,")\n")
output <- paste0(output, "\t* output:\t", breakline(response$outputValue), "\n")
output <- paste0(output, "\t* prev value:\t", breakline(response$previousOutputValue), "\n")
output <- paste0(output, "\t* signature:\t", breakline(response$signatureValue), "\n")
cat(output)
}
# test the code
ts <- Sys.time()
beacon <- NISTBeaconResponse(ts)
print(beacon)
@timothyslau
Copy link

When I run this I get the error:

Error in function (type, msg, asError = TRUE) : SSL certificate problem: unable to get local issuer certificate Called from: function (type, msg, asError = TRUE) { if (!is.character(type)) { i = match(type, CURLcodeValues) typeName = if (is.na(i)) character() else names(CURLcodeValues)[i] } typeName = gsub("^CURLE_", "", typeName) fun = (if (asError) stop else warning) fun(structure(list(message = msg, call = sys.call()), class = c(typeName, "GenericCurlError", "error", "condition"))) }(60L, "SSL certificate problem: unable to get local issuer certificate", TRUE) Browse[1]> print(beacon) Error during wrapup: object 'beacon' not found Browse[1]>

@jmcastagnetto
Copy link
Author

Check your RCurl or curl configuration. The error message seems to originate with a problem related to the trusted certs. The solution described in http://stackoverflow.com/questions/17411313/ssl-verification-causes-rcurl-and-httr-to-break-on-a-website-that-should-be-le might help you.

On Ubuntu 12.04 LTS and 14.04 LTS (64-bit, both) which is what I use, could not reproduce your error.

@jmcastagnetto
Copy link
Author

For those that for unknown reasons do not have the local certs needed to validate the HTTPS connection to NIST, try replacing line #15 above with:

    response <- getURL(url, .opts = list(ssl.verifypeer = FALSE), headerfunction=headers$update)

Note: Updated the gist with a comment to include this modification

@timothyslau
Copy link

Here's the link to that site's certificate:
https://beacon.nist.gov/certificate/beacon.cer

It could probably be explicitly added to the function somehow.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment