]>
Commit | Line | Data |
---|---|---|
fa7225c8 A |
1 | // |
2 | // KCAESGCMTest.m | |
3 | // Keychain Circle | |
4 | // | |
5 | // | |
6 | ||
7 | #import <XCTest/XCTest.h> | |
8 | ||
9 | #import <Foundation/Foundation.h> | |
10 | #import <KeychainCircle/KCAESGCMDuplexSession.h> | |
11 | ||
12 | @interface KCAESGCMTest : XCTestCase | |
13 | ||
14 | @end | |
15 | ||
16 | @implementation KCAESGCMTest | |
17 | ||
18 | - (void)setUp { | |
19 | [super setUp]; | |
20 | // Put setup code here. This method is called before the invocation of each test method in the class. | |
21 | } | |
22 | ||
23 | - (void)tearDown { | |
24 | // Put teardown code here. This method is called after the invocation of each test method in the class. | |
25 | [super tearDown]; | |
26 | } | |
27 | ||
28 | - (void) sendMessage: (NSData*) message | |
29 | from: (KCAESGCMDuplexSession*) sender | |
30 | to: (KCAESGCMDuplexSession*) receiver { | |
31 | NSError* error = nil; | |
32 | NSData* sendToRecv = [sender encrypt:message error:&error]; | |
33 | ||
34 | XCTAssertNil(error, @"Got error"); | |
35 | XCTAssertNotNil(sendToRecv, @"Failed to get data"); | |
36 | ||
37 | error = nil; | |
38 | NSData* decryptedSendToRecv = [receiver decryptAndVerify:sendToRecv error:&error]; | |
39 | ||
40 | XCTAssertNil(error, @"Error decrypting"); | |
41 | XCTAssertNotNil(decryptedSendToRecv, @"Got decryption"); | |
42 | ||
43 | XCTAssertEqualObjects(message, decryptedSendToRecv, @"Send to recv failed."); | |
44 | } | |
45 | ||
46 | - (void)testAESGCMDuplex { | |
47 | uint64_t context = 0x81FC134000123041; | |
48 | uint8_t secretBytes[] = { 0x11, 0x22, 0x33, 0x13, 0x44, 0xF1, 0x13, 0x92, 0x11, 0x22, 0x33, 0x13, 0x44, 0xF1, 0x13, 0x92 }; | |
49 | NSData* secret = [NSData dataWithBytes:secretBytes length:sizeof(secretBytes)]; | |
50 | ||
51 | KCAESGCMDuplexSession* sender = [KCAESGCMDuplexSession sessionAsSender:secret | |
52 | context:context]; | |
53 | ||
54 | KCAESGCMDuplexSession* receiver = [KCAESGCMDuplexSession sessionAsReceiver:secret | |
55 | context:context]; | |
56 | ||
57 | uint8_t sendToRecvBuffer[] = { 0x1, 0x2, 0x3, 0x88, 0xFF, 0xE1 }; | |
58 | NSData* sendToRecvData = [NSData dataWithBytes:sendToRecvBuffer length:sizeof(sendToRecvBuffer)]; | |
59 | ||
60 | [self sendMessage:sendToRecvData from:sender to:receiver]; | |
61 | ||
62 | uint8_t recvToSendBuffer[] = { 0x81, 0x52, 0x63, 0x88, 0xFF, 0xE1 }; | |
63 | NSData* recvToSendData = [NSData dataWithBytes:recvToSendBuffer length:sizeof(recvToSendBuffer)]; | |
64 | ||
65 | [self sendMessage:recvToSendData from:receiver to:sender]; | |
66 | } | |
67 | ||
68 | - (KCAESGCMDuplexSession*) archiveDearchive: (KCAESGCMDuplexSession*) original { | |
69 | NSMutableData *data = [NSMutableData data]; | |
70 | NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; | |
71 | [archiver encodeObject:original forKey:@"Top"]; | |
72 | [archiver finishEncoding]; | |
73 | ||
74 | NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; | |
866f8763 | 75 | unarchiver.requiresSecureCoding = YES; |
fa7225c8 A |
76 | |
77 | // Customize the unarchiver. | |
78 | KCAESGCMDuplexSession *result = [unarchiver decodeObjectForKey:@"Top"]; | |
79 | [unarchiver finishDecoding]; | |
80 | ||
81 | return result; | |
82 | } | |
83 | ||
84 | - (void)doAESGCMDuplexCodingFlattenSender: (bool) flattenSender | |
85 | Receiver: (bool) flattenReceiver { | |
86 | uint64_t context = 0x81FC134000123041; | |
87 | uint8_t secretBytes[] = { 0x73, 0xb7, 0x7f, 0xff, 0x7f, 0xe3, 0x44, 0x6b, 0xa4, 0xec, 0x9d, 0x5d, 0x68, 0x12, 0x13, 0x71 }; | |
88 | NSData* secret = [NSData dataWithBytes:secretBytes length:sizeof(secretBytes)]; | |
89 | ||
90 | KCAESGCMDuplexSession* sender = [KCAESGCMDuplexSession sessionAsSender:secret | |
91 | context:context]; | |
92 | ||
93 | KCAESGCMDuplexSession* receiver = [KCAESGCMDuplexSession sessionAsReceiver:secret | |
94 | context:context]; | |
95 | ||
96 | { | |
97 | uint8_t sendToRecvBuffer[] = { 0x0e, 0x9b, 0x9d, 0x2c, 0x90, 0x96, 0x8a }; | |
98 | NSData* sendToRecvData = [NSData dataWithBytes:sendToRecvBuffer length:sizeof(sendToRecvBuffer)]; | |
99 | ||
100 | [self sendMessage:sendToRecvData from:sender to:receiver]; | |
101 | ||
102 | ||
103 | uint8_t recvToSendBuffer[] = { 0x9b, 0x63, 0xaf, 0xb5, 0x4d, 0xa0, 0xfa, 0x9d, 0x90 }; | |
104 | NSData* recvToSendData = [NSData dataWithBytes:recvToSendBuffer length:sizeof(recvToSendBuffer)]; | |
105 | ||
106 | [self sendMessage:recvToSendData from:receiver to:sender]; | |
107 | } | |
108 | ||
109 | // Re-encode... | |
110 | if (flattenSender) { | |
111 | sender = [self archiveDearchive:sender]; | |
112 | } | |
113 | ||
114 | if (flattenReceiver) { | |
115 | receiver = [self archiveDearchive:receiver]; | |
116 | } | |
117 | ||
118 | { | |
119 | uint8_t sendToRecvBuffer[] = { 0xae, 0xee, 0x5f, 0x62, 0xb2, 0x72, 0x6f, 0x0a, 0xb6, 0x56 }; | |
120 | NSData* sendToRecvData = [NSData dataWithBytes:sendToRecvBuffer length:sizeof(sendToRecvBuffer)]; | |
121 | ||
122 | [self sendMessage:sendToRecvData from:sender to:receiver]; | |
123 | ||
124 | ||
125 | uint8_t recvToSendBuffer[] = { 0x49, 0x0b, 0xbb, 0x2d, 0x20, 0xb1, 0x8a, 0xfc, 0xba, 0xd1, 0xFF }; | |
126 | NSData* recvToSendData = [NSData dataWithBytes:recvToSendBuffer length:sizeof(recvToSendBuffer)]; | |
127 | ||
128 | [self sendMessage:recvToSendData from:receiver to:sender]; | |
129 | } | |
130 | } | |
131 | ||
132 | - (void)testAESGCMDuplexCoding { | |
133 | [self doAESGCMDuplexCodingFlattenSender:NO Receiver:YES]; | |
134 | [self doAESGCMDuplexCodingFlattenSender:YES Receiver:NO]; | |
135 | [self doAESGCMDuplexCodingFlattenSender:YES Receiver:YES]; | |
136 | } | |
137 | ||
138 | ||
139 | @end |