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

#include "keymaster_attributes.pb.h"

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



const pb_field_t KeymasterAttributes_fields[3] = {
    PB_FIELD(  1, BYTES   , OPTIONAL, STATIC  , FIRST, KeymasterAttributes, uuid, uuid, 0),
    PB_FIELD(  2, BYTES   , OPTIONAL, STATIC  , OTHER, KeymasterAttributes, product_id, uuid, 0),
    PB_LAST_FIELD
};

const pb_field_t AttestationIds_fields[9] = {PB_FIELD(1,
                                                      BYTES,
                                                      OPTIONAL,
                                                      STATIC,
                                                      FIRST,
                                                      AttestationIds,
                                                      brand,
                                                      brand,
                                                      0),
                                             PB_FIELD(2,
                                                      BYTES,
                                                      OPTIONAL,
                                                      STATIC,
                                                      OTHER,
                                                      AttestationIds,
                                                      device,
                                                      brand,
                                                      0),
                                             PB_FIELD(3,
                                                      BYTES,
                                                      OPTIONAL,
                                                      STATIC,
                                                      OTHER,
                                                      AttestationIds,
                                                      product,
                                                      device,
                                                      0),
                                             PB_FIELD(4,
                                                      BYTES,
                                                      OPTIONAL,
                                                      STATIC,
                                                      OTHER,
                                                      AttestationIds,
                                                      serial,
                                                      product,
                                                      0),
                                             PB_FIELD(5,
                                                      BYTES,
                                                      OPTIONAL,
                                                      STATIC,
                                                      OTHER,
                                                      AttestationIds,
                                                      imei,
                                                      serial,
                                                      0),
                                             PB_FIELD(6,
                                                      BYTES,
                                                      OPTIONAL,
                                                      STATIC,
                                                      OTHER,
                                                      AttestationIds,
                                                      meid,
                                                      imei,
                                                      0),
                                             PB_FIELD(7,
                                                      BYTES,
                                                      OPTIONAL,
                                                      STATIC,
                                                      OTHER,
                                                      AttestationIds,
                                                      manufacturer,
                                                      meid,
                                                      0),
                                             PB_FIELD(8,
                                                      BYTES,
                                                      OPTIONAL,
                                                      STATIC,
                                                      OTHER,
                                                      AttestationIds,
                                                      model,
                                                      manufacturer,
                                                      0),
                                             PB_LAST_FIELD};

const pb_field_t AttestationKey_fields[3] = {
    PB_FIELD(  1, BYTES   , OPTIONAL, STATIC  , FIRST, AttestationKey, key, key, 0),
    PB_FIELD(  2, MESSAGE , REPEATED, STATIC  , OTHER, AttestationKey, certs, key, &AttestationCert_fields),
    PB_LAST_FIELD
};

const pb_field_t AttestationCert_fields[2] = {
    PB_FIELD(  1, BYTES   , REQUIRED, STATIC  , FIRST, AttestationCert, content, content, 0),
    PB_LAST_FIELD
};


/* Check that field information fits in pb_field_t */
#if !defined(PB_FIELD_32BIT)
/* If you get an error here, it means that you need to define PB_FIELD_32BIT
 * compile-time option. You can do that in pb.h or on compiler command line.
 * 
 * The reason you need to do this is that some of your messages contain tag
 * numbers or field sizes that are larger than what can fit in 8 or 16 bit
 * field descriptors.
 */
PB_STATIC_ASSERT(
        (pb_membersize(AttestationKey, key) < 65536 &&
         pb_membersize(AttestationKey, certs[0]) < 65536 &&
         pb_membersize(AttestationCert, content) < 65536),
        YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_KeymasterAttributes_AttestationIds_AttestationKey_AttestationCert)
#endif

#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
#error Field descriptor for AttestationCert.content is too large. Define PB_FIELD_16BIT to fix this.
#endif


/* @@protoc_insertion_point(eof) */
