I’m looking at some code that creates a mutable data object and puts a SHA1 hash into it. If I initialize the target mutable data object with
CFMutableDataRef hashDataRef = (CFMutableDataRef)[[NSMutableData alloc] initWithLength:SHA_DIGEST_LENGTH];
everything works fine. If I change that one line to
CFMutableDataRef hashDataRef = CFDataCreateMutable(kCFAllocatorDefault, SHA_DIGEST_LENGTH);
it breaks (the mutable data object appears to still be empty after the SHA1 command). In both cases, the line that follows the creation of hashDataRef is
SHA1(CFDataGetBytePtr(inputDataRef), CFDataGetLength(inputDataRef), CFDataGetMutableBytePtr(hashDataRef));
I hadn’t expected there to be any difference between the two, but clearly I’m missing something. Is there a proper Core Foundation way to get the mutable data object I want without using NSMutableData and toll-free bridging?
NSMutableData initWithLength:creates a data object whose raw data is filled with zeros, butCFDataCreateMutablecreates an emptyCFMutableDataRef. Even though it was created with a capacity, its length is still zero. So, when you useCFDataGetMutableBytePtr, it returns a NULL pointer.To fix it, you could fill the CFMutableDataRef to its capacity using CFDataSetLength, which fills the data with zeros.