int ccmode_gcm_test_one_vector(const struct ccmode_gcm *gcm, const struct ccmode_gcm_vector *v, int dec) { if (v->ptlen!=v->ctlen) return -1; #ifdef USE_COMMONCRYPTO_GCM unsigned char temp[v->ptlen]; unsigned char temptag[v->taglen]; CCCryptorStatus st; size_t taglen = v->taglen; st = CCCryptorGCM(dec ? kCCDecrypt : kCCEncrypt, kCCAlgorithmAES128, v->key, v->keylen, v->iv, v->ivlen, v->ada, v->adalen, dec ? v->ct : v->pt, v->ptlen, temp, temptag, &taglen); #ifdef _INTERNAL_DEBUG_ int r1, r2; r1 = memcmp(dec ? v->pt : v->ct, temp, v->ptlen); r2 = memcmp(v->tag, temptag, v->taglen); if (r1 || r2) cc_printf("ivlen: %lu adalen: %lu nbytes: %lu taglen: %lu crypt: %d tag: %d\n", v->ivlen, v->adalen, v->ptlen, v->taglen, r1, r2); return r1 != 0 ? r1 : r2; #else return memcmp(dec ? v->pt : v->ct, temp, v->ptlen) || memcmp(v->tag, temptag, v->taglen); #endif #else if (dec) return ccmode_gcm_test_one(gcm, v->keylen, v->key, v->ivlen, v->iv, v->adalen, v->ada, v->ptlen, v->ct, v->pt, v->taglen, v->tag); else return ccmode_gcm_test_one(gcm, v->keylen, v->key, v->ivlen, v->iv, v->adalen, v->ada, v->ptlen, v->pt, v->ct, v->taglen, v->tag); #endif }
CFMutableDictionaryRef decrypt_data_ios5(const uint8_t* datab, uint32_t len, uint32_t* pclass) { CFMutableDictionaryRef plist = NULL; CFErrorRef err = NULL; uint8_t aes_key[48]; uint32_t version, protection_class, wrapped_length, item_length; CCCryptorStatus cs = 0; IOReturn ret; int taglen = 16; char tag[16]; if (len < 68) { fprintf(stderr, "decrypt_data_ios5 : keychain item len < 68\n"); return NULL; } version = ((uint32_t*) datab)[0]; protection_class = ((uint32_t*) datab)[1]; if (pclass != NULL) *pclass = protection_class; wrapped_length = ((uint32_t*) datab)[2]; item_length = len - 48 - 4 - 16; if (version != 2 && version != 3) { fprintf(stderr, "decrypt_data_ios5 : version = %d\n", version); return NULL; } if (wrapped_length != 40) { fprintf(stderr, "decrypt_data_ios5 : wrapped_length != 0x28\n"); return NULL; } if((ret = AppleKeyStore_keyUnwrap(protection_class, &datab[12], 40, aes_key))) { fprintf(stderr, "decrypt_data_ios5 : AppleKeyStore_keyUnwrap = %x\n", ret); return NULL; } CFMutableDataRef item = CFDataCreateMutable(kCFAllocatorDefault, item_length); if (item == NULL) { memset(aes_key, 0, 48); return NULL; } CFDataSetLength(item, item_length); if (CCCryptorGCM == NULL) getCCCryptorGCM(); if (CCCryptorGCM != NULL) cs = CCCryptorGCM(kCCDecrypt, kCCAlgorithmAES128, aes_key, 32, 0, 0, 0, 0, &datab[52], item_length, (void*) CFDataGetBytePtr(item), tag, &taglen); memset(aes_key, 0, 48); if (cs != 0) { fprintf(stderr, "decrypt_data_ios5 : CCCryptorGCM failed, CCCryptorStatus = %x\n", cs); CFRelease(item); return NULL; } if (version == 3) { der_decode_plist(kCFAllocatorDefault, 1, (CFPropertyListRef*) &plist, &err, (const uint8_t*) CFDataGetBytePtr(item), (const uint8_t*) CFDataGetBytePtr(item) + item_length); } else { plist = (CFMutableDictionaryRef) CFPropertyListCreateFromXMLData(NULL, item, kCFPropertyListMutableContainersAndLeaves, NULL); } CFRelease(item); if (plist != NULL && CFGetTypeID(plist) != CFDictionaryGetTypeID()) { fprintf(stderr, "decrypt_data_ios5 : CFPropertyListCreateFromXMLData did not return a dictionary\n"); CFRelease(plist); return NULL; } return plist; }