/* Automatically generated nanopb header */
/* Generated by nanopb-0.3.9.1 at Sun Jun 13 11:33:41 2021. */

#ifndef PB_KEYMASTER_ATTRIBUTES_PB_H_INCLUDED
#define PB_KEYMASTER_ATTRIBUTES_PB_H_INCLUDED
#include <pb.h>

/* @@protoc_insertion_point(includes) */
#if PB_PROTO_HEADER_VERSION != 30
#error Regenerate this file with the current version of nanopb generator.
#endif

#ifdef __cplusplus
extern "C" {
#endif

/* Struct definitions */
typedef PB_BYTES_ARRAY_T(2048) AttestationCert_content_t;
typedef struct _AttestationCert {
    AttestationCert_content_t content;
/* @@protoc_insertion_point(struct:AttestationCert) */
} AttestationCert;

typedef PB_BYTES_ARRAY_T(64) AttestationIds_brand_t;
typedef PB_BYTES_ARRAY_T(64) AttestationIds_device_t;
typedef PB_BYTES_ARRAY_T(64) AttestationIds_product_t;
typedef PB_BYTES_ARRAY_T(64) AttestationIds_serial_t;
typedef PB_BYTES_ARRAY_T(64) AttestationIds_imei_t;
typedef PB_BYTES_ARRAY_T(64) AttestationIds_meid_t;
typedef PB_BYTES_ARRAY_T(64) AttestationIds_manufacturer_t;
typedef PB_BYTES_ARRAY_T(64) AttestationIds_model_t;
typedef struct _AttestationIds {
    bool has_brand;
    AttestationIds_brand_t brand;
    bool has_device;
    AttestationIds_device_t device;
    bool has_product;
    AttestationIds_product_t product;
    bool has_serial;
    AttestationIds_serial_t serial;
    bool has_imei;
    AttestationIds_imei_t imei;
    bool has_meid;
    AttestationIds_meid_t meid;
    bool has_manufacturer;
    AttestationIds_manufacturer_t manufacturer;
    bool has_model;
    AttestationIds_model_t model;
    /* @@protoc_insertion_point(struct:AttestationIds) */
} AttestationIds;

typedef PB_BYTES_ARRAY_T(32) KeymasterAttributes_uuid_t;
typedef PB_BYTES_ARRAY_T(16) KeymasterAttributes_product_id_t;
typedef struct _KeymasterAttributes {
    bool has_uuid;
    KeymasterAttributes_uuid_t uuid;
    bool has_product_id;
    KeymasterAttributes_product_id_t product_id;
/* @@protoc_insertion_point(struct:KeymasterAttributes) */
} KeymasterAttributes;

typedef PB_BYTES_ARRAY_T(2048) AttestationKey_key_t;
typedef struct _AttestationKey {
    bool has_key;
    AttestationKey_key_t key;
    pb_size_t certs_count;
    AttestationCert certs[3];
/* @@protoc_insertion_point(struct:AttestationKey) */
} AttestationKey;

/* Default values for struct fields */

/* Initializer values for message structs */
#define KeymasterAttributes_init_default         {false, {0, {0}}, false, {0, {0}}}
#define AttestationIds_init_default                                         \
    {                                                                       \
        false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, \
                false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, false, { \
            0, { 0 }                                                        \
        }                                                                   \
    }
#define AttestationKey_init_default              {false, {0, {0}}, 0, {AttestationCert_init_default, AttestationCert_init_default, AttestationCert_init_default}}
#define AttestationCert_init_default             {{0, {0}}}
#define KeymasterAttributes_init_zero            {false, {0, {0}}, false, {0, {0}}}
#define AttestationIds_init_zero                                            \
    {                                                                       \
        false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, \
                false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, false, { \
            0, { 0 }                                                        \
        }                                                                   \
    }
#define AttestationKey_init_zero                 {false, {0, {0}}, 0, {AttestationCert_init_zero, AttestationCert_init_zero, AttestationCert_init_zero}}
#define AttestationCert_init_zero                {{0, {0}}}

/* Field tags (for use in manual encoding/decoding) */
#define AttestationCert_content_tag              1
#define AttestationIds_brand_tag 1
#define AttestationIds_device_tag 2
#define AttestationIds_product_tag 3
#define AttestationIds_serial_tag 4
#define AttestationIds_imei_tag 5
#define AttestationIds_meid_tag 6
#define AttestationIds_manufacturer_tag 7
#define AttestationIds_model_tag 8
#define KeymasterAttributes_uuid_tag             1
#define KeymasterAttributes_product_id_tag       2
#define AttestationKey_key_tag                   1
#define AttestationKey_certs_tag                 2

/* Struct field encoding specification for nanopb */
extern const pb_field_t KeymasterAttributes_fields[3];
extern const pb_field_t AttestationIds_fields[9];
extern const pb_field_t AttestationKey_fields[3];
extern const pb_field_t AttestationCert_fields[2];

/* Maximum encoded size of messages (where known) */
#define KeymasterAttributes_size                 52
#define AttestationIds_size 528
#define AttestationKey_size                      8213
#define AttestationCert_size                     2051

/* Message IDs (where set with "msgid" option) */
#ifdef PB_MSGID

#define KEYMASTER_ATTRIBUTES_MESSAGES \


#endif

#ifdef __cplusplus
} /* extern "C" */
#endif
/* @@protoc_insertion_point(eof) */

#endif
