NuMaker connection with AWS IoT thru MQTT/HTTPS (Mbed OS 6)

Dependencies:   MQTT

Committer:
cyliang
Date:
Wed Mar 01 03:54:59 2023 +0000
Revision:
49:ccbacce17f7a
Parent:
46:871e0ad86526
Update os v6.17.0 for M467 target

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ccli8 29:e890b0fdce53 1 /*
ccli8 29:e890b0fdce53 2 * Copyright (c) 2019 Nuvoton Technology Corporation
ccli8 29:e890b0fdce53 3 *
ccli8 29:e890b0fdce53 4 * SPDX-License-Identifier: Apache-2.0
ccli8 29:e890b0fdce53 5 *
ccli8 29:e890b0fdce53 6 * Licensed under the Apache License, Version 2.0 (the "License");
ccli8 29:e890b0fdce53 7 * you may not use this file except in compliance with the License.
ccli8 29:e890b0fdce53 8 * You may obtain a copy of the License at
ccli8 29:e890b0fdce53 9 *
ccli8 29:e890b0fdce53 10 * http://www.apache.org/licenses/LICENSE-2.0
ccli8 29:e890b0fdce53 11 *
ccli8 29:e890b0fdce53 12 * Unless required by applicable law or agreed to in writing, software
ccli8 29:e890b0fdce53 13 * distributed under the License is distributed on an "AS IS" BASIS,
ccli8 29:e890b0fdce53 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ccli8 29:e890b0fdce53 15 * See the License for the specific language governing permissions and
ccli8 29:e890b0fdce53 16 * limitations under the License.
ccli8 29:e890b0fdce53 17 */
ccli8 29:e890b0fdce53 18
ccli8 29:e890b0fdce53 19 #include "mbed.h"
ccli8 29:e890b0fdce53 20 #include "mbedtls/config.h"
ccli8 29:e890b0fdce53 21 #include "entropy_poll.h"
ccli8 41:b878d7cd7035 22 //#include "psa/crypto.h"
ccli8 46:871e0ad86526 23 #if DEVICE_FLASH
ccli8 29:e890b0fdce53 24 #include "kvstore_global_api.h"
ccli8 29:e890b0fdce53 25 #include "KVStore.h"
ccli8 29:e890b0fdce53 26 #include "TDBStore.h"
ccli8 29:e890b0fdce53 27 #include "KVMap.h"
ccli8 29:e890b0fdce53 28 #include "kv_config.h"
ccli8 46:871e0ad86526 29 #endif
ccli8 29:e890b0fdce53 30
ccli8 29:e890b0fdce53 31 #ifndef __STDC_FORMAT_MACROS
ccli8 29:e890b0fdce53 32 #define __STDC_FORMAT_MACROS
ccli8 29:e890b0fdce53 33 #endif
ccli8 29:e890b0fdce53 34 #include <inttypes.h>
ccli8 29:e890b0fdce53 35
ccli8 29:e890b0fdce53 36 /* Simulate provision process for development
ccli8 29:e890b0fdce53 37 *
ccli8 29:e890b0fdce53 38 * 1. Reset kvstore
ccli8 29:e890b0fdce53 39 * 2. Inject entropy seed (if no entropy source)
ccli8 29:e890b0fdce53 40 * 3. Initialize user filesystem (if enabled)
ccli8 29:e890b0fdce53 41 * 4. Mark the device as provisioned
ccli8 29:e890b0fdce53 42 *
ccli8 29:e890b0fdce53 43 * WARNING: For mass production, remove this file and run real provision process.
ccli8 29:e890b0fdce53 44 */
ccli8 29:e890b0fdce53 45
ccli8 29:e890b0fdce53 46 /* Check weak reference/definition at the link:
ccli8 29:e890b0fdce53 47 * http://www.keil.com/support/man/docs/ARMLINK/armlink_pge1362065917715.htm */
ccli8 29:e890b0fdce53 48
ccli8 29:e890b0fdce53 49 extern "C" {
ccli8 29:e890b0fdce53 50 MBED_USED void provision(void);
ccli8 29:e890b0fdce53 51 }
ccli8 29:e890b0fdce53 52
ccli8 29:e890b0fdce53 53 /* Stringize */
ccli8 29:e890b0fdce53 54 #define STR_EXPAND(tok) #tok
ccli8 29:e890b0fdce53 55 #define STR(tok) STR_EXPAND(tok)
ccli8 29:e890b0fdce53 56
ccli8 29:e890b0fdce53 57 #define _GET_FILESYSTEM_concat(dev, ...) _get_filesystem_##dev(__VA_ARGS__)
ccli8 29:e890b0fdce53 58 #define GET_FILESYSTEM(dev, ...) _GET_FILESYSTEM_concat(dev, __VA_ARGS__)
ccli8 29:e890b0fdce53 59
ccli8 29:e890b0fdce53 60 /* Key for the device provisioned */
ccli8 29:e890b0fdce53 61 #define KV_KEY_PROVISION "provision"
ccli8 29:e890b0fdce53 62
ccli8 29:e890b0fdce53 63 void provision(void)
ccli8 29:e890b0fdce53 64 {
ccli8 42:fa6f7f79a112 65 #if DEVICE_FLASH
ccli8 42:fa6f7f79a112 66
ccli8 29:e890b0fdce53 67 int kv_reset(const char *kvstore_path);
ccli8 29:e890b0fdce53 68
ccli8 29:e890b0fdce53 69 /* Initialize kvstore */
ccli8 29:e890b0fdce53 70 int kv_status = kv_init_storage_config();
ccli8 29:e890b0fdce53 71 if (kv_status != MBED_SUCCESS) {
ccli8 29:e890b0fdce53 72 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_UNKNOWN), "Initialize kvstore failed", kv_status);
ccli8 29:e890b0fdce53 73 }
ccli8 29:e890b0fdce53 74
ccli8 29:e890b0fdce53 75 /* Get kvstore internal storage */
ccli8 29:e890b0fdce53 76 KVMap &kv_map = KVMap::get_instance();
ccli8 29:e890b0fdce53 77 KVStore *inner_store = kv_map.get_internal_kv_instance(NULL);
ccli8 29:e890b0fdce53 78 if (inner_store == NULL) {
ccli8 29:e890b0fdce53 79 MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_UNKNOWN), "kvstore internal storage failed");
ccli8 29:e890b0fdce53 80 }
ccli8 29:e890b0fdce53 81
ccli8 29:e890b0fdce53 82 /* Check if the device has provisioned */
ccli8 29:e890b0fdce53 83 KVStore::info_t kv_info;
ccli8 29:e890b0fdce53 84 kv_status = inner_store->get_info(KV_KEY_PROVISION, &kv_info);
ccli8 29:e890b0fdce53 85 if (kv_status == MBED_SUCCESS) {
ccli8 29:e890b0fdce53 86 do {
ccli8 29:e890b0fdce53 87 /* Get KV_KEY_PROVISION key */
ccli8 29:e890b0fdce53 88 char buffer[4];
ccli8 29:e890b0fdce53 89 size_t actual_size = 0;
ccli8 29:e890b0fdce53 90 int kv_status = inner_store->get(KV_KEY_PROVISION, buffer, sizeof(buffer), &actual_size);
ccli8 29:e890b0fdce53 91 if (kv_status != MBED_SUCCESS) {
ccli8 29:e890b0fdce53 92 printf("Get \'%s\' failed: %d\r\n", KV_KEY_PROVISION, kv_status);
ccli8 29:e890b0fdce53 93 break;
ccli8 29:e890b0fdce53 94 }
ccli8 29:e890b0fdce53 95 /* Check KV_KEY_PROVISION key's value */
ccli8 29:e890b0fdce53 96 if (actual_size != 1 || buffer[0] != '1') {
ccli8 29:e890b0fdce53 97 printf("\"%s\" not equal \"%s\"\r\n", KV_KEY_PROVISION, "1");
ccli8 29:e890b0fdce53 98 break;
ccli8 29:e890b0fdce53 99 }
ccli8 29:e890b0fdce53 100
ccli8 29:e890b0fdce53 101 printf("The device has provisioned. Skip provision process\r\n");
ccli8 29:e890b0fdce53 102 return;
ccli8 29:e890b0fdce53 103 } while (0);
ccli8 29:e890b0fdce53 104 } else if (kv_status == MBED_ERROR_ITEM_NOT_FOUND) {
ccli8 29:e890b0fdce53 105 /* Not provisioned yet */
ccli8 29:e890b0fdce53 106 printf("The device has not provisioned yet. Try to provision it...\r\n");
ccli8 29:e890b0fdce53 107 } else {
ccli8 29:e890b0fdce53 108 printf("Get \'%s\' key failed: %d\r\n", KV_KEY_PROVISION, kv_status);
ccli8 29:e890b0fdce53 109 }
ccli8 29:e890b0fdce53 110
ccli8 29:e890b0fdce53 111 /* Provision from here */
ccli8 29:e890b0fdce53 112 printf("Provision for development...\r\n");
ccli8 29:e890b0fdce53 113
ccli8 29:e890b0fdce53 114 printf("Reset kvstore...\r\n");
ccli8 29:e890b0fdce53 115
ccli8 29:e890b0fdce53 116 /* Reset kvstore for clean kvstore */
ccli8 29:e890b0fdce53 117 kv_status = kv_reset("/" STR(MBED_CONF_STORAGE_DEFAULT_KV) "/");
ccli8 29:e890b0fdce53 118 if (kv_status != MBED_SUCCESS) {
ccli8 29:e890b0fdce53 119 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_UNKNOWN), "kv_reset() failed", kv_status);
ccli8 29:e890b0fdce53 120 }
ccli8 29:e890b0fdce53 121
ccli8 29:e890b0fdce53 122 printf("\rReset kvstore...OK\r\n");
ccli8 29:e890b0fdce53 123
ccli8 42:fa6f7f79a112 124 #if !DEVICE_TRNG && !TARGET_PSA && !TARGET_PSA_Target
ccli8 29:e890b0fdce53 125 #if !defined(MBEDTLS_ENTROPY_HARDWARE_ALT)
ccli8 29:e890b0fdce53 126 /* Inject trivial seed for development */
ccli8 29:e890b0fdce53 127
ccli8 29:e890b0fdce53 128 printf("Inject NV seed...\r\n");
ccli8 29:e890b0fdce53 129
ccli8 29:e890b0fdce53 130 psa_status_t psa_status;
ccli8 29:e890b0fdce53 131 uint8_t seed[SEED_SIZE] = { 0 };
ccli8 29:e890b0fdce53 132
ccli8 29:e890b0fdce53 133 /* First inject seed, expect OK or seed has injected by some provision process */
ccli8 29:e890b0fdce53 134 psa_status = mbedtls_psa_inject_entropy(seed, sizeof(seed));
ccli8 29:e890b0fdce53 135 if (psa_status != PSA_SUCCESS && psa_status != PSA_ERROR_NOT_PERMITTED) {
ccli8 29:e890b0fdce53 136 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_UNKNOWN), "Inject entropy failed", psa_status);
ccli8 29:e890b0fdce53 137 }
ccli8 29:e890b0fdce53 138
ccli8 29:e890b0fdce53 139 /* Second inject seed, expect seed has injected above or by some provision process */
ccli8 29:e890b0fdce53 140 psa_status = mbedtls_psa_inject_entropy(seed, sizeof(seed));
ccli8 29:e890b0fdce53 141 if (psa_status != PSA_ERROR_NOT_PERMITTED) {
ccli8 29:e890b0fdce53 142 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_UNKNOWN), "Re-jnject entropy expects PSA_ERROR_NOT_PERMITTED", psa_status);
ccli8 29:e890b0fdce53 143 }
ccli8 29:e890b0fdce53 144
ccli8 29:e890b0fdce53 145 printf("\rInject NV seed...OK\r\n");
ccli8 29:e890b0fdce53 146 #endif /* !defined(MBEDTLS_ENTROPY_HARDWARE_ALT) */
ccli8 42:fa6f7f79a112 147 #endif /* #if !DEVICE_TRNG && !TARGET_PSA && !TARGET_PSA_Target */
ccli8 29:e890b0fdce53 148
ccli8 29:e890b0fdce53 149 /* Mark the device as provisioned */
ccli8 29:e890b0fdce53 150 kv_status = inner_store->set(KV_KEY_PROVISION, "1", 1, KVStore::WRITE_ONCE_FLAG);
ccli8 29:e890b0fdce53 151 if (kv_status != MBED_SUCCESS) {
ccli8 29:e890b0fdce53 152 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_UNKNOWN), "Mark the device as provisioned failed", kv_status);
ccli8 29:e890b0fdce53 153 }
ccli8 29:e890b0fdce53 154
ccli8 29:e890b0fdce53 155 printf("Provision for development...OK\r\n");
ccli8 42:fa6f7f79a112 156
ccli8 42:fa6f7f79a112 157 #endif /* #if DEVICE_FLASH */
ccli8 29:e890b0fdce53 158 }