#include "strerr.h"
#include "cookie.h"
#include "now.h"
#include "scan.h"
#include "fmt.h"
#include "str.h"
#include "byte.h"
#include "env.h"

#include "secret.h"

static const char* fatal = "sendok-check: fatal: ";

char secret[SECRET_MAX];
int secret_len;
const char* sender;
const char* hash; 

static void die_usage() {
  strerr_die2x(100,fatal,"usage: sendok-check secret cookie");
}

static void die_trash() {
  strerr_die2x(100,fatal,"cookie doesn't check out");
}

static void doit() {
  unsigned long u;
  char strnum[FMT_ULONG];
  char verify[COOKIE];

  hash += scan_ulong(hash, &u);
  if(u < now()) die_trash();
  if(*hash++ != '.') die_trash();
  if(str_len(hash) != COOKIE) die_trash();

  strnum[fmt_ulong(strnum,u)] = 0;
  cookie(verify, secret, secret_len, strnum, sender, "");
  if(!byte_equal(hash,COOKIE,verify)) die_trash();
}

int main(int argc, char **argv) {
  const char* x;

  argv++;

  sender = env_get("SENDER");
  if(!sender)
    strerr_die2x(100,fatal,"$SENDER is not set");

  x = *argv++;
  if(!x) die_usage();
  secret_len = secret_read(x, secret);
  if(secret_len < 0) strerr_die2sys(111,fatal,"unable to read secret: ");

  hash = *argv++;
  if(!hash) die_usage();

  doit();
  return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1