You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-ios/tests/CryptographyTests.mm

91 lines
3.7 KiB
Plaintext

//
// CryptographyTests.m
// TextSecureiOS
//
// Created by Christine Corbett Moran on 12/19/13.
// Copyright (c) 2013 Open Whisper Systems. All rights reserved.
//
#import <XCTest/XCTest.h>
#import "Cryptography.h"
#import "NSData+Base64.h"
@interface CryptographyTests : XCTestCase
@end
@interface Cryptography (Test)
+ (NSData *)truncatedSHA256HMAC:(NSData *)dataToHMAC withHMACKey:(NSData *)HMACKey truncation:(int)bytes;
+ (NSData *)encryptCBCMode:(NSData *)dataToEncrypt
withKey:(NSData *)key
withIV:(NSData *)iv
withVersion:(NSData *)version
withHMACKey:(NSData *)hmacKey
withHMACType:(TSMACType)hmacType
computedHMAC:(NSData **)hmac;
+ (NSData *)decryptCBCMode:(NSData *)dataToDecrypt
key:(NSData *)key
IV:(NSData *)iv
version:(NSData *)version
HMACKey:(NSData *)hmacKey
HMACType:(TSMACType)hmacType
matchingHMAC:(NSData *)hmac;
@end
@implementation CryptographyTests
- (void)testLocalDecryption {
NSString *originalMessage = @"Hawaii is awesome";
NSString *signalingKeyString = @"VJuRzZcwuY/6VjGw+QSPy5ROzHo8xE36mKwHNvkfyZ+mSPaDlSDcenUqavIX1Vwn\nRRIdrg==";
NSData *signalingKey = [NSData dataFromBase64String:signalingKeyString];
XCTAssertTrue([signalingKey length] == 52,
@"signaling key is not 52 bytes but %llu",
(unsigned long long)[signalingKey length]);
NSData *signalingKeyAESKeyMaterial = [signalingKey subdataWithRange:NSMakeRange(0, 32)];
NSData *signalingKeyHMACKeyMaterial = [signalingKey subdataWithRange:NSMakeRange(32, 20)];
NSData *iv = [Cryptography generateRandomBytes:16];
NSData *version = [Cryptography generateRandomBytes:1];
NSData *mac;
NSData *encryption = [Cryptography encryptCBCMode:[originalMessage dataUsingEncoding:NSUTF8StringEncoding]
withKey:signalingKeyAESKeyMaterial
withIV:iv
withVersion:version
withHMACKey:signalingKeyHMACKeyMaterial
withHMACType:TSHMACSHA1Truncated10Bytes
computedHMAC:&mac]; // Encrypt
NSMutableData *dataToHmac = [NSMutableData data];
[dataToHmac appendData:version];
[dataToHmac appendData:iv];
[dataToHmac appendData:encryption];
NSData *expectedHmac =
[Cryptography truncatedSHA1HMAC:dataToHmac withHMACKey:signalingKeyHMACKeyMaterial truncation:10];
XCTAssertTrue([mac isEqualToData:expectedHmac],
@"Hmac of encrypted data %@, not equal to expected hmac %@",
[mac base64EncodedString],
[expectedHmac base64EncodedString]);
NSData *decryption = [Cryptography decryptCBCMode:encryption
key:signalingKeyAESKeyMaterial
IV:iv
version:version
HMACKey:signalingKeyHMACKeyMaterial
HMACType:TSHMACSHA1Truncated10Bytes
matchingHMAC:mac];
NSString *decryptedMessage = [[NSString alloc] initWithData:decryption encoding:NSUTF8StringEncoding];
XCTAssertTrue([decryptedMessage isEqualToString:originalMessage],
@"Decrypted message: %@ is not equal to original: %@",
decryptedMessage,
originalMessage);
}
@end