300 void load_key(xmlNode *keynode) { |
300 void load_key(xmlNode *keynode) { |
301 xmlNode *node = keynode->children; |
301 xmlNode *node = keynode->children; |
302 Key *key = calloc(1, sizeof(Key)); |
302 Key *key = calloc(1, sizeof(Key)); |
303 key->type = KEY_AES256; |
303 key->type = KEY_AES256; |
304 |
304 |
|
305 int error = 0; |
305 while(node) { |
306 while(node) { |
306 if(node->type == XML_ELEMENT_NODE) { |
307 if(node->type == XML_ELEMENT_NODE) { |
307 char *value = util_xml_get_text(node); |
308 char *value = util_xml_get_text(node); |
308 if(!value) { |
309 if(!value) { |
309 // next |
310 // next |
313 // load key file |
314 // load key file |
314 sstr_t key_data = load_key_file(value); |
315 sstr_t key_data = load_key_file(value); |
315 if(key_data.length > 0) { |
316 if(key_data.length > 0) { |
316 key->data = key_data.ptr; |
317 key->data = key_data.ptr; |
317 key->length = key_data.length; |
318 key->length = key_data.length; |
|
319 } else { |
|
320 fprintf(stderr, "Error: Cannot key from file: %s\n", value); |
|
321 error = 1; |
318 } |
322 } |
319 } else if(xstreq(node->name, "type")) { |
323 } else if(xstreq(node->name, "type")) { |
320 if(!strcmp(value, "aes128")) { |
324 if(!strcmp(value, "aes128")) { |
321 key->type = KEY_AES128; |
325 key->type = KEY_AES128; |
322 } else if(!strcmp(value, "aes256")) { |
326 } else if(!strcmp(value, "aes256")) { |
328 |
332 |
329 } |
333 } |
330 node = node->next; |
334 node = node->next; |
331 } |
335 } |
332 |
336 |
333 if(key->name) { |
337 if(!error && key->name) { |
|
338 error = 0; |
334 if(key->type == KEY_AES128) { |
339 if(key->type == KEY_AES128) { |
335 if(key->length < 16) { |
340 if(key->length < 16) { |
336 fprintf( |
341 fprintf( |
337 stderr, |
342 stderr, |
338 "Error: Key %s is too small (%d < 16)\n", |
343 "Error: Key %s is too small (%zu < 16)\n", |
339 key->name, |
344 key->name, |
340 key->length); |
345 key->length); |
341 return; |
346 error = 1; |
342 } |
347 } |
343 key->length = 16; |
348 key->length = 16; |
344 } |
349 } |
345 if(key->type == KEY_AES256) { |
350 if(key->type == KEY_AES256) { |
346 if(key->length < 32) { |
351 if(key->length < 32) { |
347 fprintf( |
352 fprintf( |
348 stderr, |
353 stderr, |
349 "Error: Key %s is too small (%d < 32)\n", |
354 "Error: Key %s is too small (%zu < 32)\n", |
350 key->name, |
355 key->name, |
351 key->length); |
356 key->length); |
352 return; |
357 error = 1; |
353 } |
358 } |
354 key->length = 32; |
359 key->length = 32; |
355 } |
360 } |
356 if(key->type == KEY_PASSWORD) { |
361 if(key->type == KEY_PASSWORD) { |
357 key->length = 0; |
362 key->length = 0; |
359 // make sure the pw-key is not loaded from a file |
364 // make sure the pw-key is not loaded from a file |
360 free(key->data); |
365 free(key->data); |
361 key->data = NULL; |
366 key->data = NULL; |
362 } |
367 } |
363 } |
368 } |
364 ucx_map_cstr_put(keys, key->name, key); |
369 |
365 dav_context_add_key(context, key); |
370 // add key to context |
366 } else { |
371 if(!error) { |
|
372 ucx_map_cstr_put(keys, key->name, key); |
|
373 dav_context_add_key(context, key); |
|
374 } |
|
375 } |
|
376 |
|
377 // cleanup |
|
378 if(error) { |
367 if(key->data) { |
379 if(key->data) { |
368 free(key->data); |
380 free(key->data); |
369 free(key); |
381 } |
370 } |
382 free(key); |
371 } |
383 } |
372 } |
384 } |
373 |
385 |
374 sstr_t load_key_file(char *filename) { |
386 sstr_t load_key_file(char *filename) { |
375 sstr_t k; |
387 sstr_t k; |