34 #include <ucx/string.h> |
34 #include <ucx/string.h> |
35 #include <ucx/buffer.h> |
35 #include <ucx/buffer.h> |
36 #include <ucx/utils.h> |
36 #include <ucx/utils.h> |
37 #include <libxml/tree.h> |
37 #include <libxml/tree.h> |
38 #include <curl/curl.h> |
38 #include <curl/curl.h> |
|
39 #include <termios.h> |
39 |
40 |
40 #include <openssl/sha.h> |
41 #include <openssl/sha.h> |
41 #include <openssl/hmac.h> |
42 #include <openssl/hmac.h> |
42 #include <openssl/evp.h> |
43 #include <openssl/evp.h> |
43 #include <openssl/bio.h> |
44 #include <openssl/bio.h> |
302 if(!k) { |
303 if(!k) { |
303 // TODO: session error |
304 // TODO: session error |
304 return NULL; |
305 return NULL; |
305 } |
306 } |
306 |
307 |
307 char *enc_str = aes_encrypt(str, k); |
308 return util_encrypt_str_k(sn, str, k); |
|
309 } |
|
310 |
|
311 char* util_encrypt_str_k(DavSession *sn, char *str, DavKey *key) { |
|
312 char *enc_str = aes_encrypt(str, key); |
308 char *ret_str = dav_session_strdup(sn, enc_str); |
313 char *ret_str = dav_session_strdup(sn, enc_str); |
309 free(enc_str); |
314 free(enc_str); |
310 return ret_str; |
315 return ret_str; |
311 } |
316 } |
312 |
317 |
315 if(!k) { |
320 if(!k) { |
316 // TODO: session error |
321 // TODO: session error |
317 return NULL; |
322 return NULL; |
318 } |
323 } |
319 |
324 |
320 char *dec_str = aes_decrypt(str, k); |
325 return util_decrypt_str_k(sn, str, k); |
|
326 } |
|
327 |
|
328 char* util_decrypt_str_k(DavSession *sn, char *str, DavKey *key) { |
|
329 char *dec_str = aes_decrypt(str, key); |
321 char *ret_str = dav_session_strdup(sn, dec_str); |
330 char *ret_str = dav_session_strdup(sn, dec_str); |
322 free(dec_str); |
331 free(dec_str); |
323 return ret_str; |
332 return ret_str; |
324 } |
333 } |
325 |
334 |
397 |
406 |
398 sstr_t str = sstrdup(sstrtrim(sstrn(buf->space, buf->size))); |
407 sstr_t str = sstrdup(sstrtrim(sstrn(buf->space, buf->size))); |
399 ucx_buffer_free(buf); |
408 ucx_buffer_free(buf); |
400 return str; |
409 return str; |
401 } |
410 } |
|
411 |
|
412 char* util_password_input(char *prompt) { |
|
413 fprintf(stderr, "%s", prompt); |
|
414 fflush(stderr); |
|
415 |
|
416 // hide terminal input |
|
417 #ifdef _WIN32 |
|
418 // TODO |
|
419 #else |
|
420 struct termios oflags, nflags; |
|
421 tcgetattr(fileno(stdin), &oflags); |
|
422 nflags = oflags; |
|
423 nflags.c_lflag &= ~ECHO; |
|
424 nflags.c_lflag |= ECHONL; |
|
425 if (tcsetattr(fileno(stdin), TCSANOW, &nflags) != 0) { |
|
426 perror("tcsetattr"); |
|
427 } |
|
428 #endif |
|
429 |
|
430 // read password input |
|
431 UcxBuffer *buf = ucx_buffer_new(NULL, 128, UCX_BUFFER_AUTOEXTEND); |
|
432 int c = 0; |
|
433 while((c = getchar()) != EOF) { |
|
434 if(c == '\n') { |
|
435 break; |
|
436 } |
|
437 ucx_buffer_putc(buf, c); |
|
438 } |
|
439 ucx_buffer_putc(buf, 0); |
|
440 |
|
441 // restore terminal settings |
|
442 #ifdef _WIN32 |
|
443 // TODO |
|
444 #else |
|
445 if (tcsetattr(fileno(stdin), TCSANOW, &oflags) != 0) { |
|
446 perror("tcsetattr"); |
|
447 } |
|
448 #endif |
|
449 |
|
450 char *str = buf->space; |
|
451 free(buf); // only free the UcxBuffer struct |
|
452 return str; |
|
453 } |
|
454 |
|
455 void util_generate_key(DavKey *key, char *password) { |
|
456 key->data = malloc(SHA256_DIGEST_LENGTH); |
|
457 key->length = SHA256_DIGEST_LENGTH; |
|
458 key->type = DAV_KEY_AES256; |
|
459 |
|
460 SHA256_CTX sha256; |
|
461 SHA256_Init(&sha256); |
|
462 SHA256_Update(&sha256, password, strlen(password)); |
|
463 SHA256_Final(key->data, &sha256); |
|
464 } |
|
465 |
|
466 char* util_key_input(DavContext *ctx, DavKey *key) { |
|
467 sstr_t prompt = ucx_sprintf("Enter password for key (%s): ", key->name); |
|
468 char *password = util_password_input(prompt.ptr); |
|
469 free(prompt.ptr); |
|
470 return password; |
|
471 } |