102 :(NSData *)encrypted_data
103{
104 if ([encrypted_data length] <= TSXEncryptorBlockCipherBlockSize)
105 return nil;
106
107 NSMutableData *plaintext_data =
108 [NSMutableData dataWithLength:[encrypted_data length] + TSXEncryptorBlockCipherBlockSize];
109 size_t data_out_moved = 0;
110
111 int ret =
112 CCCrypt(kCCDecrypt, TSXEncryptorBlockCipherAlgo, TSXEncryptorBlockCipherOptions,
113 [_encryption_key bytes], TSXEncryptorBlockCipherKeySize, [encrypted_data bytes],
114 [encrypted_data bytes] + TSXEncryptorBlockCipherBlockSize,
115 [encrypted_data length] - TSXEncryptorBlockCipherBlockSize,
116 [plaintext_data mutableBytes], [plaintext_data length], &data_out_moved);
117
118 switch (ret)
119 {
120 case kCCSuccess:
121 [plaintext_data setLength:data_out_moved];
122 return plaintext_data;
123
124 case kCCBufferTooSmall:
125
126 case kCCAlignmentError:
127 case kCCDecodeError:
128 return nil;
129
130 default:
131 NSLog(@"%s: uncaught error, ret CCCryptorStatus = %d (encrypted data len = %lu; buffer "
132 @"size = %lu; dom = %lu)",
133 __func__, ret, (unsigned long)[encrypted_data length],
134 (unsigned long)[plaintext_data length], data_out_moved);
135 return nil;
136 }
137
138 return nil;
139}