The voucher artifact is a JSON RFC8259 document that conforms with a data model described by YANG RFC7950, is encoded using the rules defined in RFC8259, and is signed using (by default) a CMS structure RFC5652.
module: ietf-voucher
yang-data voucher-artifact:
+---- voucher
+---- created-on yang:date-and-time
+---- expires-on? yang:date-and-time
+---- assertion enumeration
+---- serial-number string
+---- idevid-issuer? binary
+---- pinned-domain-cert binary
+---- domain-cert-revocation-checks? boolean
+---- nonce? binary
+---- last-renewal-date? yang:date-and-time
+-- prior-signed-voucher-request? binary
+-- proximity-registrar-cert? binary
The voucher artifact attributes are define by the enum below:
enum VoucherAttributes {
ATTR_CREATED_ON = 0,
ATTR_EXPIRES_ON,
ATTR_ASSERTION,
ATTR_SERIAL_NUMBER,
ATTR_IDEVID_ISSUER,
ATTR_PINNED_DOMAIN_CERT,
ATTR_DOMAIN_CERT_REVOCATION_CHECKS,
ATTR_NONCE,
ATTR_LAST_RENEWAL_DATE,
ATTR_PRIOR_SIGNED_VOUCHER_REQUEST,
ATTR_PROXIMITY_REGISTRAR_CERT
};
Initialises an empty voucher structure.
__must_free_voucher struct Voucher *init_voucher(void);
Return: Pointer to an allocated voucher or NULL on failure.
Frees an allocated voucher structure.
void free_voucher(struct Voucher *voucher);
Parameters:
voucher
- The allocated voucher structure.
Sets the value for a voucher bool attribute.
int set_attr_bool_voucher(struct Voucher *voucher,
const enum VoucherAttributes attr,
const bool value);
Parameters:
voucher
- The allocated voucher structure,attr
- The voucher attribute corresponding to thebool
value andvalue
- Thebool
attribute value.
Return:
0
on success or -1
on failure.
Sets the value for a voucher time attribute.
int set_attr_time_voucher(struct Voucher *voucher,
const enum VoucherAttributes attr,
const struct tm *value);
Parameters:
voucher
- The allocated voucher structure,attr
- The voucher attribute corresponding to thestruct tm
value andvalue
- Thestruct tm
attribute value.
Return:
0
on success or -1
on failure.
Sets the value for a voucher enum attribute.
int set_attr_enum_voucher(struct Voucher *voucher,
const enum VoucherAttributes attr,
const int value);
Parameters:
voucher
- The allocated voucher structure,attr
- The enum voucher attribute andvalue
- The enum attribute value.
Return:
0
on success or -1
on failure.
The enum attribute API sets the value for the assertion attribute with one of the following values as described in RFC8995:
enum VoucherAssertions {
VOUCHER_ASSERTION_NONE = 0,
VOUCHER_ASSERTION_VERIFIED = 1,
VOUCHER_ASSERTION_LOGGED = 2,
VOUCHER_ASSERTION_PROXIMITY = 3
};
Sets the value for a voucher string attribute.
int set_attr_str_voucher(struct Voucher *voucher,
const enum VoucherAttributes attr,
const char *value);
Parameters:
voucher
- The allocated voucher structure,attr
- The string voucher attribute name andvalue
- The string attribute value.
Return:
0
on success or -1
on failure.
Sets the value for a voucher array attribute.
int set_attr_array_voucher(struct Voucher *voucher,
const enum VoucherAttributes attr,
const struct BinaryArray *value);
Parameters:
voucher
- The allocated voucher structure,attr
- The array voucher attribute name andvalue
- The array attribute value.
Return:
0
on success or -1
on failure.
Sets the value for a voucher attribute.
int set_attr_voucher(struct Voucher *voucher,
const enum VoucherAttributes attr,
...);
Parameters:
voucher
- The allocated voucher structure,attr
- The array voucher attribute name and__VA_ARGS__
- The variable list of attribute values:ATTR_CREATED_ON
=>struct tm *
ATTR_EXPIRES_ON
=>struct tm *
ATTR_LAST_RENEWAL_DATE
=>struct tm *
ATTR_ASSERTION
=>enum VoucherAssertions
ATTR_SERIAL_NUMBER
=>char *
ATTR_IDEVID_ISSUER
=>struct BinaryArray *
ATTR_PINNED_DOMAIN_CERT
=>struct BinaryArray *
ATTR_NONCE
=>struct BinaryArray *
ATTR_PRIOR_SIGNED_VOUCHER_REQUEST
=>struct BinaryArray *
ATTR_PROXIMITY_REGISTRAR_CERT
=>struct BinaryArray *
ATTR_DOMAIN_CERT_REVOCATION_CHECKS
=>bool
Return:
0
on success or -1
on failure.
Clears a voucher attribute.
int clear_attr_voucher(struct Voucher *voucher,
const enum VoucherAttributes attr);
Parameters:
voucher
- The allocated voucher structure andattr
- The attribute name
Return:
0
on success or -1
on failure.
Checks if a voucher attribute is non empty.
bool is_attr_voucher_nonempty(const struct Voucher *voucher,
const enum VoucherAttributes attr);
Parameters:
voucher
- The allocated voucher structure andattr
- The attribute name.
Return:
true
if non empty or false
otherwise.
Gets the pointer to the value for a voucher bool attribute.
const bool *get_attr_bool_voucher(const struct Voucher *voucher,
const enum VoucherAttributes attr);
Parameters:
voucher
- The allocated voucher structure andattr
- The bool voucher attribute.
Return:
Pointer to the bool
value or NULL
on failure.
Gets the pointer to the value for a voucher time attribute.
const struct tm *get_attr_time_voucher(struct Voucher *voucher,
const enum VoucherAttributes attr);
Parameters:
voucher
- The allocated voucher structure andattr
- The time voucher attribute.
Return:
Pointer to the time value or NULL
on failure.
Gets the pointer to the value for a voucher enum attribute.
const int *get_attr_enum_voucher(struct Voucher *voucher,
const enum VoucherAttributes attr);
Parameters:
voucher
- The allocated voucher structure andattr
- The enum voucher attribute.
Return:
Pointer to the enum value or NULL
on failure.
Gets the pointer to the value for a voucher string attribute.
const char *const *get_attr_str_voucher(struct Voucher *voucher,
const enum VoucherAttributes attr);
Parameters:
voucher
- The allocated voucher structure andattr
- The string voucher attribute name.
Return:
Pointer to the string value or NULL
on failure.
Example:
const char *const *serial_number = get_attr_str_voucher(voucher, ATTR_SERIAL_NUMBER);
if (strcmp(*serial_number, "12345")) {}
Gets the pointer to the value for a voucher array attribute.
const struct BinaryArray * get_attr_array_voucher(struct Voucher *voucher,
const enum VoucherAttributes attr);
Parameters:
voucher
- The allocated voucher structure andattr
- The array voucher attribute name.
Return:
Pointer to the array value or NULL
on failure.
Serializes a voucher to a string.
__must_free char *serialize_voucher(const struct Voucher *voucher);
Parameters:
voucher
- The allocated voucher structure.
Return:
Serialized voucher to string or NULL
on failure.
Example:
struct Voucher *voucher = init_voucher();
set_attr_enum_voucher(voucher, ATTR_ASSERTION, VOUCHER_ASSERTION_PROXIMITY);
char *serialized = serialize_voucher(voucher);
/* ... */
free(serialized);
free_voucher(voucher);
Deserializes a json string buffer to a voucher structure.
struct Voucher *deserialize_voucher(const uint8_t *json, const size_t length);
Paramaters:
json
- The json buffer andlength
- The json buffer length.
Return:
Voucher structure or NULL
on failure.
Example:
struct Voucher *voucher = deserialize_voucher(json, json_length);
/* ... */
free_voucher(voucher);
Signs a voucher using CMS with an Elliptic Curve private key and output to a binary buffer (DER
format).
__must_free_binary_array struct BinaryArray *sign_eccms_voucher(struct Voucher *voucher,
const struct BinaryArray *cert,
const struct BinaryArray *key,
const struct BinaryArrayList *certs);
Parameters:
voucher
- The allocated voucher structure,cert
- The certificate buffer (DER
format) correspoding to the private key,key
- The Elliptic Curve private key buffer (DER
format) of the certificate andcerts
- Thestruct BinaryArrayList
of additional certificate buffers (DER
format) to be included in the CMS (NULL
if none).
Return:
The signed CMS structure in binary (DER
format) or NULL
on failure.
Signs a voucher using CMS with a RSA private key and output to a binary buffer (DER
format).
__must_free_binary_array struct BinaryArray *sign_rsacms_voucher(struct Voucher *voucher,
const struct BinaryArray *cert,
const struct BinaryArray *key,
const struct BinaryArrayList *certs);
Parameters:
voucher
- The allocated voucher structure,cert
- The certificate buffer (DER
format) correspoding to the private key,key
- The RSA private key buffer (DER
format) of the certificate andcerts
- Thestruct BinaryArrayList
of additional certificate buffers (DER
format) to be included in the CMS (NULL
if none)
Return:
The signed CMS structure in binary (DER
format) or NULL
on failure.
Signs a voucher using CMS with a private key (detected automatically) and output as binary array (DER
format).
__must_free_binary_array struct BinaryArray *sign_cms_voucher(struct Voucher *voucher,
const struct BinaryArray *cert,
const struct BinaryArray *key,
const struct BinaryArrayList *certs);
Parameters:
voucher
- The allocated voucher structure,cert
- The certificate buffer (DER
format) correspoding to the private key,key
- The private key buffer (DER
format) of the certificate andcerts
- The list of additional certificate buffers (DER
format) to be included in the CMS (NULL
if none)
Return:
The signed CMS structure as binary array (DER
format) or NULL
on failure.
Verifies a CMS binary buffer and extracts the voucher structure, and the list of included certificates.
__must_free_voucher struct Voucher *verify_cms_voucher(const struct BinaryArray *cms,
const struct BinaryArrayList *certs,
const struct BinaryArrayList *store,
struct BinaryArrayList **out_certs);
Parameters:
cms
- The CMS binary buffer string (DER
format),certs
- The list of additional certificate buffers (DER
format),store
- The list of trusted certificate for store (DER
format). The list's flags is encoded with the following enum:whereenum CRYPTO_CERTIFICATE_TYPE { CRYPTO_CERTIFICATE_VALID = 0, CRYPTO_CERTIFICATE_CRL, };
CRYPTO_CERTIFICATE_VALID
denotes a standard certificate buffer andCRYPTO_CERTIFICATE_CRL
denotes a certificate revocation type buffer, andout_certs
- The output list of certificates (NULL
for empty) from the CMS structure.
Return:
The verified voucher structrure or NULL
on failure.
Example:
struct BinaryArrayList *out_certs = NULL;
struct Voucher *voucher = verify_cms_voucher(cms, certs, store, &out_certs);
struct BinaryArrayList *cert = NULL;
dl_list_for_each(el, &out_certs->list, struct BinaryArrayList, list) {
uint8_t cert_array = cert->buf;
uint8_t cert_length = cert->length;
/* ... */
}
/* ... */
free_voucher(voucher);
free_buffer_list(out_certs);