Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 31 06:02:27 2019 +0000
Revision:
1:9db0e321a9f4
Parent:
0:5b88d5760320
updated based on mbed-os5.15.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /* mbed Microcontroller Library
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2018 ARM Limited
kenjiArai 0:5b88d5760320 3 *
kenjiArai 0:5b88d5760320 4 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 0:5b88d5760320 5 * you may not use this file except in compliance with the License.
kenjiArai 0:5b88d5760320 6 * You may obtain a copy of the License at
kenjiArai 0:5b88d5760320 7 *
kenjiArai 0:5b88d5760320 8 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 0:5b88d5760320 9 *
kenjiArai 0:5b88d5760320 10 * Unless required by applicable law or agreed to in writing, software
kenjiArai 0:5b88d5760320 11 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 0:5b88d5760320 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 0:5b88d5760320 13 * See the License for the specific language governing permissions and
kenjiArai 0:5b88d5760320 14 * limitations under the License.
kenjiArai 0:5b88d5760320 15 */
kenjiArai 0:5b88d5760320 16
kenjiArai 0:5b88d5760320 17 #ifndef GENERIC_MEMORY_SECURITY_DB_H_
kenjiArai 0:5b88d5760320 18 #define GENERIC_MEMORY_SECURITY_DB_H_
kenjiArai 0:5b88d5760320 19
kenjiArai 0:5b88d5760320 20 #include "SecurityDb.h"
kenjiArai 0:5b88d5760320 21
kenjiArai 0:5b88d5760320 22 namespace ble {
kenjiArai 0:5b88d5760320 23 namespace generic {
kenjiArai 0:5b88d5760320 24
kenjiArai 0:5b88d5760320 25 /** Naive memory implementation for verification. */
kenjiArai 0:5b88d5760320 26 class MemorySecurityDb : public SecurityDb {
kenjiArai 0:5b88d5760320 27 private:
kenjiArai 0:5b88d5760320 28 struct entry_t {
kenjiArai 0:5b88d5760320 29 entry_t() { };
kenjiArai 0:5b88d5760320 30 SecurityDistributionFlags_t flags;
kenjiArai 0:5b88d5760320 31 SecurityEntryKeys_t local_keys;
kenjiArai 0:5b88d5760320 32 SecurityEntryKeys_t peer_keys;
kenjiArai 0:5b88d5760320 33 SecurityEntryIdentity_t peer_identity;
kenjiArai 0:5b88d5760320 34 SecurityEntrySigning_t peer_signing;
kenjiArai 0:5b88d5760320 35 };
kenjiArai 0:5b88d5760320 36
kenjiArai 0:5b88d5760320 37 static const size_t MAX_ENTRIES = 5;
kenjiArai 0:5b88d5760320 38
kenjiArai 0:5b88d5760320 39 static entry_t* as_entry(entry_handle_t db_handle)
kenjiArai 0:5b88d5760320 40 {
kenjiArai 0:5b88d5760320 41 return reinterpret_cast<entry_t*>(db_handle);
kenjiArai 0:5b88d5760320 42 }
kenjiArai 0:5b88d5760320 43
kenjiArai 0:5b88d5760320 44 public:
kenjiArai 0:5b88d5760320 45 MemorySecurityDb() : SecurityDb() { }
kenjiArai 0:5b88d5760320 46 virtual ~MemorySecurityDb() { }
kenjiArai 0:5b88d5760320 47
kenjiArai 0:5b88d5760320 48 virtual SecurityDistributionFlags_t* get_distribution_flags(
kenjiArai 0:5b88d5760320 49 entry_handle_t db_handle
kenjiArai 0:5b88d5760320 50 ) {
kenjiArai 0:5b88d5760320 51 return reinterpret_cast<SecurityDistributionFlags_t*>(db_handle);
kenjiArai 0:5b88d5760320 52 }
kenjiArai 0:5b88d5760320 53
kenjiArai 0:5b88d5760320 54 /* local keys */
kenjiArai 0:5b88d5760320 55
kenjiArai 0:5b88d5760320 56 /* set */
kenjiArai 0:5b88d5760320 57 virtual void set_entry_local_ltk(
kenjiArai 0:5b88d5760320 58 entry_handle_t db_handle,
kenjiArai 0:5b88d5760320 59 const ltk_t &ltk
kenjiArai 0:5b88d5760320 60 ) {
kenjiArai 0:5b88d5760320 61 entry_t *entry = as_entry(db_handle);
kenjiArai 0:5b88d5760320 62 if (entry) {
kenjiArai 0:5b88d5760320 63 entry->flags.ltk_sent = true;
kenjiArai 0:5b88d5760320 64 entry->local_keys.ltk = ltk;
kenjiArai 0:5b88d5760320 65 }
kenjiArai 0:5b88d5760320 66 }
kenjiArai 0:5b88d5760320 67
kenjiArai 0:5b88d5760320 68 virtual void set_entry_local_ediv_rand(
kenjiArai 0:5b88d5760320 69 entry_handle_t db_handle,
kenjiArai 0:5b88d5760320 70 const ediv_t &ediv,
kenjiArai 0:5b88d5760320 71 const rand_t &rand
kenjiArai 0:5b88d5760320 72 ) {
kenjiArai 0:5b88d5760320 73 entry_t *entry = as_entry(db_handle);
kenjiArai 0:5b88d5760320 74 if (entry) {
kenjiArai 0:5b88d5760320 75 entry->local_keys.ediv = ediv;
kenjiArai 0:5b88d5760320 76 entry->local_keys.rand = rand;
kenjiArai 0:5b88d5760320 77 }
kenjiArai 0:5b88d5760320 78 }
kenjiArai 0:5b88d5760320 79
kenjiArai 0:5b88d5760320 80 /* peer's keys */
kenjiArai 0:5b88d5760320 81
kenjiArai 0:5b88d5760320 82 /* set */
kenjiArai 0:5b88d5760320 83
kenjiArai 0:5b88d5760320 84 virtual void set_entry_peer_ltk(
kenjiArai 0:5b88d5760320 85 entry_handle_t db_handle,
kenjiArai 0:5b88d5760320 86 const ltk_t &ltk
kenjiArai 0:5b88d5760320 87 ) {
kenjiArai 0:5b88d5760320 88 entry_t *entry = as_entry(db_handle);
kenjiArai 0:5b88d5760320 89 if (entry) {
kenjiArai 0:5b88d5760320 90 entry->peer_keys.ltk = ltk;
kenjiArai 0:5b88d5760320 91 entry->flags.ltk_stored = true;
kenjiArai 0:5b88d5760320 92 }
kenjiArai 0:5b88d5760320 93 }
kenjiArai 0:5b88d5760320 94
kenjiArai 0:5b88d5760320 95 virtual void set_entry_peer_ediv_rand(
kenjiArai 0:5b88d5760320 96 entry_handle_t db_handle,
kenjiArai 0:5b88d5760320 97 const ediv_t &ediv,
kenjiArai 0:5b88d5760320 98 const rand_t &rand
kenjiArai 0:5b88d5760320 99 ) {
kenjiArai 0:5b88d5760320 100 entry_t *entry = as_entry(db_handle);
kenjiArai 0:5b88d5760320 101 if (entry) {
kenjiArai 0:5b88d5760320 102 entry->peer_keys.ediv = ediv;
kenjiArai 0:5b88d5760320 103 entry->peer_keys.rand = rand;
kenjiArai 0:5b88d5760320 104 }
kenjiArai 0:5b88d5760320 105 }
kenjiArai 0:5b88d5760320 106
kenjiArai 0:5b88d5760320 107 virtual void set_entry_peer_irk(
kenjiArai 0:5b88d5760320 108 entry_handle_t db_handle,
kenjiArai 0:5b88d5760320 109 const irk_t &irk
kenjiArai 0:5b88d5760320 110 ) {
kenjiArai 0:5b88d5760320 111 entry_t *entry = as_entry(db_handle);
kenjiArai 0:5b88d5760320 112 if (entry) {
kenjiArai 0:5b88d5760320 113 entry->peer_identity.irk = irk;
kenjiArai 0:5b88d5760320 114 entry->flags.irk_stored = true;
kenjiArai 0:5b88d5760320 115 }
kenjiArai 0:5b88d5760320 116 }
kenjiArai 0:5b88d5760320 117
kenjiArai 0:5b88d5760320 118 virtual void set_entry_peer_bdaddr(
kenjiArai 0:5b88d5760320 119 entry_handle_t db_handle,
kenjiArai 0:5b88d5760320 120 bool address_is_public,
kenjiArai 0:5b88d5760320 121 const address_t &peer_address
kenjiArai 0:5b88d5760320 122 ) {
kenjiArai 0:5b88d5760320 123 entry_t *entry = as_entry(db_handle);
kenjiArai 0:5b88d5760320 124 if (entry) {
kenjiArai 0:5b88d5760320 125 entry->peer_identity.identity_address = peer_address;
kenjiArai 0:5b88d5760320 126 entry->peer_identity.identity_address_is_public = address_is_public;
kenjiArai 0:5b88d5760320 127 }
kenjiArai 0:5b88d5760320 128 }
kenjiArai 0:5b88d5760320 129
kenjiArai 0:5b88d5760320 130 virtual void set_entry_peer_csrk(
kenjiArai 0:5b88d5760320 131 entry_handle_t db_handle,
kenjiArai 0:5b88d5760320 132 const csrk_t &csrk
kenjiArai 0:5b88d5760320 133 ) {
kenjiArai 0:5b88d5760320 134 entry_t *entry = as_entry(db_handle);
kenjiArai 0:5b88d5760320 135 if (entry) {
kenjiArai 0:5b88d5760320 136 entry->flags.csrk_stored = true;
kenjiArai 0:5b88d5760320 137 entry->peer_signing.csrk = csrk;
kenjiArai 0:5b88d5760320 138 }
kenjiArai 0:5b88d5760320 139 }
kenjiArai 0:5b88d5760320 140
kenjiArai 0:5b88d5760320 141 virtual void set_entry_peer_sign_counter(
kenjiArai 0:5b88d5760320 142 entry_handle_t db_handle,
kenjiArai 0:5b88d5760320 143 sign_count_t sign_counter
kenjiArai 0:5b88d5760320 144 ) {
kenjiArai 0:5b88d5760320 145 entry_t *entry = as_entry(db_handle);
kenjiArai 0:5b88d5760320 146 if (entry) {
kenjiArai 0:5b88d5760320 147 entry->peer_signing.counter = sign_counter;
kenjiArai 0:5b88d5760320 148 }
kenjiArai 0:5b88d5760320 149 }
kenjiArai 0:5b88d5760320 150
kenjiArai 0:5b88d5760320 151 private:
kenjiArai 0:5b88d5760320 152 virtual uint8_t get_entry_count() {
kenjiArai 0:5b88d5760320 153 return MAX_ENTRIES;
kenjiArai 0:5b88d5760320 154 }
kenjiArai 0:5b88d5760320 155
kenjiArai 0:5b88d5760320 156 virtual SecurityDistributionFlags_t* get_entry_handle_by_index(uint8_t index) {
kenjiArai 0:5b88d5760320 157 if (index < MAX_ENTRIES) {
kenjiArai 0:5b88d5760320 158 return &_entries[index].flags;
kenjiArai 0:5b88d5760320 159 } else {
kenjiArai 0:5b88d5760320 160 return NULL;
kenjiArai 0:5b88d5760320 161 }
kenjiArai 0:5b88d5760320 162 }
kenjiArai 0:5b88d5760320 163
kenjiArai 0:5b88d5760320 164 virtual void reset_entry(entry_handle_t db_entry) {
kenjiArai 0:5b88d5760320 165 entry_t *entry = reinterpret_cast<entry_t*>(db_entry);
kenjiArai 0:5b88d5760320 166 *entry = entry_t();
kenjiArai 0:5b88d5760320 167 }
kenjiArai 0:5b88d5760320 168
kenjiArai 0:5b88d5760320 169 virtual SecurityEntryIdentity_t* read_in_entry_peer_identity(entry_handle_t db_entry) {
kenjiArai 0:5b88d5760320 170 entry_t *entry = reinterpret_cast<entry_t*>(db_entry);
kenjiArai 0:5b88d5760320 171 return &entry->peer_identity;
kenjiArai 0:5b88d5760320 172 };
kenjiArai 0:5b88d5760320 173
kenjiArai 0:5b88d5760320 174 virtual SecurityEntryKeys_t* read_in_entry_peer_keys(entry_handle_t db_entry) {
kenjiArai 0:5b88d5760320 175 entry_t *entry = reinterpret_cast<entry_t*>(db_entry);
kenjiArai 0:5b88d5760320 176 return &entry->peer_keys;
kenjiArai 0:5b88d5760320 177 };
kenjiArai 0:5b88d5760320 178
kenjiArai 0:5b88d5760320 179 virtual SecurityEntryKeys_t* read_in_entry_local_keys(entry_handle_t db_entry) {
kenjiArai 0:5b88d5760320 180 entry_t *entry = reinterpret_cast<entry_t*>(db_entry);
kenjiArai 0:5b88d5760320 181 return &entry->local_keys;
kenjiArai 0:5b88d5760320 182 };
kenjiArai 0:5b88d5760320 183
kenjiArai 0:5b88d5760320 184 virtual SecurityEntrySigning_t* read_in_entry_peer_signing(entry_handle_t db_entry) {
kenjiArai 0:5b88d5760320 185 entry_t *entry = reinterpret_cast<entry_t*>(db_entry);
kenjiArai 0:5b88d5760320 186 return &entry->peer_signing;
kenjiArai 0:5b88d5760320 187 };
kenjiArai 0:5b88d5760320 188
kenjiArai 0:5b88d5760320 189 private:
kenjiArai 0:5b88d5760320 190 entry_t _entries[MAX_ENTRIES];
kenjiArai 0:5b88d5760320 191 };
kenjiArai 0:5b88d5760320 192
kenjiArai 0:5b88d5760320 193 } /* namespace pal */
kenjiArai 0:5b88d5760320 194 } /* namespace ble */
kenjiArai 0:5b88d5760320 195
kenjiArai 0:5b88d5760320 196 #endif /*GENERIC_MEMORY_SECURITY_DB_H_*/