Mayank Gupta / Mbed OS pelion-example-frdm

Dependencies:   FXAS21002 FXOS8700Q

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_config.h"
00027 #include "update-client-common/arm_uc_scheduler.h"
00028 #include "update-client-manifest-manager/arm-pal-kv.h"
00029 
00030 
00031 struct arm_uc_mmInitContext_t {
00032     uint64_t timestamp;
00033     uint32_t state;
00034     arm_uc_buffer_t manifest;
00035     arm_uc_buffer_t keyPath;
00036     uint32_t loopCounters[1];
00037 
00038     arm_uc_callback_t callbackStorage; // initialized in hub
00039     struct {
00040         unsigned root: 1;
00041         unsigned depidx: 3;
00042         unsigned missingDep: 1;
00043     };
00044     uint8_t rootManifestBasePath[sizeof(MANIFEST_PREFIX "..") + CFSTORE_HASH_ID_SIZE];
00045     uint8_t pathBuffer[220];
00046     uint8_t manifestBuffer[640];
00047     uint8_t currentHash [MAX_HASH_BYTES];
00048 
00049 };
00050 
00051 struct arm_uc_mm_get_latest_ts_context {
00052     uint64_t current_ts;
00053     uint64_t *max_ts;
00054     uint32_t state;
00055     arm_uc_buffer_t current_data;
00056     arm_uc_buffer_t max_ts_key;
00057 };
00058 
00059 enum arm_uc_mm_pk_sig_state {
00060     UCMM_PKSIG_STATE_INVALID = 0,
00061     UCMM_PKSIG_STATE_IDLE,
00062     UCMM_PKSIG_STATE_FIND_CA,
00063     UCMM_PKSIG_STATE_FINDING_CA,
00064     UCMM_PKSIG_STATE_CHECK,
00065 };
00066 
00067 enum arm_uc_mm_psk_sig_state {
00068     ARM_UC_MM_PSKSIG_STATE_INVALID = 0,
00069     ARM_UC_MM_PSKSIG_STATE_IDLE,
00070     ARM_UC_MM_PSKSIG_STATE_FIND_PSK,
00071     ARM_UC_MM_PSKSIG_STATE_FINDING_PSK,
00072     ARM_UC_MM_PSKSIG_STATE_FIND_SIG_START,
00073     ARM_UC_MM_PSKSIG_STATE_FIND_SIG,
00074     ARM_UC_MM_PSKSIG_STATE_VERIFY,
00075 };
00076 
00077 typedef struct arm_uc_mm_validate_signature_context {
00078     union {
00079         enum arm_uc_mm_pk_sig_state  pk_state;
00080         enum arm_uc_mm_psk_sig_state psk_state;
00081     };
00082     void (* applicationEventHandler)(uintptr_t);
00083     union {
00084 #if defined(ARM_UC_FEATURE_MANIFEST_PUBKEY) && (ARM_UC_FEATURE_MANIFEST_PUBKEY == 1)
00085         struct {
00086             arm_uc_buffer_t  fingerprint;
00087             arm_uc_buffer_t  certList;
00088             arm_uc_buffer_t  cert;
00089         };
00090 #endif /* ARM_UC_FEATURE_MANIFEST_PUBKEY */
00091 #if defined(ARM_UC_FEATURE_MANIFEST_PSK) && (ARM_UC_FEATURE_MANIFEST_PSK == 1)
00092         struct {
00093             arm_uc_buffer_t  PSKid;
00094             int              keyTableVersion;
00095             arm_uc_buffer_t  keyTableRef;
00096             arm_uc_buffer_t  keyTableIV;
00097             arm_uc_buffer_t  PSK;
00098             arm_uc_buffer_t  cipherText;
00099         };
00100 #endif /* ARM_UC_FEATURE_MANIFEST_PSK */
00101     };
00102     arm_uc_buffer_t *manifest;
00103     arm_uc_error_t   storedError;
00104     uint32_t         sigIndex;
00105     uint32_t         encryptionMode;
00106 } arm_uc_mm_validate_signature_context_t;
00107 
00108 #define ARM_UC_MM_FW_STATE_LIST\
00109     ENUM_FIXED(ARM_UC_MM_FW_STATE_INVALID,0)\
00110     ENUM_AUTO(ARM_UC_MM_FW_STATE_IDLE)\
00111     ENUM_AUTO(ARM_UC_MM_FW_STATE_BEGIN)\
00112     ENUM_AUTO(ARM_UC_MM_FW_STATE_FIND_ROOT)\
00113     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_TS)\
00114     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_NAME)\
00115     ENUM_AUTO(ARM_UC_MM_FW_STATE_FIND_NEXT_ROOT)\
00116     ENUM_AUTO(ARM_UC_MM_FW_STATE_FORMAT_ROOT_PREFIX)\
00117     ENUM_AUTO(ARM_UC_MM_FW_STATE_FIND_MANIFEST)\
00118     ENUM_AUTO(ARM_UC_MM_FW_STATE_READ_MANIFEST)\
00119     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_ROOT)\
00120     ENUM_AUTO(ARM_UC_MM_FW_STATE_FIND_URI)\
00121     ENUM_AUTO(ARM_UC_MM_FW_STATE_READ_URI)\
00122     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_URI_KEY)\
00123     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_HASH)\
00124     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_DEP_URI)\
00125     ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_DEP_HASH)\
00126     ENUM_AUTO(ARM_UC_MM_FW_STATE_GET_FW_REF)\
00127     ENUM_AUTO(ARM_UC_MM_FW_STATE_NOTIFY)\
00128     ENUM_AUTO(ARM_UC_MM_FW_STATE_ROOT_NOTIFY_WAIT)\
00129     ENUM_AUTO(ARM_UC_MM_FW_STATE_NEXT_IMAGE)\
00130     ENUM_AUTO(ARM_UC_MM_FW_STATE_DONE)\
00131 
00132 
00133 enum arm_uc_mm_fw_state {
00134 #define ENUM_AUTO(name) name,
00135 #define ENUM_FIXED(name, val) name = val,
00136     ARM_UC_MM_FW_STATE_LIST
00137 #undef ENUM_AUTO
00138 #undef ENUM_FIXED
00139 };
00140 
00141 struct arm_uc_mm_fw_context_t {
00142     struct arm_uc_mm_get_latest_ts_context getLatestTs;
00143     uint64_t ts;
00144     arm_uc_manifest_handle_t *ID;
00145     enum arm_uc_mm_fw_state state;
00146     struct manifest_firmware_info_t *info;
00147     arm_uc_callback_t callbackStorage; // initialized in hub
00148     arm_uc_buffer_t current_data;
00149     char hashIDbuffer[CFSTORE_HASH_ID_SIZE];
00150     uint8_t keyBuffer[ARM_PAL_KV_KEY_MAX_PATH];
00151 };
00152 
00153 #define ARM_UC_MM_INS_STATE_LIST\
00154     ENUM_FIXED(ARM_UC_MM_INS_STATE_INVALID,0)\
00155     ENUM_AUTO(ARM_UC_MM_INS_STATE_IDLE)\
00156     ENUM_AUTO(ARM_UC_MM_INS_STATE_BEGIN)\
00157     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_BASIC_PARAMS)\
00158     ENUM_AUTO(ARM_UC_MM_INS_STATE_HASH_VERIFY)\
00159     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_SIG_LOOP)\
00160     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_SIG_START)\
00161     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_SIG_WAIT)\
00162     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_PARAMS)\
00163     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_APP)\
00164     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_FAIL)\
00165     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_DONE)\
00166     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_BEGIN)\
00167     ENUM_AUTO(ARM_UC_MM_INS_STATE_MATCHING)\
00168     ENUM_AUTO(ARM_UC_MM_INS_STATE_MATCH_FETCHING)\
00169     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_MANIFEST_BEGIN)\
00170     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_MANIFEST)\
00171     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_FW_URI)\
00172     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_FW_HASH)\
00173     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_AES)\
00174     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_DEPS)\
00175     ENUM_AUTO(ARM_UC_MM_INS_STATE_DEPSTART)\
00176     ENUM_AUTO(ARM_UC_MM_INS_STATE_DEP_WAITING)\
00177     ENUM_AUTO(ARM_UC_MM_INS_STATE_COMPLETION)\
00178     ENUM_AUTO(ARM_UC_MM_INS_STATE_COMPLETION_FINDING)\
00179     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_TS_START)\
00180     ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_TS)\
00181     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_TS_START)\
00182     ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_TS)\
00183     ENUM_AUTO(ARM_UC_MM_INS_STATE_DEP_CHECK)\
00184     ENUM_AUTO(ARM_UC_MM_INS_STATE_DEP_CHECKING)\
00185     ENUM_AUTO(ARM_UC_MM_INS_STATE_DEP_DELETE)\
00186     ENUM_AUTO(ARM_UC_MM_INS_STATE_DONE)\
00187     ENUM_AUTO(ARM_UC_MM_INS_STATE_ALERT)\
00188 
00189 
00190 enum arm_uc_mm_insert_state {
00191 #define ENUM_AUTO(name) name,
00192 #define ENUM_FIXED(name, val) name = val,
00193     ARM_UC_MM_INS_STATE_LIST
00194 #undef ENUM_AUTO
00195 #undef ENUM_FIXED
00196 };
00197 
00198 struct arm_uc_mmInsertContext_t {
00199     struct arm_uc_mm_get_latest_ts_context getLatestTs;
00200     arm_uc_mm_validate_signature_context_t signatureContext;
00201     uint64_t max_ts;
00202     uint64_t current_ts;
00203     arm_uc_manifest_handle_t *ID;
00204     enum arm_uc_mm_insert_state state;
00205     arm_uc_callback_t callbackStorage; // initialized in hub
00206     arm_uc_buffer_t manifest;
00207     arm_uc_mm_crypto_flags_t cryptoMode;
00208     arm_uc_buffer_t certificateStorage;
00209     uint32_t loopCounters[1];
00210 };
00211 
00212 struct arm_uc_mmContext_t {
00213     // Operational Contexts
00214     union {
00215         struct arm_uc_mmInitContext_t   init;
00216         struct arm_uc_mm_fw_context_t   getFw;
00217         struct arm_uc_mmInsertContext_t insert;
00218     };
00219 };
00220 typedef struct arm_uc_mmContext_t arm_uc_mmContext_t;
00221 
00222 
00223 enum arm_uc_mmState_t {
00224     ARM_UC_MM_STATE_INVALID = 0,
00225     ARM_UC_MM_STATE_IDLE,
00226     ARM_UC_MM_STATE_INIT,
00227     ARM_UC_MM_STATE_INSERTING,
00228     ARM_UC_MM_STATE_STORING_CA,
00229     ARM_UC_MM_STATE_FWINFO,
00230     ARM_UC_MM_STATE_TEST,
00231 };
00232 
00233 typedef void (*ARM_UC_mmTestHook_t)(const char *, arm_uc_mmContext_t *, uint32_t, uint32_t, arm_uc_error_t);
00234 
00235 struct arm_uc_mmPersistentContext_t {
00236     enum arm_uc_mmState_t state;
00237     arm_uc_error_t reportedError;
00238     const char *errorFile;
00239     uint32_t errorLine;
00240     struct arm_uc_mmContext_t **ctx;
00241     arm_uc_callback_t applicationCallbackStorage; // initialized in mmCommon
00242     void (*applicationEventHandler)(uintptr_t);
00243     arm_uc_error_t (*testFSM)(uint32_t event);
00244 #if ARM_UC_MM_ENABLE_TEST_VECTORS
00245     ARM_UC_mmTestHook_t testHook;
00246 #endif
00247 };
00248 
00249 typedef struct arm_uc_mmPersistentContext_t arm_uc_mmPersistentContext_t;
00250 extern arm_uc_mmPersistentContext_t arm_uc_mmPersistentContext;
00251 
00252 static inline arm_uc_mmContext_t *arm_uc_mmBuf2Context(arm_uc_buffer_t *b)
00253 {
00254     return (arm_uc_mmContext_t *)b->ptr;
00255 }
00256 
00257 static inline arm_uc_error_t arm_uc_mmContextBufSizeCheck(arm_uc_buffer_t *b)
00258 {
00259     arm_uc_error_t err = { .code = ERR_NONE };
00260     if (b->size_max < sizeof(arm_uc_mmContext_t)) {
00261         err.code = MFST_ERR_SIZE;
00262         return err;
00263     }
00264     return err;
00265 }
00266 
00267 
00268 #endif // ARM_UC_MM_CONTEXT_TYPES_H