SOSForerunnerSession.h   [plain text]


/*
 * Copyright (c) 2013-2014 Apple Inc. All Rights Reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this
 * file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */

/*!
 @header SOSForerunnerSession.h
 Describes interfaces for both requesting and approving forerunner sessions. A
 A forerunner session encapsulates the following control flow between two 
 devices, Requestor and Acceptor, when Requestor attempts to join a syncing 
 circle already inhabited by Acceptor.

 0. Requestor creates a requesting session containing PAKE key pair
 1. Requestor creates a packet to request membership in the syncing circle;
	Packet includes session public key
 2. Requestor sends RequestPacket to Acceptor using an interface of its 
	choosing
 3. Acceptor receives RequestPacket.
 4. Acceptor creates an approving session containing PAKE key pair with 
    RequestPacket
 5. Acceptor generates Secret, a six-digit code that never leaves Acceptor
 6. Acceptor generates ChallengePacket, derived from the public key in 
    RequestPacket and Secret
 7. Acceptor sends ChallengePacket to Requestor using an interface of its 
    choosing
 8. Requestor receives ChallengePacket
 9. Requestor asks User to enter Secret
10. Requestor creates ResponsePacket, derived from Secret and the public key 
    contained in ChallengePacket
11. Requestor sends ResponsePacket to Acceptor using an interface of its 
    choosing
12. Acceptor receives ResponsePacket
13. Acceptor validates ResponsePacket
14. Acceptor generates HSA2Code
14b. Acceptor encrypts and attests to the HSA2Code to its session key
15. Acceptor sends encrypted HSA2Code to Requestor using an interface of its
    choosing
16. Requestor receives encrypted HSA2Code
16b. Requestor decrypts and verifies HSA2Code
17. Requestor sends HSA2Code to Apple
18. Apple adds Requestor to trusted device list
19. Requestor generates Identity
20. Requestor applies to syncing circle with Identity
 */

#ifndef _SEC_SOSFORERUNNERSESSION_H_
#define _SEC_SOSFORERUNNERSESSION_H_

#include <sys/cdefs.h>
#include <os/base.h>
#include <os/object.h>
#include <CoreFoundation/CoreFoundation.h>
#include <CoreFoundation/CFError.h>

__BEGIN_DECLS

/*!
 @const SECFR_API_VERSION
 An API version that may be used during the preprocessing phase to determine
 which version of the API is being built against. This may be used to guard
 against breaking due to changes in the API that are not sync'ed against your
 project. For example, if version 20150424 adds a new method, 
 SOSFRSNewMethod(), you may guard your use of that method with
 
 #if SECFR_API_VERSION >= 20150424
 SOSFRSNewMethod();
 #endif // SECFR_API_VERSION >= 20150424
 */
#define SECFR_API_VERSION 20150424

/*!
 @type SOSForerunnerRequestorSessionRef
 An opaque type representing the requesting side of a session being used to
 enter the requestor into a syncing circle. The object has no thread affinity,
 but it is not safe to invoke methods on the same object from multiple threads
 concurrently.
 */
typedef struct __OpaqueSOSForerunnerRequestorSession
		*SOSForerunnerRequestorSessionRef;

/*!
 @function SOSForerunnerRequestorSessionGetTypeID

 @abstract
 Returns the type identifier for the requestor session class.

 @result
 A type identifier.
 */
OS_EXPORT OS_WARN_RESULT
CFTypeID
SOSForerunnerRequestorSessionGetTypeID(void);

/*!
 @function SOSForerunnerRequestorSessionCreate

 @abstract 
 Creates a new requesting session object to negotiate entry into a syncing
 circle.
 
 @param allocator
 The vestigal CoreFoundation allocator. Pass NULL or 
 {@link kCFAllocatorDefault}.
 
 @param username
 The AppleID for the account whose syncing circle is to be joined.
 
 @param dsid
 The DirectoryServices identifier for the AppleID given in {@param username}.

 @result
 A new session object. This object must be released with {@link CFRelease} when
 it is no longer needed.
 */
OS_EXPORT OS_MALLOC OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT
SOSForerunnerRequestorSessionRef
SOSForerunnerRequestorSessionCreate(CFAllocatorRef allocator,
		CFStringRef username, uint64_t dsid);

/*!
 @function SOSFRSCopyRequestPacket

 @abstract 
 Returns a request packet suitable for requesting to join a syncing circle.
 
 @param session
 The session from which to copy the request packet.
 
 @param error
 Upon unsuccessful return, an error object describing the failure condition. May
 be NULL.

 @result
 A new data object representing the request packet.
 */
OS_EXPORT OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT OS_NONNULL1
CFDataRef
SOSFRSCopyRequestPacket(SOSForerunnerRequestorSessionRef session,
		CFErrorRef *error);

/*!
 @function SOSFRSCopyResponsePacket

 @abstract
 Returns a response packet suitable for responding to a challenge to join a
 syncing circle.

 @param session
 The session from which to copy the response packet.
 
 @param challenge
 The challenge packet received from the approving device.
 
 @param secret
 The six-digit secret generated by the approving device and entered by the user 
 on the requesting device.
 
 @param peerInfo
 A dictionary containing information about the peer, such as GPS location, 
 device type, etc. Pass NULL for now. This contents of this dictionary will be
 defined at a future date.
 
 @param error
 Upon unsuccessful return, an error object describing the failure condition. May
 be NULL.

 @result
 A new data object representing the response packet.
 */
OS_EXPORT OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT OS_NONNULL1 OS_NONNULL2
OS_NONNULL3
CFDataRef
SOSFRSCopyResponsePacket(SOSForerunnerRequestorSessionRef session,
		CFDataRef challenge, CFStringRef secret, CFDictionaryRef peerInfo,
		CFErrorRef *error);

