]> git.saurik.com Git - apple/security.git/blob - sec/SOSCircle/Regressions/sc-130-resignationticket.c
Security-55471.14.8.tar.gz
[apple/security.git] / sec / SOSCircle / Regressions / sc-130-resignationticket.c
1 //
2 // sc-130-resignationticket.c
3 // sec
4 //
5 // Created by Richard Murphy on 5/1/13.
6 //
7 //
8
9 #include <Security/SecBase.h>
10 #include <Security/SecItem.h>
11 #include <Security/SecKey.h>
12
13 #include <SecureObjectSync/SOSCircle.h>
14 #include <SecureObjectSync/SOSPeerInfo.h>
15 #include <SecureObjectSync/SOSInternal.h>
16
17 #include <utilities/SecCFWrappers.h>
18
19 #include <CoreFoundation/CoreFoundation.h>
20
21 #include <stdlib.h>
22 #include <unistd.h>
23
24 #include "SOSCircle_regressions.h"
25
26 #include "SOSRegressionUtilities.h"
27
28 typedef struct piStuff_t {
29 SecKeyRef signingKey;
30 SOSFullPeerInfoRef fpi;
31 SOSPeerInfoRef pi;
32 SOSPeerInfoRef resignation_ticket;
33 } piStuff;
34
35 static piStuff *makeSimplePeer(char *name) {
36 piStuff *pi = malloc(sizeof(piStuff));
37
38 if(!pi) return NULL;
39 pi->signingKey = NULL;
40 CFStringRef cfName = CFStringCreateWithCString(kCFAllocatorDefault, name, kCFStringEncodingMacRoman);
41 pi->fpi = SOSCreateFullPeerInfoFromName(cfName, &pi->signingKey, NULL);
42 CFReleaseSafe(cfName);
43 pi->pi = SOSFullPeerInfoGetPeerInfo(pi->fpi);
44 pi->resignation_ticket = SOSPeerInfoCreateRetirementTicket(kCFAllocatorDefault, pi->signingKey, pi->pi, NULL);
45 return pi;
46 }
47
48 static inline bool retire_me(piStuff *pi, size_t seconds) {
49 return SOSPeerInfoRetireRetirementTicket(seconds, pi->resignation_ticket);
50 }
51
52 // Copied from SOSPeerInfo.c
53 static CFStringRef sFlatticket = CFSTR("flatticket");
54 static CFStringRef sSignature = CFSTR("RetirementPsig");
55 static CFStringRef sPeerid = CFSTR("peerid");
56
57
58 static inline bool chkBasicTicket(piStuff *pi) {
59 return CFEqual(SOSPeerInfoInspectRetirementTicket(pi->resignation_ticket, NULL), SOSPeerInfoGetPeerID(pi->pi));
60 }
61
62 static bool in_between_time(CFDateRef before, piStuff *pi, CFDateRef after) {
63 CFDateRef during = SOSPeerInfoGetRetirementDate(pi->resignation_ticket);
64 CFTimeInterval time1 = CFDateGetTimeIntervalSinceDate(before, during);
65 CFTimeInterval time2 = CFDateGetTimeIntervalSinceDate(during, after);
66 CFReleaseNull(during);
67 if(time1 >= 0.0) return false;
68 if(time2 >= 0.0) return false;
69 return true;
70 }
71
72 static void tests(void)
73 {
74 CFDateRef before_time = CFDateCreate(NULL, CFAbsoluteTimeGetCurrent());
75 sleep(1);
76 piStuff *iPhone = makeSimplePeer("iPhone");
77 piStuff *iPad = makeSimplePeer("iPad");
78 piStuff *iMac = makeSimplePeer("iMac");
79 piStuff *iDrone = makeSimplePeer("iDrone");
80 sleep(1);
81 CFDateRef after_time = CFDateCreate(NULL, CFAbsoluteTimeGetCurrent());
82
83 ok(in_between_time(before_time, iPhone, after_time), "retirement date recorded correctly");
84 CFReleaseSafe(before_time);
85 CFReleaseSafe(after_time);
86 ok(chkBasicTicket(iPhone), "peer ID's Match");
87 ok(chkBasicTicket(iPad), "peer ID's Match");
88 ok(chkBasicTicket(iMac), "peer ID's Match");
89 ok(chkBasicTicket(iDrone), "peer ID's Match");
90
91 // ok(miss_signature(iDrone, iPad), "signature failure detected");
92
93 ok(!retire_me(iPhone, 10000), "ticket still valid");
94 sleep(2);
95 ok(retire_me(iPhone, 1), "ticket not valid");
96
97 CFDateRef retdate = NULL;
98 ok((retdate = SOSPeerInfoGetRetirementDate(iPhone->resignation_ticket)) != NULL, "got retirement date %@", retdate);
99 CFReleaseSafe(retdate);
100
101 #if 0
102 CFDateRef appdate = NULL;
103 ok((appdate = SOSPeerInfoGetApplicationDate(iPhone->resignation_ticket)) != NULL, "got application date %@", appdate);
104 CFReleaseSafe(appdate);
105 #endif
106 }
107
108 static int kTestTestCount = 20;
109
110 int sc_130_resignationticket(int argc, char *const *argv)
111 {
112 plan_tests(kTestTestCount);
113
114 tests();
115
116 return 0;
117 }