2 // sc-130-resignationticket.c
5 // Created by Richard Murphy on 5/1/13.
9 #include <Security/SecBase.h>
10 #include <Security/SecItem.h>
11 #include <Security/SecKey.h>
13 #include <SecureObjectSync/SOSCircle.h>
14 #include <SecureObjectSync/SOSPeerInfo.h>
15 #include <SecureObjectSync/SOSInternal.h>
17 #include <utilities/SecCFWrappers.h>
19 #include <CoreFoundation/CoreFoundation.h>
24 #include "SOSCircle_regressions.h"
26 #include "SOSRegressionUtilities.h"
28 typedef struct piStuff_t
{
30 SOSFullPeerInfoRef fpi
;
32 SOSPeerInfoRef resignation_ticket
;
35 static piStuff
*makeSimplePeer(char *name
) {
36 piStuff
*pi
= malloc(sizeof(piStuff
));
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
);
48 static inline bool retire_me(piStuff
*pi
, size_t seconds
) {
49 return SOSPeerInfoRetireRetirementTicket(seconds
, pi
->resignation_ticket
);
52 // Copied from SOSPeerInfo.c
53 static CFStringRef sFlatticket
= CFSTR("flatticket");
54 static CFStringRef sSignature
= CFSTR("RetirementPsig");
55 static CFStringRef sPeerid
= CFSTR("peerid");
58 static inline bool chkBasicTicket(piStuff
*pi
) {
59 return CFEqual(SOSPeerInfoInspectRetirementTicket(pi
->resignation_ticket
, NULL
), SOSPeerInfoGetPeerID(pi
->pi
));
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;
72 static void tests(void)
74 CFDateRef before_time
= CFDateCreate(NULL
, CFAbsoluteTimeGetCurrent());
76 piStuff
*iPhone
= makeSimplePeer("iPhone");
77 piStuff
*iPad
= makeSimplePeer("iPad");
78 piStuff
*iMac
= makeSimplePeer("iMac");
79 piStuff
*iDrone
= makeSimplePeer("iDrone");
81 CFDateRef after_time
= CFDateCreate(NULL
, CFAbsoluteTimeGetCurrent());
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");
91 // ok(miss_signature(iDrone, iPad), "signature failure detected");
93 ok(!retire_me(iPhone
, 10000), "ticket still valid");
95 ok(retire_me(iPhone
, 1), "ticket not valid");
97 CFDateRef retdate
= NULL
;
98 ok((retdate
= SOSPeerInfoGetRetirementDate(iPhone
->resignation_ticket
)) != NULL
, "got retirement date %@", retdate
);
99 CFReleaseSafe(retdate
);
102 CFDateRef appdate
= NULL
;
103 ok((appdate
= SOSPeerInfoGetApplicationDate(iPhone
->resignation_ticket
)) != NULL
, "got application date %@", appdate
);
104 CFReleaseSafe(appdate
);
108 static int kTestTestCount
= 20;
110 int sc_130_resignationticket(int argc
, char *const *argv
)
112 plan_tests(kTestTestCount
);