Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FXAS21002 FXOS8700Q
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
Generated on Tue Jul 12 2022 20:21:03 by
