diff -r e48048334602 -r 458a8dc68048 libidav/utils.c --- a/libidav/utils.c Sat Oct 03 16:44:50 2015 +0200 +++ b/libidav/utils.c Sat Oct 03 18:11:07 2015 +0200 @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -304,7 +305,11 @@ return NULL; } - char *enc_str = aes_encrypt(str, k); + return util_encrypt_str_k(sn, str, k); +} + +char* util_encrypt_str_k(DavSession *sn, char *str, DavKey *key) { + char *enc_str = aes_encrypt(str, key); char *ret_str = dav_session_strdup(sn, enc_str); free(enc_str); return ret_str; @@ -317,7 +322,11 @@ return NULL; } - char *dec_str = aes_decrypt(str, k); + return util_decrypt_str_k(sn, str, k); +} + +char* util_decrypt_str_k(DavSession *sn, char *str, DavKey *key) { + char *dec_str = aes_decrypt(str, key); char *ret_str = dav_session_strdup(sn, dec_str); free(dec_str); return ret_str; @@ -399,3 +408,64 @@ ucx_buffer_free(buf); return str; } + +char* util_password_input(char *prompt) { + fprintf(stderr, "%s", prompt); + fflush(stderr); + + // hide terminal input +#ifdef _WIN32 + // TODO +#else + struct termios oflags, nflags; + tcgetattr(fileno(stdin), &oflags); + nflags = oflags; + nflags.c_lflag &= ~ECHO; + nflags.c_lflag |= ECHONL; + if (tcsetattr(fileno(stdin), TCSANOW, &nflags) != 0) { + perror("tcsetattr"); + } +#endif + + // read password input + UcxBuffer *buf = ucx_buffer_new(NULL, 128, UCX_BUFFER_AUTOEXTEND); + int c = 0; + while((c = getchar()) != EOF) { + if(c == '\n') { + break; + } + ucx_buffer_putc(buf, c); + } + ucx_buffer_putc(buf, 0); + + // restore terminal settings +#ifdef _WIN32 + // TODO +#else + if (tcsetattr(fileno(stdin), TCSANOW, &oflags) != 0) { + perror("tcsetattr"); + } +#endif + + char *str = buf->space; + free(buf); // only free the UcxBuffer struct + return str; +} + +void util_generate_key(DavKey *key, char *password) { + key->data = malloc(SHA256_DIGEST_LENGTH); + key->length = SHA256_DIGEST_LENGTH; + key->type = DAV_KEY_AES256; + + SHA256_CTX sha256; + SHA256_Init(&sha256); + SHA256_Update(&sha256, password, strlen(password)); + SHA256_Final(key->data, &sha256); +} + +char* util_key_input(DavContext *ctx, DavKey *key) { + sstr_t prompt = ucx_sprintf("Enter password for key (%s): ", key->name); + char *password = util_password_input(prompt.ptr); + free(prompt.ptr); + return password; +}