From 938b93b02b40afb0ac3448a4d5b726d9e43073c5 Mon Sep 17 00:00:00 2001
From: Alexey Stratulat <alexey.stratulat@demlabs.net>
Date: Mon, 15 Jul 2019 13:29:28 +0700
Subject: [PATCH] [+] Added a list of keys for transferring a key to Python and
 receiving a key from it

---
 include/key_list.h | 18 +++++++++++++++
 src/key_list.c     | 57 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 75 insertions(+)
 create mode 100644 include/key_list.h
 create mode 100644 src/key_list.c

diff --git a/include/key_list.h b/include/key_list.h
new file mode 100644
index 00000000..adb0783c
--- /dev/null
+++ b/include/key_list.h
@@ -0,0 +1,18 @@
+#include "dap_common.h"
+#include "dap_enc_key.h"
+#include <stdint.h>
+#include <string.h>
+
+#undef LOG_TAG
+#define LOG_TAG "key-list"
+
+typedef struct key_list{
+    dap_enc_key_t **keys;
+    uint8_t lenght;
+}key_list_t;
+
+key_list_t *key_list_init();
+void key_list_free(key_list_t* list);
+uint8_t key_list_add_element(key_list_t *list, dap_enc_key_t* key);
+bool key_list_del_element(key_list_t *list, uint8_t key);
+dap_enc_key_t *key_list_get_key(key_list_t *list, uint8_t key);
\ No newline at end of file
diff --git a/src/key_list.c b/src/key_list.c
new file mode 100644
index 00000000..9f09de1a
--- /dev/null
+++ b/src/key_list.c
@@ -0,0 +1,57 @@
+#include "key_list.h"
+
+key_list_t *key_list_init()
+{
+    key_list_t *keyList = (key_list_t *)malloc(sizeof(key_list_t));
+    keyList->lenght = 0;
+    return keyList;
+}
+
+void key_list_free(key_list_t* list){
+    for (int i=0; i < list->lenght;i++){
+        free(list->keys[i]);
+    }
+    free(list);
+}
+
+uint8_t key_list_add_element(key_list_t *list, dap_enc_key_t* key){
+    uint8_t new_len = list->lenght;
+    new_len++;
+    dap_enc_key_t **new_keys = calloc(new_len, sizeof(dap_enc_key_t));
+    if (list->lenght != 0) {
+        memcpy(new_keys, list->keys, list->lenght);
+        free(list->keys);
+    }
+    new_keys[new_len - 1] = key;
+    list->keys = new_keys;
+    list->lenght = new_len;
+    return new_len;
+
+}
+
+bool key_list_del_element(key_list_t *list, uint8_t key_id){
+    if ((list->lenght-1) > 0) {
+        return false;
+    }
+    uint8_t new_len = list->lenght;
+    new_len--;
+    dap_enc_key_t **new_keys = calloc(new_len, sizeof(dap_enc_key_t));
+    if (list->lenght - 1 == key_id){
+        memcpy(new_keys, list->keys, key_id);
+    } else if (list->lenght > 1 && key_id < list->lenght) {
+        memcpy(new_keys, list->keys, key_id);
+        memcpy(new_keys + key_id, list->keys + (key_id + 1), list->lenght);
+    }
+    free(list->keys);
+    list->keys = new_keys;
+    list->lenght = new_len;
+    return true;
+}
+
+dap_enc_key_t *key_list_get_key(key_list_t *list, uint8_t key){
+    uint8_t index = key - 1;
+    if (list->lenght < index) {
+        return NULL;
+    }
+    return list->keys[index];
+}
\ No newline at end of file
-- 
GitLab