libidav/utils.c

changeset 147
458a8dc68048
parent 124
41939c8f3f9c
child 148
f21ee22170bf
equal deleted inserted replaced
146:e48048334602 147:458a8dc68048
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 }

mercurial