17 psa_destroy_key(masterkeyid);
21 psa_destroy_key(newkeyid);
50 psa_status_t status = psa_export_key(masterkeyid, mkd.
data, mkd.
size, &key_size);
51 if (status != PSA_SUCCESS) {
55 if (key_size!=mkd.
size) {
72 DEBUG3(
"masterkeyid is already set. removing masterkey, this should never happed");
73 psa_destroy_key(masterkeyid);
75 DEBUG3(
"adding masterkey");
76 psa_key_attributes_t attributes = getattributes(
true);
78 psa_status_t status = psa_import_key(&attributes, mkd.
data, mkd.
size, &masterkeyid);
79 if (status != PSA_SUCCESS) {
92psa_key_attributes_t pass2Key::getattributes(
bool formaster) {
94 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
96 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE | PSA_KEY_USAGE_EXPORT);
97 psa_set_key_algorithm(&attributes, PSA_ALG_HKDF(PSA_ALG_SHA_256));
98 psa_set_key_type(&attributes, PSA_KEY_TYPE_DERIVE);
100 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT);
101 psa_set_key_algorithm(&attributes, PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_GCM, 8));
102 psa_set_key_type(&attributes, PSA_KEY_TYPE_AES);
125 psa_key_attributes_t attributes = getattributes(
true);
127 psa_status_t status = psa_generate_key(&attributes, &masterkeyid);
128 if (status != PSA_SUCCESS) {
158 const unsigned char *salt = (
const unsigned char *)tsalt.c_str();
159 const size_t saltlen = tsalt.length();
166 derivedkeytext = text;
168 size_t secretlength = text.length();
169 unsigned char secret[secretlength + 1];
170 memcpy(secret, text.c_str(), secretlength);
171 psa_status_t status = PSA_SUCCESS;
172 psa_key_attributes_t attributes = getattributes();
173 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
180 DEBUG3(
"psa_key_derivation_setup PSA_ALG_HKDF");
181 status = psa_key_derivation_setup(&operation, PSA_ALG_HKDF(PSA_ALG_SHA_256));
182 if (status != PSA_SUCCESS) {
183 psa_key_derivation_abort(&operation);
187 DEBUG3(
"psa_key_derivation_input_bytes PSA_KEY_DERIVATION_INPUT_SALT =" + tsalt);
188 status = psa_key_derivation_input_bytes(&operation, PSA_KEY_DERIVATION_INPUT_SALT, (uint8_t *)salt, saltlen);
189 if (status != PSA_SUCCESS) {
190 psa_key_derivation_abort(&operation);
191 FALSEORSTOP(status,
"psa_key_derivation_input_bytes");
194 DEBUG3(
"psa_key_derivation_input_key PSA_KEY_DERIVATION_INPUT_SECRET");
195 status = psa_key_derivation_input_key(&operation, PSA_KEY_DERIVATION_INPUT_SECRET, masterkeyid);
196 if (status != PSA_SUCCESS) {
197 psa_key_derivation_abort(&operation);
198 FALSEORSTOP(status,
"psa_key_derivation_input_key");
201 DEBUG3(
"psa_key_derivation_input_bytes PSA_KEY_DERIVATION_INPUT_INFO");
202 status = psa_key_derivation_input_bytes(&operation, PSA_KEY_DERIVATION_INPUT_INFO, (
const uint8_t *)secret,
sizeof(secret));
203 if (status != PSA_SUCCESS) {
204 psa_key_derivation_abort(&operation);
205 FALSEORSTOP(status,
"psa_key_derivation_input_bytes");
208 DEBUG3(
"psa_key_derivation_set_capacity ");
209 status = psa_key_derivation_set_capacity(&operation,
AES128BYTES );
210 if (status != PSA_SUCCESS) {
211 psa_key_derivation_abort(&operation);
212 FALSEORSTOP(status,
"psa_key_derivation_set_capacity");
215 DEBUG3(
"psa_key_derivation_output_key");
216 status = psa_key_derivation_output_key(&attributes, &operation, &newkeyid);
217 if (status != PSA_SUCCESS) {
218 psa_key_derivation_abort(&operation);
219 FALSEORSTOP(status,
"psa_key_derivation_output_key");
223 DEBUG3(
"psa_key_derivation_abort");
224 status = psa_key_derivation_abort(&operation);
225 if (status != PSA_SUCCESS) {
bool setMasterKey(MasterKeyData &mkd)
bool getMasterKey(MasterKeyData &mkd)
bool deriveNewKeyfromText(String text)
#define MSTRKEYSALT
When a newkey is generated it will use this value as the salt/iv. This is only used for the newkey ge...
String cryptoerrortoString(psa_status_t err)
#define FALSEORSTOP(s, f)
masterkey data for AES128 is 16bytes