ObjC implementation of the AES Key Wrap (RFC 3394) and AES Key Wrap with Padding (RFC 5649) algorithms.
CommonCrypto already offers a couple of functions that implement RFC 3394:
- CCSymmetricKeyWrap
- CCSymmetricKeyUnwrap
However, it does not offer any functions to wrap with padding (RFC 5649) ... yet.
AesKeyWrap is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod "AesKeyWrap"
#import <CommonCrypto/CommonCryptor.h>
#import "AKWAesKeyWrap.h"
u_char keyBytes[kCCKeySizeAES192] = {...};
NSData *keyEncryptionKey = [NSData dataWithBytes:keyBytes length:kCCKeySizeAES192];
// AES Key Wrap
u_char plainBytes[2 * sizeof(uint64_t)] = {...};
NSData *expectedPlainData = [NSData dataWithBytes:plainBytes length:sizeof(plainBytes)];
NSData *cipheredData = [AKWAesKeyWrap cipheredDataByWrappingPlainData:expectedPlainData
withKeyEncryptionKey:keyEncryptionKey
error:nil];
NSData *plainData = [AKWAesKeyWrap plainDataByUnwrappingCipheredData:cipheredData
withKeyEncryptionKey:keyEncryptionKey
error:nil];
XCTAssertEqualObjects(expectedPlainData, plainData);
// AES Key Wrap with Padding
u_char plainBytesWithPadding[1] = {...};
expectedPlainData = [NSData dataWithBytes:plainBytesWithPadding length:sizeof(plainBytesWithPadding)];
cipheredData = [AKWAesKeyWrap cipheredDataByWrappingWithPaddingPlainData:expectedPlainData
usingKeyEncryptionKey:keyEncryptionKey
error:nil];
plainData = [AKWAesKeyWrap plainDataByUnwrappingWithPaddingCipheredData:cipheredData
usingKeyEncryptionKey:keyEncryptionKey
error:nil];
XCTAssertEqualObjects(expectedPlainData, plainData);
AesKeyWrap is available under the MIT license. See the LICENSE file for more info.