/*!
 @function SOSFRSCopyHSA2CodeFromPacket

 @abstract
 Returns the HSA2 join code from the encrypted packet sent by the approving 
 device.

 @param session
 The session from which to copy the HSA2 join code.

 @param hsa2packet
 The encrypted packet containing the HSA2 join code sent by the approving 
 device.

 @result
 A new data object representing the HSA2 join code.
 */
OS_EXPORT OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT OS_NONNULL1 OS_NONNULL2
CFDataRef
SOSFRSCopyHSA2CodeFromPacket(SOSForerunnerRequestorSessionRef session,
		CFDataRef hsa2packet, CFErrorRef *error);

/*!
 @function SOSFRSCopyDecryptedData

 @abstract
 Decrypts data received through the secured communication channel negotiated by
 the session.

 @param session
 The session that the encrypted data is associated with.
 
 @param encrypted
 The encrypted data received from the approving device.

 @result
 A new data object representing the decrypted data received from the approving
 device.
 */
OS_EXPORT OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT OS_NONNULL1 OS_NONNULL2
CFDataRef
SOSFRSCopyDecryptedData(SOSForerunnerRequestorSessionRef session,
		CFDataRef encrypted);

/*!
 @type SOSForerunnerAcceptorSessionRef
 An opaque type representing the accepting side of a session being used to
 enter a new requesting device into the syncing circle of which the acceptor is
 a member. The object has no thread affinity, but it is not safe to invoke 
 methods on the same object from multiple threads concurrently.
 */
typedef struct __OpaqueSOSForerunnerAcceptorSession
		*SOSForerunnerAcceptorSessionRef;

/*!
 @function SOSForerunnerAcceptorSessionGetTypeID

 @abstract
 Returns the type identifier for the acceptor session class.

 @result
 A type identifier.
 */
OS_EXPORT OS_WARN_RESULT
CFTypeID
SOSForerunnerAcceptorSessionGetTypeID(void);

/*!
 @function SOSForerunnerAcceptorSessionCreate

 @abstract
 Creates a new accepting session object to negotiate entry of a requesting 
 device into a syncing circle.

 @param allocator
 The vestigal CoreFoundation allocator. Pass NULL or
 {@link kCFAllocatorDefault}.
 
 @param username
 The AppleID for the account whose syncing circle is to be joined.
 
 @param dsid
 The DirectoryServices identifier for the AppleID given in {@param username}.
 
 @param circleSecret
 The six-digit secret generated to join the syncing circle.

 @result
 A new session object. This object must be released with {@link CFRelease} when
 it is no longer needed.
 */
OS_EXPORT OS_MALLOC OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT OS_NONNULL2
OS_NONNULL4
SOSForerunnerAcceptorSessionRef
SOSForerunnerAcceptorSessionCreate(CFAllocatorRef allocator,
		CFStringRef username, uint64_t dsid, CFStringRef circleSecret);

/*!
 @function SOSFASCopyChallengePacket

 @abstract
 Returns a challenge packet that a requesting device must satisfy to join the
 syncing circle of which the accepting device is a member.

 @param session
 The session from which to copy the challenge packet.
 
 @param requestorPacket
 The initial requestor packet received from the device requesting to join the
 circle.
 
 @param error
 Upon unsuccessful return, an error object describing the failure condition. May
 be NULL.

 @result
 A new data object representing the challenge packet.
 */
OS_EXPORT OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT OS_NONNULL1 OS_NONNULL2
CFDataRef
SOSFASCopyChallengePacket(SOSForerunnerAcceptorSessionRef session,
		CFDataRef requestorPacket, CFErrorRef *error);

/*!
 @function SOSFASCopyHSA2Packet

 @abstract
 Processes the packet sent in response to the challenge packet by the requesting
 device and, if the challenge is satisfied, arms auto-acceptance into the HSA2
 trusted device list and returns a packet containing the HSA2 join code to be
 sent to the requestor.

 @param session
 The session associated with the challenge that the response was sent to 
 satisfy.
 
 @param responsePacket
 The packet sent by the requestor in response to the challenge.
 
 @param hsa2Code
 The code for the requestor to use to join the HSA2 trusted device list.
 
 @param error
 Upon unsuccessful return, an error object describing the failure condition.
 Unlike the other interfaces in this API suite, this parameter cannot be NULL,
 as different error codes indicate different caller responsibilities.

 If the underlying error is EAGAIN, the caller may attempt to re-negotiate with
 the requesting device. If too many attempts are made to re-negotiate, EBADMSG
 will be returned. At this point, the caller may not attempt to create another
 HSA2 packet; the connection should be terminated and the session torn down.
 
 @result
 An encrypted packet containing the HSA2 join code. NULL in the event of 
 failure.
 */
OS_EXPORT OS_MALLOC OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT OS_NONNULL1
OS_NONNULL2 OS_NONNULL3 OS_NONNULL4
CFDataRef
SOSFASCopyHSA2Packet(SOSForerunnerAcceptorSessionRef session,
		CFDataRef responsePacket, CFDataRef hsa2Code, CFErrorRef *error);

/*!
 @function SOSFASCopyEncryptedData

 @abstract
 Encrypts data for transport over the negotiated session.

 @param session
 The session object for which to encrypt the given data.

 @param data
 The data to encrypt.

 @result
 The encrypted representation of {@param data}.
 */
OS_EXPORT OS_MALLOC OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT OS_NONNULL1
OS_NONNULL2
CFDataRef
SOSFASCopyEncryptedData(SOSForerunnerAcceptorSessionRef session,
		CFDataRef data);

__END_DECLS

#endif /* _SEC_SOSFORERUNNERSESSION_H_ */