#import <CommonCrypto/CommonCryptor.h>
#import "NSData-AES.h"
@implementation NSData (AES256)
- (NSData *)AES256EncryptWithKey:(NSString *)key andInitializationVector: (NSString *)iv {
return [self wingardiumLeviosa: YES withKey: key andInitializationVector: iv];
}
- (NSData *)AES256DecryptWithKey:(NSString *)key andInitializationVector: (NSString *)iv {
return [self wingardiumLeviosa: NO withKey: key andInitializationVector: iv];
}
- (NSData *)wingardiumLeviosa:(BOOL)isEncrypting withKey:(NSString *)key andInitializationVector: (NSString *)iv {
size_t outAvailableLength = 0;
size_t outAvailableLengthFinal = 0;
size_t outSizeUpdate = 0;
CCOperation operation = 0;
CCCryptorRef cccCryptor = nil;
NSMutableData *data;
const void *bytes;
NSUInteger length;
data = [NSMutableData dataWithLength:0];
bytes = [self bytes];
length = [self length];
if(isEncrypting){
operation = kCCEncrypt;
} else {
operation = kCCDecrypt;
}
CCCryptorCreate(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
[key UTF8String], [key length],
[iv UTF8String],
&cccCryptor);
outAvailableLength = CCCryptorGetOutputLength(cccCryptor, length, false);
void *outBytes = malloc(outAvailableLength);
if (cccCryptor) {
CCCryptorUpdate(cccCryptor, bytes, length, outBytes, outAvailableLength, &outSizeUpdate);
[data appendBytes:outBytes length:outSizeUpdate];
outAvailableLengthFinal = CCCryptorGetOutputLength(cccCryptor, length, true);
void *finalBuffer = malloc(outAvailableLengthFinal);
CCCryptorFinal(cccCryptor, finalBuffer, kCCBlockSizeAES128, &outSizeUpdate);
[data appendBytes:finalBuffer length:outSizeUpdate];
CCCryptorRelease(cccCryptor);
return data;
}
return nil;
}
@end