1 | // Copyright (c) Microsoft. All rights reserved.
|
---|
2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
---|
3 |
|
---|
4 | #include <stdlib.h>
|
---|
5 | #include "umock_c/umock_c_prod.h"
|
---|
6 | #include "azure_c_shared_utility/gballoc.h"
|
---|
7 | #include "azure_c_shared_utility/urlencode.h"
|
---|
8 | #include "azure_c_shared_utility/xlogging.h"
|
---|
9 | #include "azure_c_shared_utility/crt_abstractions.h"
|
---|
10 |
|
---|
11 | #include "hsm_client_data.h"
|
---|
12 | #include "hsm_client_key.h"
|
---|
13 |
|
---|
14 | typedef struct HSM_CLIENT_KEY_INFO_TAG
|
---|
15 | {
|
---|
16 | char* symmetrical_key;
|
---|
17 | char* registration_name;
|
---|
18 | } HSM_CLIENT_KEY_INFO;
|
---|
19 |
|
---|
20 | HSM_CLIENT_HANDLE hsm_client_key_create(void)
|
---|
21 | {
|
---|
22 | HSM_CLIENT_KEY_INFO* result;
|
---|
23 | result = malloc(sizeof(HSM_CLIENT_KEY_INFO) );
|
---|
24 | if (result == NULL)
|
---|
25 | {
|
---|
26 | LogError("Failure: malloc HSM_CLIENT_KEY_INFO.");
|
---|
27 | }
|
---|
28 | else
|
---|
29 | {
|
---|
30 | memset(result, 0, sizeof(HSM_CLIENT_KEY_INFO));
|
---|
31 | }
|
---|
32 | return result;
|
---|
33 | }
|
---|
34 |
|
---|
35 | void hsm_client_key_destroy(HSM_CLIENT_HANDLE handle)
|
---|
36 | {
|
---|
37 | if (handle != NULL)
|
---|
38 | {
|
---|
39 | HSM_CLIENT_KEY_INFO* key_client = (HSM_CLIENT_KEY_INFO*)handle;
|
---|
40 | if (key_client->symmetrical_key != NULL)
|
---|
41 | {
|
---|
42 | free(key_client->symmetrical_key);
|
---|
43 | key_client->symmetrical_key = NULL;
|
---|
44 | }
|
---|
45 | if (key_client->registration_name != NULL)
|
---|
46 | {
|
---|
47 | free(key_client->registration_name);
|
---|
48 | key_client->registration_name = NULL;
|
---|
49 | }
|
---|
50 | free(key_client);
|
---|
51 | }
|
---|
52 | }
|
---|
53 |
|
---|
54 | char* hsm_client_get_symmetric_key(HSM_CLIENT_HANDLE handle)
|
---|
55 | {
|
---|
56 | char* result;
|
---|
57 | if (handle == NULL)
|
---|
58 | {
|
---|
59 | /* Codes_SRS_HSM_CLIENT_RIOT_07_010: [ if handle is NULL, hsm_client_riot_get_certificate shall return NULL. ] */
|
---|
60 | LogError("Invalid handle value specified");
|
---|
61 | result = NULL;
|
---|
62 | }
|
---|
63 | else
|
---|
64 | {
|
---|
65 | HSM_CLIENT_KEY_INFO* key_client = (HSM_CLIENT_KEY_INFO*)handle;
|
---|
66 | if (mallocAndStrcpy_s(&result, key_client->symmetrical_key) != 0)
|
---|
67 | {
|
---|
68 | LogError("Failed to allocate symmetrical_key.");
|
---|
69 | result = NULL;
|
---|
70 | }
|
---|
71 | }
|
---|
72 | return result;
|
---|
73 | }
|
---|
74 |
|
---|
75 | char* hsm_client_get_registration_name(HSM_CLIENT_HANDLE handle)
|
---|
76 | {
|
---|
77 | char* result;
|
---|
78 | if (handle == NULL)
|
---|
79 | {
|
---|
80 | /* Codes_SRS_HSM_CLIENT_RIOT_07_026: [ if handle is NULL, hsm_client_riot_get_common_name shall return NULL. ] */
|
---|
81 | LogError("Invalid handle value specified");
|
---|
82 | result = NULL;
|
---|
83 | }
|
---|
84 | else
|
---|
85 | {
|
---|
86 | HSM_CLIENT_KEY_INFO* key_client = (HSM_CLIENT_KEY_INFO*)handle;
|
---|
87 | if (mallocAndStrcpy_s(&result, key_client->registration_name) != 0)
|
---|
88 | {
|
---|
89 | LogError("Failure allocating registration_name");
|
---|
90 | result = NULL;
|
---|
91 | }
|
---|
92 | }
|
---|
93 | return result;
|
---|
94 | }
|
---|
95 |
|
---|
96 | int hsm_client_set_key_info(HSM_CLIENT_HANDLE handle, const char* reg_name, const char* symm_key)
|
---|
97 | {
|
---|
98 | int result;
|
---|
99 | if (handle == NULL || reg_name == NULL || symm_key == NULL)
|
---|
100 | {
|
---|
101 | LogError("Invalid parameter specified handle: %p, reg_name: %p, symm_key: %p", handle, reg_name, symm_key);
|
---|
102 | result = MU_FAILURE;
|
---|
103 | }
|
---|
104 | else
|
---|
105 | {
|
---|
106 | HSM_CLIENT_KEY_INFO* key_client = (HSM_CLIENT_KEY_INFO*)handle;
|
---|
107 |
|
---|
108 | char* temp_reg_name;
|
---|
109 | char* temp_key;
|
---|
110 | if (mallocAndStrcpy_s(&temp_reg_name, reg_name) != 0)
|
---|
111 | {
|
---|
112 | LogError("Failure allocating registration name");
|
---|
113 | result = MU_FAILURE;
|
---|
114 | }
|
---|
115 | else if (mallocAndStrcpy_s(&temp_key, symm_key) != 0)
|
---|
116 | {
|
---|
117 | LogError("Failure allocating symmetric key");
|
---|
118 | free(temp_reg_name);
|
---|
119 | result = MU_FAILURE;
|
---|
120 | }
|
---|
121 | else
|
---|
122 | {
|
---|
123 | if (key_client->symmetrical_key != NULL)
|
---|
124 | {
|
---|
125 | free(key_client->symmetrical_key);
|
---|
126 | }
|
---|
127 | if (key_client->registration_name != NULL)
|
---|
128 | {
|
---|
129 | free(key_client->registration_name);
|
---|
130 | }
|
---|
131 | key_client->symmetrical_key = temp_key;
|
---|
132 | key_client->registration_name = temp_reg_name;
|
---|
133 | result = 0;
|
---|
134 | }
|
---|
135 | }
|
---|
136 | return result;
|
---|
137 | }
|
---|
138 |
|
---|
139 | static const HSM_CLIENT_KEY_INTERFACE key_interface =
|
---|
140 | {
|
---|
141 | hsm_client_key_create,
|
---|
142 | hsm_client_key_destroy,
|
---|
143 | hsm_client_get_symmetric_key,
|
---|
144 | hsm_client_get_registration_name,
|
---|
145 | hsm_client_set_key_info
|
---|
146 | };
|
---|
147 |
|
---|
148 | const HSM_CLIENT_KEY_INTERFACE* hsm_client_key_interface(void)
|
---|
149 | {
|
---|
150 | return &key_interface;
|
---|
151 | }
|
---|