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/Signal/test/textsecure/CryptographyTests.mm

67 lines
3.0 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>
#include <stdlib.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