Example

Dependencies:   FXAS21002 FXOS8700Q

Revision:
0:11cc2b7889af
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/simple-mbed-cloud-client/mbed-cloud-client/update-client-hub/modules/manifest-manager/update-client-manifest-manager/update-client-manifest-manager-context.h	Tue Nov 19 09:49:38 2019 +0000
@@ -0,0 +1,268 @@
+// ----------------------------------------------------------------------------
+// Copyright 2016-2017 ARM Ltd.
+//
+// SPDX-License-Identifier: Apache-2.0
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// ----------------------------------------------------------------------------
+
+#ifndef ARM_UC_MM_CONTEXT_TYPES_H
+#define ARM_UC_MM_CONTEXT_TYPES_H
+
+#include "update-client-manifest-manager/update-client-manifest-types.h"
+#include "update-client-manifest-manager/../source/arm_uc_mmConfig.h"
+#include "update-client-common/arm_uc_error.h"
+#include "update-client-common/arm_uc_types.h"
+#include "update-client-common/arm_uc_config.h"
+#include "update-client-common/arm_uc_scheduler.h"
+#include "update-client-manifest-manager/arm-pal-kv.h"
+
+
+struct arm_uc_mmInitContext_t {
+    uint64_t timestamp;
+    uint32_t state;
+    arm_uc_buffer_t manifest;
+    arm_uc_buffer_t keyPath;
+    uint32_t loopCounters[1];
+
+    arm_uc_callback_t callbackStorage; // initialized in hub
+    struct {
+        unsigned root: 1;
+        unsigned depidx: 3;
+        unsigned missingDep: 1;
+    };
+    uint8_t rootManifestBasePath[sizeof(MANIFEST_PREFIX "..") + CFSTORE_HASH_ID_SIZE];
+    uint8_t pathBuffer[220];
+    uint8_t manifestBuffer[640];
+    uint8_t currentHash [MAX_HASH_BYTES];
+
+};
+
+struct arm_uc_mm_get_latest_ts_context {
+    uint64_t current_ts;
+    uint64_t *max_ts;
+    uint32_t state;
+    arm_uc_buffer_t current_data;
+    arm_uc_buffer_t max_ts_key;
+};
+
+enum arm_uc_mm_pk_sig_state {
+    UCMM_PKSIG_STATE_INVALID = 0,
+    UCMM_PKSIG_STATE_IDLE,
+    UCMM_PKSIG_STATE_FIND_CA,
+    UCMM_PKSIG_STATE_FINDING_CA,
+    UCMM_PKSIG_STATE_CHECK,
+};
+
+enum arm_uc_mm_psk_sig_state {
+    ARM_UC_MM_PSKSIG_STATE_INVALID = 0,
+    ARM_UC_MM_PSKSIG_STATE_IDLE,
+    ARM_UC_MM_PSKSIG_STATE_FIND_PSK,
+    ARM_UC_MM_PSKSIG_STATE_FINDING_PSK,
+    ARM_UC_MM_PSKSIG_STATE_FIND_SIG_START,
+    ARM_UC_MM_PSKSIG_STATE_FIND_SIG,
+    ARM_UC_MM_PSKSIG_STATE_VERIFY,
+};
+
+typedef struct arm_uc_mm_validate_signature_context {
+    union {
+        enum arm_uc_mm_pk_sig_state  pk_state;
+        enum arm_uc_mm_psk_sig_state psk_state;
+    };
+    void (* applicationEventHandler)(uintptr_t);
+    union {
+#if defined(ARM_UC_FEATURE_MANIFEST_PUBKEY) && (ARM_UC_FEATURE_MANIFEST_PUBKEY == 1)
+        struct {
+            arm_uc_buffer_t  fingerprint;
+            arm_uc_buffer_t  certList;
+            arm_uc_buffer_t  cert;
+        };
+#endif /* ARM_UC_FEATURE_MANIFEST_PUBKEY */
+#if defined(ARM_UC_FEATURE_MANIFEST_PSK) && (ARM_UC_FEATURE_MANIFEST_PSK == 1)
+        struct {
+            arm_uc_buffer_t  PSKid;
+            int              keyTableVersion;
+            arm_uc_buffer_t  keyTableRef;
+            arm_uc_buffer_t  keyTableIV;
+            arm_uc_buffer_t  PSK;
+            arm_uc_buffer_t  cipherText;
+        };
+#endif /* ARM_UC_FEATURE_MANIFEST_PSK */
+    };
+    arm_uc_buffer_t *manifest;
+    arm_uc_error_t   storedError;
+    uint32_t         sigIndex;
+    uint32_t         encryptionMode;
+} arm_uc_mm_validate_signature_context_t;
+
+#define ARM_UC_MM_FW_STATE_LIST\
+    ENUM_FIXED(ARM_UC_MM_FW_STATE_INVALID,0)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_IDLE)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_BEGIN)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_FIND_ROOT)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_TS)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_NAME)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_FIND_NEXT_ROOT)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_FORMAT_ROOT_PREFIX)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_FIND_MANIFEST)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_READ_MANIFEST)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_ROOT)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_FIND_URI)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_READ_URI)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_URI_KEY)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_HASH)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_DEP_URI)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_FETCH_DEP_HASH)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_GET_FW_REF)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_NOTIFY)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_ROOT_NOTIFY_WAIT)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_NEXT_IMAGE)\
+    ENUM_AUTO(ARM_UC_MM_FW_STATE_DONE)\
+
+
+enum arm_uc_mm_fw_state {
+#define ENUM_AUTO(name) name,
+#define ENUM_FIXED(name, val) name = val,
+    ARM_UC_MM_FW_STATE_LIST
+#undef ENUM_AUTO
+#undef ENUM_FIXED
+};
+
+struct arm_uc_mm_fw_context_t {
+    struct arm_uc_mm_get_latest_ts_context getLatestTs;
+    uint64_t ts;
+    arm_uc_manifest_handle_t *ID;
+    enum arm_uc_mm_fw_state state;
+    struct manifest_firmware_info_t *info;
+    arm_uc_callback_t callbackStorage; // initialized in hub
+    arm_uc_buffer_t current_data;
+    char hashIDbuffer[CFSTORE_HASH_ID_SIZE];
+    uint8_t keyBuffer[ARM_PAL_KV_KEY_MAX_PATH];
+};
+
+#define ARM_UC_MM_INS_STATE_LIST\
+    ENUM_FIXED(ARM_UC_MM_INS_STATE_INVALID,0)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_IDLE)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_BEGIN)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_BASIC_PARAMS)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_HASH_VERIFY)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_SIG_LOOP)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_SIG_START)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_SIG_WAIT)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_PARAMS)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_APP)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_FAIL)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_DONE)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_BEGIN)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_MATCHING)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_MATCH_FETCHING)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_MANIFEST_BEGIN)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_MANIFEST)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_FW_URI)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_FW_HASH)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_AES)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_DEPS)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_DEPSTART)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_DEP_WAITING)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_COMPLETION)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_COMPLETION_FINDING)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_TS_START)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_VERIFY_TS)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_TS_START)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_STORE_TS)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_DEP_CHECK)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_DEP_CHECKING)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_DEP_DELETE)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_DONE)\
+    ENUM_AUTO(ARM_UC_MM_INS_STATE_ALERT)\
+
+
+enum arm_uc_mm_insert_state {
+#define ENUM_AUTO(name) name,
+#define ENUM_FIXED(name, val) name = val,
+    ARM_UC_MM_INS_STATE_LIST
+#undef ENUM_AUTO
+#undef ENUM_FIXED
+};
+
+struct arm_uc_mmInsertContext_t {
+    struct arm_uc_mm_get_latest_ts_context getLatestTs;
+    arm_uc_mm_validate_signature_context_t signatureContext;
+    uint64_t max_ts;
+    uint64_t current_ts;
+    arm_uc_manifest_handle_t *ID;
+    enum arm_uc_mm_insert_state state;
+    arm_uc_callback_t callbackStorage; // initialized in hub
+    arm_uc_buffer_t manifest;
+    arm_uc_mm_crypto_flags_t cryptoMode;
+    arm_uc_buffer_t certificateStorage;
+    uint32_t loopCounters[1];
+};
+
+struct arm_uc_mmContext_t {
+    // Operational Contexts
+    union {
+        struct arm_uc_mmInitContext_t   init;
+        struct arm_uc_mm_fw_context_t   getFw;
+        struct arm_uc_mmInsertContext_t insert;
+    };
+};
+typedef struct arm_uc_mmContext_t arm_uc_mmContext_t;
+
+
+enum arm_uc_mmState_t {
+    ARM_UC_MM_STATE_INVALID = 0,
+    ARM_UC_MM_STATE_IDLE,
+    ARM_UC_MM_STATE_INIT,
+    ARM_UC_MM_STATE_INSERTING,
+    ARM_UC_MM_STATE_STORING_CA,
+    ARM_UC_MM_STATE_FWINFO,
+    ARM_UC_MM_STATE_TEST,
+};
+
+typedef void (*ARM_UC_mmTestHook_t)(const char *, arm_uc_mmContext_t *, uint32_t, uint32_t, arm_uc_error_t);
+
+struct arm_uc_mmPersistentContext_t {
+    enum arm_uc_mmState_t state;
+    arm_uc_error_t reportedError;
+    const char *errorFile;
+    uint32_t errorLine;
+    struct arm_uc_mmContext_t **ctx;
+    arm_uc_callback_t applicationCallbackStorage; // initialized in mmCommon
+    void (*applicationEventHandler)(uintptr_t);
+    arm_uc_error_t (*testFSM)(uint32_t event);
+#if ARM_UC_MM_ENABLE_TEST_VECTORS
+    ARM_UC_mmTestHook_t testHook;
+#endif
+};
+
+typedef struct arm_uc_mmPersistentContext_t arm_uc_mmPersistentContext_t;
+extern arm_uc_mmPersistentContext_t arm_uc_mmPersistentContext;
+
+static inline arm_uc_mmContext_t *arm_uc_mmBuf2Context(arm_uc_buffer_t *b)
+{
+    return (arm_uc_mmContext_t *)b->ptr;
+}
+
+static inline arm_uc_error_t arm_uc_mmContextBufSizeCheck(arm_uc_buffer_t *b)
+{
+    arm_uc_error_t err = { .code = ERR_NONE };
+    if (b->size_max < sizeof(arm_uc_mmContext_t)) {
+        err.code = MFST_ERR_SIZE;
+        return err;
+    }
+    return err;
+}
+
+
+#endif // ARM_UC_MM_CONTEXT_TYPES_H