Simulated product dispenser

Dependencies:   HTS221

Fork of mbed-cloud-workshop-connect-HTS221 by Jim Carver

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers update-client-manifest-manager-context.h Source File

update-client-manifest-manager-context.h

00001 // ----------------------------------------------------------------------------
00002 // Copyright 2016-2017 ARM Ltd.
00003 //
00004 // SPDX-License-Identifier: Apache-2.0
00005 //
00006 // Licensed under the Apache License, Version 2.0 (the "License");
00007 // you may not use this file except in compliance with the License.
00008 // You may obtain a copy of the License at
00009 //
00010 //     http://www.apache.org/licenses/LICENSE-2.0
00011 //
00012 // Unless required by applicable law or agreed to in writing, software
00013 // distributed under the License is distributed on an "AS IS" BASIS,
00014 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00015 // See the License for the specific language governing permissions and
00016 // limitations under the License.
00017 // ----------------------------------------------------------------------------
00018 
00019 #ifndef ARM_UC_MM_CONTEXT_TYPES_H
00020 #define ARM_UC_MM_CONTEXT_TYPES_H
00021 
00022 #include "update-client-manifest-manager/update-client-manifest-types.h"
00023 #include "update-client-manifest-manager/../source/arm_uc_mmConfig.h"
00024 #include "update-client-common/arm_uc_error.h"
00025 #include "update-client-common/arm_uc_types.h"
00026 #include "update-client-common/arm_uc_scheduler.h"
00027 #include "update-client-manifest-manager/arm-pal-kv.h"
00028 
00029 
00030 struct arm_uc_mmInitContext_t {
00031     uint64_t timestamp;
00032     uint32_t state;
00033     arm_uc_buffer_t manifest;
00034     arm_uc_buffer_t keyPath;
00035     uint32_t loopCounters[1];
00036 
00037     arm_uc_callback_t callbackStorage; // initialized in hub
00038     struct {
00039         unsigned root:1;
00040         unsigned depidx:3;
00041         unsigned missingDep:1;
00042     };
00043     uint8_t rootManifestBasePath[sizeof(MANIFEST_PREFIX ".." ) + CFSTORE_HASH_ID_SIZE];
00044     uint8_t pathBuffer[220];
00045     uint8_t manifestBuffer[640];
00046     uint8_t currentHash [MAX_HASH_BYTES];
00047 
00048 };
00049 
00050 struct arm_uc_mm_get_latest_ts_context {
00051     uint64_t current_ts;
00052     uint64_t* max_ts;
00053     uint32_t state;
00054     arm_uc_buffer_t current_data;
00055     arm_uc_buffer_t max_ts_key;
00056 };
00057 
00058 enum arm_uc_mm_pk_sig_state {
00059     UCMM_PKSIG_STATE_INVALID = 0,
00060     UCMM_PKSIG_STATE_FIND_CA,
00061     UCMM_PKSIG_STATE_FINDING_CA,
00062     UCMM_PKSIG_STATE_CHECK,
00063     UCMM_PKSIG_STATE_IDLE,
00064 };
00065 
00066 typedef struct arm_uc_mm_validate_signature_context{
00067     enum arm_uc_mm_pk_sig_state  state;
00068                          void (* applicationEventHandler)(uint32_t);
00069                 arm_uc_buffer_t  fingerprint;
00070                 arm_uc_buffer_t  certList;
00071                 arm_uc_buffer_t  cert;
00072                 arm_uc_buffer_t* manifest;
00073                 arm_uc_error_t   storedError;
00074                 uint32_t         sigIndex;
00075 } arm_uc_mm_validate_signature_context_t;
00076 
00077 #define ARM_UC_MM_FW_STATE_LIST\
00078     ENUM_FIXED(ARM_UC_MM_FW_STATE_INVALID,0)\
00079     ENUM_AUTO(ARM_UC_MM_FW_STATE_IDLE)\
00080     ENUM_AUTO(ARM_UC_MM_FW_STATE_BEGIN)\
00081     ENUM_AUTO(ARM_UC_MM_FW_STATE_FIND_ROOT)\
00082     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_TS)\
00083     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_NAME)\
00084     ENUM_AUTO(ARM_UC_MM_FW_STATE_FIND_NEXT_ROOT)\
00085     ENUM_AUTO(ARM_UC_MM_FW_STATE_FORMAT_ROOT_PREFIX)\
00086     ENUM_AUTO(ARM_UC_MM_FW_STATE_FIND_MANIFEST)\
00087     ENUM_AUTO(ARM_UC_MM_FW_STATE_READ_MANIFEST)\
00088     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_ROOT)\
00089     ENUM_AUTO(ARM_UC_MM_FW_STATE_FIND_URI)\
00090     ENUM_AUTO(ARM_UC_MM_FW_STATE_READ_URI)\
00091     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_URI_KEY)\
00092     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_HASH)\
00093     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_DEP_URI)\
00094     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_DEP_HASH)\
00095     ENUM_AUTO(ARM_UC_MM_FW_STATE_GET_FW_REF)\
00096     ENUM_AUTO(ARM_UC_MM_FW_STATE_NOTIFY)\
00097     ENUM_AUTO(ARM_UC_MM_FW_STATE_ROOT_NOTIFY_WAIT)\
00098     ENUM_AUTO(ARM_UC_MM_FW_STATE_NEXT_IMAGE)\
00099     ENUM_AUTO(ARM_UC_MM_FW_STATE_DONE)\
00100 
00101 
00102 enum arm_uc_mm_fw_state {
00103     #define ENUM_AUTO(name) name,
00104     #define ENUM_FIXED(name, val) name = val,
00105     ARM_UC_MM_FW_STATE_LIST
00106     #undef ENUM_AUTO
00107     #undef ENUM_FIXED
00108 };
00109 
00110 struct arm_uc_mm_fw_context_t {
00111     struct arm_uc_mm_get_latest_ts_context getLatestTs;
00112                                   uint64_t ts;
00113                  arm_uc_manifest_handle_t* ID;
00114                    enum arm_uc_mm_fw_state state;
00115           struct manifest_firmware_info_t* info;
00116                          arm_uc_callback_t callbackStorage; // initialized in hub
00117                            arm_uc_buffer_t current_data;
00118                                       char hashIDbuffer[CFSTORE_HASH_ID_SIZE];
00119                                    uint8_t keyBuffer[ARM_PAL_KV_KEY_MAX_PATH];
00120 };
00121 
00122 #define ARM_UC_MM_INS_STATE_LIST\
00123     ENUM_FIXED(ARM_UC_MM_INS_STATE_INVALID,0)\
00124     ENUM_AUTO(ARM_UC_MM_INS_STATE_IDLE)\
00125     ENUM_AUTO(ARM_UC_MM_INS_STATE_BEGIN)\
00126     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_BASIC_PARAMS)\
00127     ENUM_AUTO(ARM_UC_MM_INS_STATE_HASH_VERIFY)\
00128     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_SIG_LOOP)\
00129     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_SIG_START)\
00130     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_SIG_WAIT)\
00131     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_PARAMS)\
00132     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_APP)\
00133     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_FAIL)\
00134     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_DONE)\
00135     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_BEGIN)\
00136     ENUM_AUTO(ARM_UC_MM_INS_STATE_MATCHING)\
00137     ENUM_AUTO(ARM_UC_MM_INS_STATE_MATCH_FETCHING)\
00138     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_MANIFEST_BEGIN)\
00139     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_MANIFEST)\
00140     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_FW_URI)\
00141     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_FW_HASH)\
00142     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_AES)\
00143     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_DEPS)\
00144     ENUM_AUTO(ARM_UC_MM_INS_STATE_DEPSTART)\
00145     ENUM_AUTO(ARM_UC_MM_INS_STATE_DEP_WAITING)\
00146     ENUM_AUTO(ARM_UC_MM_INS_STATE_COMPLETION)\
00147     ENUM_AUTO(ARM_UC_MM_INS_STATE_COMPLETION_FINDING)\
00148     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_TS_START)\
00149     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_TS)\
00150     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_TS_START)\
00151     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_TS)\
00152     ENUM_AUTO(ARM_UC_MM_INS_STATE_DEP_CHECK)\
00153     ENUM_AUTO(ARM_UC_MM_INS_STATE_DEP_CHECKING)\
00154     ENUM_AUTO(ARM_UC_MM_INS_STATE_DEP_DELETE)\
00155     ENUM_AUTO(ARM_UC_MM_INS_STATE_DONE)\
00156     ENUM_AUTO(ARM_UC_MM_INS_STATE_ALERT)\
00157 
00158 
00159 enum arm_uc_mm_insert_state {
00160     #define ENUM_AUTO(name) name,
00161     #define ENUM_FIXED(name, val) name = val,
00162     ARM_UC_MM_INS_STATE_LIST
00163     #undef ENUM_AUTO
00164     #undef ENUM_FIXED
00165 };
00166 
00167 struct arm_uc_mmInsertContext_t {
00168     struct arm_uc_mm_get_latest_ts_context getLatestTs;
00169     arm_uc_mm_validate_signature_context_t signatureContext;
00170                                   uint64_t max_ts;
00171                                   uint64_t current_ts;
00172                  arm_uc_manifest_handle_t* ID;
00173                enum arm_uc_mm_insert_state state;
00174                          arm_uc_callback_t callbackStorage; // initialized in hub
00175                            arm_uc_buffer_t manifest;
00176                   arm_uc_mm_crypto_flags_t cryptoMode;
00177                            arm_uc_buffer_t certificateStorage;
00178                                   uint32_t loopCounters[1];
00179 };
00180 
00181 struct arm_uc_mmContext_t {
00182     // Operational Contexts
00183     union {
00184         struct arm_uc_mmInitContext_t   init;
00185         struct arm_uc_mm_fw_context_t   getFw;
00186         struct arm_uc_mmInsertContext_t insert;
00187     };
00188 };
00189 typedef struct arm_uc_mmContext_t arm_uc_mmContext_t;
00190 
00191 
00192 enum arm_uc_mmState_t {
00193     ARM_UC_MM_STATE_INVALID=0,
00194     ARM_UC_MM_STATE_IDLE,
00195     ARM_UC_MM_STATE_INIT,
00196     ARM_UC_MM_STATE_INSERTING,
00197     ARM_UC_MM_STATE_STORING_CA,
00198     ARM_UC_MM_STATE_FWINFO,
00199     ARM_UC_MM_STATE_TEST,
00200 };
00201 
00202 typedef void (*ARM_UC_mmTestHook_t)(const char*, arm_uc_mmContext_t*, uint32_t, uint32_t, arm_uc_error_t);
00203 
00204 struct arm_uc_mmPersistentContext_t {
00205           enum arm_uc_mmState_t state;
00206                  arm_uc_error_t reportedError;
00207                     const char* errorFile;
00208                        uint32_t errorLine;
00209     struct arm_uc_mmContext_t** ctx;
00210               arm_uc_callback_t applicationCallbackStorage; // initialized in mmCommon
00211                            void (*applicationEventHandler)(uint32_t);
00212                  arm_uc_error_t (*testFSM)(uint32_t event);
00213 #if ARM_UC_MM_ENABLE_TEST_VECTORS
00214             ARM_UC_mmTestHook_t testHook;
00215 #endif
00216 };
00217 
00218 typedef struct arm_uc_mmPersistentContext_t arm_uc_mmPersistentContext_t;
00219 extern arm_uc_mmPersistentContext_t arm_uc_mmPersistentContext;
00220 
00221 static inline arm_uc_mmContext_t* arm_uc_mmBuf2Context(arm_uc_buffer_t* b) {
00222     return (arm_uc_mmContext_t*)b->ptr;
00223 }
00224 
00225 static inline arm_uc_error_t arm_uc_mmContextBufSizeCheck(arm_uc_buffer_t* b) {
00226     arm_uc_error_t err = { .code = MFST_ERR_NONE };
00227     if (b->size_max < sizeof(arm_uc_mmContext_t)) {
00228         err.code = MFST_ERR_SIZE;
00229         return err;
00230     }
00231     return err;
00232 }
00233 
00234 
00235 #endif // ARM_UC_MM_CONTEXT_TYPES_H