macaroons 0.1.1

Bearer credentials with caveats for distributed authorization
Documentation
extern crate macaroons;
pub use macaroons::token::{Token, Tag};
pub use macaroons::caveat::{Caveat, Predicate};

const EMPTY_TAG:    [u8; 32] = [0xe3,0xd9,0xe0,0x29,0x08,0x52,0x6c,0x4c
                               ,0x00,0x39,0xae,0x15,0x11,0x41,0x15,0xd9
                               ,0x7f,0xdd,0x68,0xbf,0x2b,0xa3,0x79,0xb3
                               ,0x42,0xaa,0xf0,0xf6,0x17,0xd0,0x55,0x2f];

const EXPECTED_TAG: [u8; 32] = [0x19,0x7b,0xac,0x7a,0x04,0x4a,0xf3,0x33
                               ,0x32,0x86,0x5b,0x92,0x66,0xe2,0x6d,0x49
                               ,0x3b,0xdd,0x66,0x8a,0x66,0x0e,0x44,0xd8
                               ,0x8c,0xe1,0xa9,0x98,0xc2,0x3d,0xbd,0x67];

fn example_key() -> Vec<u8> {
  Vec::from("this is our super secret key; only we should know it")
}

fn invalid_key() -> Vec<u8> {
  Vec::from("this is not the key you are looking for; it is evil")
}

fn example_id() -> Vec<u8> {
  Vec::from("we used our secret key")
}

fn example_uri() -> Vec<u8> {
  Vec::from("http://mybank/")
}

fn example_predicate() -> Predicate {
  Predicate(Vec::from("test = caveat"))
}

fn example_token() -> Token {
  let token = Token::new(&example_key(), example_id(), example_uri());
  token.add_caveat(Caveat::new(example_predicate()))
}

fn example_serialized() -> Vec<u8> {
  Vec::from("MDAxY2xvY2F0aW9uIGh0dHA6Ly9teWJhbmsvCjAwMjZpZGVudGlmaWVyIHdlIHVzZWQgb3VyIHNlY3JldCBrZXkKMDAxNmNpZCB0ZXN0ID0gY2F2ZWF0CjAwMmZzaWduYXR1cmUgGXusegRK8zMyhluSZuJtSTvdZopmDkTYjOGpmMI9vWcK")
}

#[test]
fn empty_macaroon_signature() {
  let token = Token::new(&example_key(), example_id(), example_uri());
  let Tag(actual_tag) = token.tag;

  assert_eq!(EMPTY_TAG, actual_tag)
}

#[test]
fn signature_with_first_party_caveat() {
  let Tag(actual_tag) = example_token().tag;
  assert_eq!(EXPECTED_TAG, actual_tag)
}

#[test]
fn binary_serialization() {
  assert_eq!(example_serialized(), example_token().serialize());
}

#[test]
fn binary_deserialization() {
  let token = Token::deserialize(example_serialized()).unwrap();

  assert_eq!(example_uri(), token.location);
  assert_eq!(example_id(),  token.identifier);

  let Tag(actual_tag) = token.tag;
  assert_eq!(EXPECTED_TAG, actual_tag)
}

#[test]
fn simple_verification() {
  let token    = example_token();

  assert!(token.verify(&example_key()), "verifies with valid key");
  assert!(!token.verify(&invalid_key()), "doesn't verify with invalid key");
}