5 // Created by Michael Brouwer on 8/2/12.
6 // Copyright 2012 Apple Inc. All rights reserved.
9 #include <SecureObjectSync/SOSPeer.h>
11 #include "SOSCircle_regressions.h"
13 #include <corecrypto/ccsha2.h>
15 #include <Security/SecBase64.h>
17 #include <utilities/SecCFWrappers.h>
21 static int kTestTestCount
= 13;
23 struct SOSTestTransport
{
24 struct SOSTransport t
;
26 uint8_t digest
[CCSHA256_OUTPUT_SIZE
];
30 static void tests(void)
32 const unsigned kSOSPeerVersion
= 0;
34 CFErrorRef error
= NULL
;
37 /* Create peer test. */
38 CFStringRef peer_id
= CFSTR("peer 60");
40 __block
unsigned msg_count
= 0;
41 uint8_t msg_digest_buffer
[CCSHA256_OUTPUT_SIZE
];
42 uint8_t *msg_digest
= msg_digest_buffer
;
44 SOSPeerSendBlock sendBlock
= ^bool (CFDataRef message
, CFErrorRef
*error
) {
45 size_t msglen
= CFDataGetLength(message
);
46 const uint8_t *msg
= CFDataGetBytePtr(message
);
47 const struct ccdigest_info
*sha256
= ccsha256_di();
48 if (msg_count
++ == 0) {
50 ccdigest(sha256
, msglen
, msg
, msg_digest
);
53 ccdigest_di_decl(sha256
, sha256_ctx
);
54 ccdigest_init(sha256
, sha256_ctx
);
55 ccdigest_update(sha256
, sha256_ctx
, sizeof(msg_digest_buffer
), msg_digest
);
56 ccdigest_update(sha256
, sha256_ctx
, msglen
, msg
);
57 ccdigest_final(sha256
, sha256_ctx
, msg_digest
);
59 size_t encmaxlen
= SecBase64Encode(msg
, msglen
, NULL
, 0);
60 CFMutableDataRef encoded
= CFDataCreateMutable(NULL
, encmaxlen
);
61 CFDataSetLength(encoded
, encmaxlen
);
63 char *enc
= (char *)CFDataGetMutableBytePtr(encoded
);
67 SecBase64Encode2(msg
, msglen
,
69 encmaxlen
, kSecB64_F_LINE_LEN_USE_PARAM
,
71 assert(enclen
< INT32_MAX
);
73 // printf("=== BEGIN SOSMESSAGE ===\n%.*s\n=== END SOSMESSAGE ===\n", (int)enclen, enc);
80 ok(peer
= SOSPeerCreateSimple(peer_id
, kSOSPeerVersion
, &error
, sendBlock
),
81 "create peer: %@", error
);
84 /* Send a test message. */
85 is((int)msg_count
, 0, "no message sent yet");
88 memcpy(msg
, "0123456789", msglen
);
89 CFDataRef message
= CFDataCreate(NULL
, msg
, msglen
);
90 ok(SOSPeerSendMessage(peer
, message
, &error
),
91 "send message to peer: %@", error
);
93 is((int)msg_count
, 1, "We sent %d/1 messages", msg_count
);
96 /* Check the peer's version. */
97 is(SOSPeerGetVersion(peer
), kSOSPeerVersion
, "version is correct");
99 /* Get the peer's manifest. */
100 SOSManifestRef manifest
= SOSPeerCopyManifest(peer
, &error
);
101 ok(manifest
== NULL
, "No manifest yet for this peer: %@", error
);
102 CFReleaseNull(error
);
103 CFReleaseNull(manifest
);
105 /* Get the peer's manifest digest. */
106 CFDataRef digest
= SOSPeerCopyManifestDigest(peer
, &error
);
107 ok(digest
== NULL
, "No digest yet for this peer's manifest: %@", error
);
108 CFReleaseNull(error
);
109 CFReleaseNull(digest
);
111 ok(manifest
= SOSManifestCreateWithBytes(NULL
, 0, &error
), "Create empty manifest: %@", error
);
112 CFReleaseNull(error
);
113 ok(SOSPeerSetManifest(peer
, manifest
, &error
), "Set empty manifest on peer: %@", error
);
114 CFReleaseNull(error
);
116 /* Get the peer's empty manifest digest. */
117 digest
= SOSPeerCopyManifestDigest(peer
, &error
);
118 ok(digest
, "Got a digest: %@ this peer's manifest: %@", digest
, error
);
119 CFReleaseNull(error
);
122 SOSPeerDispose(peer
);
124 SOSPeerRef reinflated_peer
= NULL
;
125 ok(reinflated_peer
= SOSPeerCreateSimple(peer_id
, kSOSPeerVersion
, &error
, sendBlock
),
126 "create peer: %@", error
);
127 CFReleaseNull(error
);
129 CFDataRef digestAfterReinflate
= SOSPeerCopyManifestDigest(reinflated_peer
, &error
);
130 ok(digest
!= NULL
, "Got NULL after reinflate (%@)", error
);
131 ok(CFEqual(digest
, digestAfterReinflate
), "Compare digest after reinflate, before: %@ after: %@", digest
, digestAfterReinflate
);
132 CFReleaseNull(error
);
134 SOSPeerDispose(reinflated_peer
);
136 CFReleaseNull(digestAfterReinflate
);
137 CFReleaseNull(digest
);
140 int sc_60_peer(int argc
, char *const *argv
)
142 plan_tests(kTestTestCount
);