610 |
610 |
611 CCCryptorStatus status; |
611 CCCryptorStatus status; |
612 size_t avail = outlen; |
612 size_t avail = outlen; |
613 status = CCCryptorUpdate(enc->ctx, in, in_len, out + ivl, avail, &outlen); |
613 status = CCCryptorUpdate(enc->ctx, in, in_len, out + ivl, avail, &outlen); |
614 if(in_len != len) { |
614 if(in_len != len) { |
615 int newoutlen = 16; |
615 size_t newoutlen = 16; |
616 status = CCCryptorFinal(enc->ctx, out + ivl + outlen, 16, &newoutlen); |
616 status = CCCryptorFinal(enc->ctx, out + ivl + outlen, 16, &newoutlen); |
617 outlen += newoutlen; |
617 outlen += newoutlen; |
618 enc->end = 1; |
618 enc->end = 1; |
619 } |
619 } |
620 } else { |
620 } else { |
775 |
775 |
776 char* dav_create_hash(const char *data, size_t len) { |
776 char* dav_create_hash(const char *data, size_t len) { |
777 unsigned char hash[DAV_SHA256_DIGEST_LENGTH]; |
777 unsigned char hash[DAV_SHA256_DIGEST_LENGTH]; |
778 CC_SHA256((const unsigned char*)data, len, hash); |
778 CC_SHA256((const unsigned char*)data, len, hash); |
779 return util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH); |
779 return util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH); |
|
780 } |
|
781 |
|
782 DavKey* dav_pw2key(const char *password, const char *salt, int saltlen, int pwfunc, int enc) { |
|
783 if(!password) { |
|
784 return NULL; |
|
785 } |
|
786 size_t len = strlen(password); |
|
787 if(len == 0) { |
|
788 return NULL; |
|
789 } |
|
790 |
|
791 // setup key data and length |
|
792 unsigned char keydata[32]; |
|
793 int keylen = 32; |
|
794 switch(enc) { |
|
795 case DAV_KEY_AES128: keylen = 16; break; |
|
796 case DAV_KEY_AES256: keylen = 32; break; |
|
797 default: return NULL; |
|
798 } |
|
799 |
|
800 // generate key |
|
801 switch(pwfunc) { |
|
802 case DAV_PWFUNC_PBKDF2_SHA256: { |
|
803 int result = CCKeyDerivationPBKDF( |
|
804 kCCPBKDF2, |
|
805 password, |
|
806 len, |
|
807 (uint8_t*)salt, |
|
808 saltlen, |
|
809 kCCPRFHmacAlgSHA256, |
|
810 DAV_CRYPTO_ITERATION_COUNT, |
|
811 keydata, |
|
812 keylen); |
|
813 if(result) { |
|
814 return NULL; |
|
815 } |
|
816 break; |
|
817 } |
|
818 case DAV_PWFUNC_PBKDF2_SHA512: { |
|
819 int result = CCKeyDerivationPBKDF( |
|
820 kCCPBKDF2, |
|
821 password, |
|
822 len, |
|
823 (uint8_t*)salt, |
|
824 saltlen, |
|
825 kCCPRFHmacAlgSHA512, |
|
826 DAV_CRYPTO_ITERATION_COUNT, |
|
827 keydata, |
|
828 keylen); |
|
829 if(result) { |
|
830 return NULL; |
|
831 } |
|
832 break; |
|
833 } |
|
834 default: return NULL; |
|
835 } |
|
836 |
|
837 // create DavKey with generated data |
|
838 DavKey *key = malloc(sizeof(DavKey)); |
|
839 key->data = malloc(keylen); |
|
840 key->length = keylen; |
|
841 key->name = NULL; |
|
842 key->type = enc; |
|
843 memcpy(key->data, keydata, keylen); |
|
844 return key; |
780 } |
845 } |
781 |
846 |
782 #endif |
847 #endif |
783 |
848 |
784 UcxBuffer* aes_encrypt_buffer(UcxBuffer *in, DavKey *key) { |
849 UcxBuffer* aes_encrypt_buffer(UcxBuffer *in, DavKey *key) { |