#ifndef _SOSTRANSPORT_H_
#define _SOSTRANSPORT_H_
#include <corecrypto/ccsha1.h>
#include <CoreFoundation/CFData.h>
#include <CoreFoundation/CFError.h>
__BEGIN_DECLS
enum {
kSOSManifestUnsortedError = 1,
kSOSManifestCreateError = 2,
};
typedef struct SOSTransport *SOSTransportRef;
struct SOSTransport {
bool (*send)(SOSTransportRef transport, CFDataRef message);
};
SOSTransportRef SOSTransportCopyCloudTransport(void);
#define SOSDigestSize ((size_t)CCSHA1_OUTPUT_SIZE)
#define SOSDigestVectorInit { .digest = NULL, .count = 0, .capacity = 0, .is_sorted = false }
struct SOSDigestVector {
uint8_t (*digest)[SOSDigestSize];
size_t count;
size_t capacity;
bool is_sorted;
};
void SOSDigestVectorAppend(struct SOSDigestVector *dv, const uint8_t *digest);
void SOSDigestVectorSort(struct SOSDigestVector *dv);
size_t SOSDigestVectorIndexOf(struct SOSDigestVector *dv, const uint8_t *digest);
bool SOSDigestVectorContains(struct SOSDigestVector *dv, const uint8_t *digest);
void SOSDigestVectorReplaceAtIndex(struct SOSDigestVector *dv, size_t ix, const uint8_t *digest);
void SOSDigestVectorFree(struct SOSDigestVector *dv);
typedef void (*SOSDigestVectorApplyFunc)(void *context, const uint8_t digest[SOSDigestSize]);
void SOSDigestVectorApply(struct SOSDigestVector *dv,
void *context, SOSDigestVectorApplyFunc func);
void SOSDigestVectorDiff(struct SOSDigestVector *dv1, struct SOSDigestVector *dv2,
struct SOSDigestVector *dv1_2, struct SOSDigestVector *dv2_1);
bool SOSDigestVectorPatch(struct SOSDigestVector *base, struct SOSDigestVector *removals,
struct SOSDigestVector *additions, struct SOSDigestVector *dv,
CFErrorRef *error);
typedef struct __OpaqueSOSObjectID *SOSObjectID;
typedef struct __OpaqueSOSManifest *SOSManifestRef;
SOSManifestRef SOSManifestCreateWithBytes(const uint8_t *bytes, size_t len,
CFErrorRef *error);
SOSManifestRef SOSManifestCreateWithData(CFDataRef data, CFErrorRef *error);
void SOSManifestDispose(SOSManifestRef m);
size_t SOSManifestGetSize(SOSManifestRef m);
size_t SOSManifestGetCount(SOSManifestRef m);
const uint8_t *SOSManifestGetBytePtr(SOSManifestRef m);
CFDataRef SOSManifestGetData(SOSManifestRef m);
bool SOSManifestDiff(SOSManifestRef a, SOSManifestRef b,
SOSManifestRef *a_minus_b, SOSManifestRef *b_minus_a,
CFErrorRef *error);
SOSManifestRef SOSManifestCreateWithPatch(SOSManifestRef base,
SOSManifestRef removals,
SOSManifestRef additions,
CFErrorRef *error);
void SOSManifestForEach(SOSManifestRef m, void(^block)(CFDataRef e));
CFStringRef SOSManifestCopyDescription(SOSManifestRef m);
#if 0
SOSObjectRef SOSManifestGetObject(SOSManifestRef m, SOSObjectID k);
void SOSManifestPutObject(SOSManifestRef m, SOSObjectID k, SOSObjectRef v);
typedef SOSObjectRef(*SOSManifestGetF)(void *get_ctx, SOSObjectID k);
SOSManifestRef SOSManifestCreateSparse(void *get_ctx, SOSManifestGetF get_f);
#endif
__END_DECLS
#endif