|  | // 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_ |