libidav/crypto.c

changeset 488
29b979ca8750
parent 478
baa63fef5c5c
child 505
481802342fdf
--- a/libidav/crypto.c	Sat Oct 20 13:33:46 2018 +0200
+++ b/libidav/crypto.c	Sat Oct 20 13:46:32 2018 +0200
@@ -612,7 +612,7 @@
         size_t avail = outlen;
         status = CCCryptorUpdate(enc->ctx, in, in_len, out + ivl, avail, &outlen);
         if(in_len != len) {
-            int newoutlen = 16;
+            size_t newoutlen = 16;
             status = CCCryptorFinal(enc->ctx, out + ivl + outlen, 16, &newoutlen);
             outlen += newoutlen;
             enc->end = 1;
@@ -779,6 +779,71 @@
     return util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH);
 }
 
+DavKey* dav_pw2key(const char *password, const char *salt, int saltlen, int pwfunc, int enc) {
+    if(!password) {
+        return NULL;
+    }
+    size_t len = strlen(password);
+    if(len == 0) {
+        return NULL;
+    }
+    
+    // setup key data and length
+    unsigned char keydata[32];
+    int keylen = 32;
+    switch(enc) {
+        case DAV_KEY_AES128: keylen = 16; break;
+        case DAV_KEY_AES256: keylen = 32; break;
+        default: return NULL;
+    }
+    
+    // generate key
+    switch(pwfunc) {
+        case DAV_PWFUNC_PBKDF2_SHA256: {
+            int result = CCKeyDerivationPBKDF(
+                    kCCPBKDF2,
+                    password,
+                    len,
+                    (uint8_t*)salt,
+                    saltlen,
+                    kCCPRFHmacAlgSHA256,
+                    DAV_CRYPTO_ITERATION_COUNT,
+                    keydata,
+                    keylen);
+            if(result) {
+                return NULL;
+            }
+            break;
+        }
+        case DAV_PWFUNC_PBKDF2_SHA512: {
+            int result = CCKeyDerivationPBKDF(
+                    kCCPBKDF2,
+                    password,
+                    len,
+                    (uint8_t*)salt,
+                    saltlen,
+                    kCCPRFHmacAlgSHA512,
+                    DAV_CRYPTO_ITERATION_COUNT,
+                    keydata,
+                    keylen);
+            if(result) {
+                return NULL;
+            }
+            break;
+        }
+        default: return NULL;
+    }
+    
+    // create DavKey with generated data
+    DavKey *key = malloc(sizeof(DavKey));
+    key->data = malloc(keylen);
+    key->length = keylen;
+    key->name = NULL;
+    key->type = enc;
+    memcpy(key->data, keydata, keylen);
+    return key;
+}
+
 #endif
 
 UcxBuffer* aes_encrypt_buffer(UcxBuffer *in, DavKey *key) {

mercurial