libidav/crypto.c

changeset 488
29b979ca8750
parent 478
baa63fef5c5c
child 505
481802342fdf
equal deleted inserted replaced
487:a2fc5b1cd476 488:29b979ca8750
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) {

mercurial