1/*
2 * Copyright (c) 2013-2014 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24
25/*!
26 @header SOSMessage.h
27 This provides interfaces to the encoding and decoding of peer to peer
28 messages in the Secure Object Syncing protocol.
29 SOSMessageRef is a CFTypeRef.
30 */
31
32#ifndef _SEC_SOSMESSAGE_H_
33#define _SEC_SOSMESSAGE_H_
34
35#include <SecureObjectSync/SOSDataSource.h>
36#include <SecureObjectSync/SOSManifest.h>
37
38__BEGIN_DECLS
39
40enum SOSMessageFlags {
41    kSOSMessageGetObjects                       = (0),
42    kSOSMessageJoinRequest                      = (1),
43    kSOSMessagePartial                          = (2),
44    kSOSMessageDigestTypesProposed              = (3),
45    kSOSMessageClearGetObjects                  = (4),
46    kSOSMessageDidClearGetObjectsSinceLastDelta = (5),
47    kSOSMessageSkipHello                        = (6),
48};
49typedef uint64_t SOSMessageFlags;
50
51enum SOSDigestTypes {
52    kSOSDigestTypeSHA1                          = (0),
53    kSOSDigestTypeDefault                       = kSOSDigestTypeSHA1,
54    kSOSDigestTypeSHA224                        = (1),
55    kSOSDigestTypeSHA256                        = (2),
56    kSOSDigestTypeSHA384                        = (3),
57    kSOSDigestTypeSHA512                        = (4),
58};
59typedef uint64_t SOSDigestTypes;
60
61/* SOSMessage interface. */
62typedef struct __OpaqueSOSMessage *SOSMessageRef;
63
64//#define kSOSMessageMaxObjectsSize (8192)
65#define kSOSMessageMaxObjectsSize (65536)
66
67#define kEngineMessageProtocolVersion 2
68
69//
70// MARK: SOSMessage encoding
71//
72
73// Create an SOSMessage ready to be encoded.
74SOSMessageRef SOSMessageCreate(CFAllocatorRef allocator, uint64_t version, CFErrorRef *error);
75
76SOSMessageRef SOSMessageCreateWithManifests(CFAllocatorRef allocator, SOSManifestRef sender,
77                                            SOSManifestRef base, SOSManifestRef proposed,
78                                            bool includeManifestDeltas, CFErrorRef *error);
79
80bool SOSMessageSetManifests(SOSMessageRef message, SOSManifestRef sender,
81                            SOSManifestRef base, SOSManifestRef proposed,
82                            bool includeManifestDeltas, SOSManifestRef objectsSent,
83                            CFErrorRef *error);
84
85
86// Add an extension to this message
87void SOSMessageAddExtension(SOSMessageRef message, CFDataRef oid, bool isCritical, CFDataRef extension);
88
89bool SOSMessageAppendObject(SOSMessageRef message, CFDataRef object, CFErrorRef *error);
90
91void SOSMessageSetFlags(SOSMessageRef message, SOSMessageFlags flags);
92
93// Encode an SOSMessage, calls addObject callback and appends returned objects
94// one by one, until addObject returns NULL.
95CFDataRef SOSMessageCreateData(SOSMessageRef message, uint64_t sequenceNumber, CFErrorRef *error);
96
97//
98// MARK: SOSMessage decoding
99//
100
101// Decode a SOSMessage
102SOSMessageRef SOSMessageCreateWithData(CFAllocatorRef allocator, CFDataRef derData, CFErrorRef *error);
103
104// Read values from a decoded messgage
105
106CFDataRef SOSMessageGetBaseDigest(SOSMessageRef message);
107
108CFDataRef SOSMessageGetProposedDigest(SOSMessageRef message);
109
110CFDataRef SOSMessageGetSenderDigest(SOSMessageRef message);
111
112SOSMessageFlags SOSMessageGetFlags(SOSMessageRef message);
113
114uint64_t SOSMessageGetSequenceNumber(SOSMessageRef message);
115
116SOSManifestRef SOSMessageGetRemovals(SOSMessageRef message);
117
118SOSManifestRef SOSMessageGetAdditions(SOSMessageRef message);
119
120// Iterate though the extensions in a decoded SOSMessage.  If criticalOnly is
121// true all non critical extensions are skipped.
122void SOSMessageWithExtensions(SOSMessageRef message, bool criticalOnly,
123                              void(^withExtension)(CFDataRef oid, bool isCritical,
124                                                   CFDataRef extension, bool *stop));
125
126size_t SOSMessageCountObjects(SOSMessageRef message);
127
128// Iterate though the objects in a decoded SOSMessage.
129bool SOSMessageWithObjects(SOSMessageRef message, CFErrorRef *error,
130                           void(^withObject)(CFDataRef object, bool *stop));
131
132bool SOSMessageWithSOSObjects(SOSMessageRef message, SOSDataSourceRef dataSource, CFErrorRef *error,
133                           void(^withObject)(SOSObjectRef object, bool *stop));
134
135__END_DECLS
136
137#endif /* _SEC_SOSMESSAGE_H_ */
138