blob: 5250ac143ba40ab291ea5f0cecbd77ee8e973c36 [file] [log] [blame]
// Copyright 2015 The Weave Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIBUWEAVE_SRC_MACAROON_CAVEAT_H_
#define LIBUWEAVE_SRC_MACAROON_CAVEAT_H_
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
typedef struct {
size_t num_bytes;
const uint8_t* bytes;
} UwMacaroonCaveat;
typedef enum {
kUwMacaroonCaveatTypeNonce = 0, // bstr
kUwMacaroonCaveatTypeScope = 1, // uint
kUwMacaroonCaveatTypeExpirationAbsolute = 5, // uint
kUwMacaroonCaveatTypeTTL1Hour = 6, // no value
kUwMacaroonCaveatTypeTTL24Hour = 7, // no value
kUwMacaroonCaveatTypeDelegationTimestamp = 8, // uint
kUwMacaroonCaveatTypeDelegateeUser = 9, // bstr
kUwMacaroonCaveatTypeDelegateeApp = 10, // bstr
kUwMacaroonCaveatTypeDelegateeService = 12, // uint
kUwMacaroonCaveatTypeAppCommandsOnly = 11, // no value
kUwMacaroonCaveatTypeBleSessionID = 16, // no value
kUwMacaroonCaveatTypeLanSessionID = 17, // bstr
kUwMacaroonCaveatTypeAuthenticationChallenge = 20, // no value
kUwMacaroonCaveatTypeClientAuthorizationTokenV1 = 8193, // bstr (0x2001)
kUwMacaroonCaveatTypeServerAuthenticationTokenV1 = 12289, // bstr (0x3001)
} UwMacaroonCaveatType;
typedef enum {
kUwMacaroonCaveatScopeTypeOwner = 2,
kUwMacaroonCaveatScopeTypeManager = 8,
kUwMacaroonCaveatScopeTypeUser = 14,
kUwMacaroonCaveatScopeTypeViewer = 20,
} UwMacaroonCaveatScopeType;
typedef enum {
kUwMacaroonCaveatCloudServiceIdNotCloudRegistered = 0,
kUwMacaroonCaveatCloudServiceIdGoogleWeave = 1,
} UwMacaroonCaveatCloudServiceId;
// For security sanity checks
#define UW_MACAROON_CAVEAT_SCOPE_LOWEST_POSSIBLE 127
/** Compute the buffer sizes that are enough for caveat creation functions. */
size_t uw_macaroon_caveat_creation_get_buffsize_(UwMacaroonCaveatType type,
size_t str_len);
// Caveat creation functions
bool uw_macaroon_caveat_create_nonce_(const uint8_t* nonce,
size_t nonce_size,
uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_scope_(UwMacaroonCaveatScopeType scope,
uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_expiration_absolute_(
uint32_t expiration_time,
uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_ttl_1_hour_(uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_ttl_24_hour_(uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_delegation_timestamp_(
uint32_t timestamp,
uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_delegatee_user_(const uint8_t* id_str,
size_t id_str_len,
uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_delegatee_app_(const uint8_t* id_str,
size_t id_str_len,
uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_delegatee_service_(
UwMacaroonCaveatCloudServiceId service_id,
uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_app_commands_only_(uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_ble_session_id_(uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_lan_session_id_(const uint8_t* session_id,
size_t session_id_len,
uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_authentication_challenge_(
uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
// The string values for these two token types are optional.
// Use str_len = 0 to indicate creating the caveats without string values.
bool uw_macaroon_caveat_create_client_authorization_token_(
const uint8_t* str,
size_t str_len,
uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
bool uw_macaroon_caveat_create_server_authentication_token_(
const uint8_t* str,
size_t str_len,
uint8_t* buffer,
size_t buffer_size,
UwMacaroonCaveat* new_caveat);
/** Get the type for the given caveat. */
bool uw_macaroon_caveat_get_type_(const UwMacaroonCaveat* caveat,
UwMacaroonCaveatType* type);
#endif // LIBUWEAVE_SRC_MACAROON_CAVEAT_H_