libidav/utils.c

changeset 147
458a8dc68048
parent 124
41939c8f3f9c
child 148
f21ee22170bf
--- 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 <ucx/utils.h>
 #include <libxml/tree.h>
 #include <curl/curl.h>
+#include <termios.h>
 
 #include <openssl/sha.h>
 #include <openssl/hmac.h>
@@ -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;
+}

mercurial