Ivan
Ivan

Reputation: 21

CCCrypt not work on xcode 5 for ios 7

I try to use CCCrypt method, but it has different result from XCode4 and XCode5

 - (NSData *)AES256DecryptWithKey:(NSString *)key
{
  // 'key' should be 32 bytes for AES256, will be null-padded otherwise
  char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
  bzero( keyPtr, sizeof( keyPtr ) ); // fill with zeroes (for padding)

  // fetch key data
  [key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding];

  NSUInteger dataLength = [self length];

  //See the doc: For block ciphers, the output size will always be less than or 
  //equal to the input size plus the size of one block.
  //That's why we need to add the size of one block here
  size_t bufferSize = dataLength + kCCBlockSizeAES128;
  void *buffer = malloc( bufferSize );

  size_t numBytesDecrypted = 0;
  CCCryptorStatus cryptStatus = CCCrypt( kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                        keyPtr, kCCKeySizeAES256,
                                        NULL /* initialization vector (optional) */,
                                        [self bytes], dataLength, /* input */
                                        buffer, bufferSize, /* output */
                                        &numBytesDecrypted );

  if( cryptStatus == kCCSuccess )
  {
    //the returned NSData takes ownership of the buffer and will free it on deallocation
    return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
  }

  free( buffer ); //free the buffer
  return nil;
}

when I call this method with this lines ... different result

NSString *password = @"E7VRcIXn8yb2Ab+t/in9UzRof6vOpOYebgKbpt1GOcfDF8rpc5nZXngx1G8QfbDqsVrwZw26609GVwruUBrOirCI/WUT8U87fbD6lSy/zPwFIYC113LgXIEylYgzIWO4";
  NSString *pwd = [password AES256DecryptWithKey: @"abcd"];
  if (pwd) {
      NSString *checkKey = @"0sSBf7Ncyov+uzvDikOBiA==";
      NSString *uncryptChk = [checkKey AES256DecryptWithKey: pwd];

In XCode4 the result is "abcd", whereas in XCode5 the result is "".

Upvotes: 2

Views: 2435

Answers (1)

Tjirp
Tjirp

Reputation: 2455

Ran into this issue myself. it seems they fixed a bug from iOS6 to iOS7 regarding [NSString keyCString:maxLength:encoding] The old method on iOS6 would cut off part of the buffer to fill the keyPtr.

An easy fix would be to increase the keyPTr size to

char keyPtr = kCCKeySizeAES256 * 2 + 1;

However keep in mind that when you upgrade apps form 6 to 7, while it should work. the keyCString truncates the length to match the size of keyPtr. and replaces the first character with 0. So to make sure that it works on both platforms. Add the above code, and set keyPtr[0] = 0;

Upvotes: 2

Related Questions