예제 #1
0
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;
}