]> git.saurik.com Git - apple/security.git/blame - KeychainCircle/Tests/KCAESGCMTest.m
Security-58286.1.32.tar.gz
[apple/security.git] / KeychainCircle / Tests / KCAESGCMTest.m
CommitLineData
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