-
Notifications
You must be signed in to change notification settings - Fork 2
/
RNOpenSSLTests.m
144 lines (113 loc) · 5.54 KB
/
RNOpenSSLTests.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//
// RNOpenSSLTests.m
// RNCryptor
//
// Created by Rob Napier on 12/12/13.
// Copyright (c) 2013 Rob Napier. All rights reserved.
//
#import <XCTest/XCTest.h>
#import "RNCryptor.h"
#import "RNOpenSSLCryptor.h"
#import "RNCryptorTestHelpers.h"
@interface RNOpenSSLTests : XCTestCase
@end
@implementation RNOpenSSLTests
- (void)setUp
{
[super setUp];
// Put setup code here; it will be run once, before the first test case.
}
- (void)tearDown
{
// Put teardown code here; it will be run once, after the last test case.
[super tearDown];
}
// echo Test data | openssl enc -aes-256-cbc -out test.enc -k Passw0rd
static NSString *const kOpenSSLString = @"Test data\n";
static NSString *const kOpenSSLPath = @"openssl.enc";
static NSString *const kOpenSSLPassword = @"Passw0rd";
- (void)testOpenSSLEncrypt
{
NSError *error = nil;
NSData *encryptedData = [RNOpenSSLEncryptor encryptData:[kOpenSSLString dataUsingEncoding:NSUTF8StringEncoding]
withSettings:kRNCryptorAES256Settings
password:kOpenSSLPassword
error:&error];
XCTAssertNotNil(encryptedData, @"Did not encrypt");
XCTAssertNil(error, @"Error:%@", error);
NSString *encryptedFile = CreateTemporaryFilePath();
NSString *decryptedFile = CreateTemporaryFilePath();
[encryptedData writeToFile:encryptedFile atomically:NO];
NSString *cmd = [NSString stringWithFormat:@"/usr/bin/openssl enc -d -aes-256-cbc -k %@ -in %@ -out %@", kOpenSSLPassword, encryptedFile, decryptedFile];
XCTAssertEqual(system([cmd UTF8String]), 0, @"System call failed");
NSString *decryptedString = [NSString stringWithContentsOfFile:decryptedFile encoding:NSUTF8StringEncoding error:&error];
XCTAssertEqualObjects(decryptedString, kOpenSSLString, @"Decryption doesn't match: %@", error);
}
- (void)testOpenSSLDecrypt
{
NSData *encryptedData = [NSData dataWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForResource:kOpenSSLPath ofType:nil]];
NSError *error = nil;
NSData *decryptedData = [RNOpenSSLDecryptor decryptData:encryptedData
withSettings:kRNCryptorAES256Settings
password:kOpenSSLPassword
error:&error];
XCTAssertNotNil(decryptedData, @"Did not decrypt");
XCTAssertNil(error, @"Error:%@", error);
NSString *decryptedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
XCTAssertEqualObjects(decryptedString, kOpenSSLString, @"Decrypted data does not match");
}
- (void)testOpenSSLDecryptStream {
NSString *filePath = [[NSBundle bundleForClass:[self class]] pathForResource:kOpenSSLPath ofType:nil];
NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:filePath];
[inputStream open];
__block NSOutputStream *outputStream = [[NSOutputStream alloc] initToMemory];
__block NSError *decryptionError = nil;
[outputStream open];
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
size_t blockSize = 1024;
__block RNDecryptor *decryptor;
__block NSMutableData *buffer = [NSMutableData dataWithLength:blockSize];
dispatch_block_t readStreamBlock = ^{
[buffer setLength:blockSize];
NSInteger bytesRead = [inputStream read:[buffer mutableBytes] maxLength:blockSize];
if (bytesRead < 0) {
XCTFail(@"Error reading block:%@", inputStream.streamError);
[inputStream close];
dispatch_semaphore_signal(sem);
}
else if (bytesRead == 0) {
[inputStream close];
[decryptor finish];
}
else {
[buffer setLength:bytesRead];
[decryptor addData:buffer];
NSLog(@"Sent %ld bytes to decryptor", (unsigned long)bytesRead);
}
};
decryptor = [[RNOpenSSLDecryptor alloc] initWithSettings:kRNCryptorAES256Settings
password:kOpenSSLPassword
handler:^(RNCryptor *cryptor, NSData *data) {
NSLog(@"Received %d bytes", data.length);
if (data.length > 0) {
[outputStream write:data.bytes maxLength:data.length];
}
if (cryptor.isFinished) {
[outputStream close];
dispatch_semaphore_signal(sem);
}
else {
readStreamBlock();
}
}];
readStreamBlock();
long timedout = dispatch_semaphore_wait(sem, dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC));
XCTAssertFalse(timedout, @"Test timed out.");
XCTAssertNil(decryptionError, @"Decrypt error: %@", decryptionError);
//Retrieve the decrypted data
NSData *decryptedData = [outputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
XCTAssertTrue([decryptedData length] > 0, @"Failed to decrypt.");
NSString *decryptedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
XCTAssertEqualObjects(decryptedString, kOpenSSLString, @"Decrypted data does not match");
}
@end