/*
 *
 *    Copyright (c) 2016-2017 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

/**
 *    @file
 *      This file defines a Wrapper for C++ implementation of key export functionality
 *      to support pin encryption.
 *
 */

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

extern NSString * const NLWeaveKeyExportClientErrorDomain;

// Error codes for NLWeaveKeyExportClientErrorDomain
typedef NS_ENUM(NSInteger, NLWeaveKeyExportClientErrorDomainCode) {
    NLWeaveKeyExportClientErrorDomainInvalidExportBufferSize = 2,
    NLWeaveKeyExportClientErrorDomainKeyExportRequestFailure = 3,
    NLWeaveKeyExportClientErrorDomainKeyExportResponseFailure = 4,
    NLWeaveKeyExportClientErrorDomainProcessReconfiugreFailure = 5,
    NLWeaveKeyExportClientErrorDomainInvalidArgument = 6
};

/**
 * @class NLWeaveKeyExportClient
 * Wrapper for C++ implementation of key export functionality to
 * support pin encryption.
 */
@interface NLWeaveKeyExportClient : NSObject

/**
 * Generate a key export request given an access token.
 *
 * @param[in] keyId             The Weave key id of the key to be exported.
 * @param[in] responderNodeId   The Weave node id of the device to which the request will be forwarded; or
 *                              0 if the particular device id is unknown.
 * @param[in] accessToken       A buffer containing a Weave access token, in Weave TLV format.
 * @param[out] errOut           Output error parameter, set in the event an error occurs and errOut is not null.
 * @return                      Binary buffer containing the generated key export request. Set to nil if error occurs.
 */
- (nullable NSData *)generateKeyExportRequest:(UInt32)keyId
                              responderNodeId:(UInt64)responderNodeId
                                  accessToken:(NSData *)accessToken
                                        error:(NSError **)errOut;

/**
 * Generate a key export request given a client certificate and private key.
 *
 * @param[in] keyId             The Weave key id of the key to be exported.
 * @param[in] responderNodeId   The Weave node id of the device to which the request will be forwarded; or
 *                              0 if the particular device id is unknown.
 * @param[in] clientCert        A buffer containing a Weave certificate identifying the client making the request.
 *                              The certificate is expected to be encoded in Weave TLV format.
 * @param[in] clientKey         A buffer containing the private key associated with the client certificate.
 *                              The private key is expected to be encoded in Weave TLV format.
 * @param[out] errOut           Output error parameter, set in the event an error occurs and errOut is not null.
 * @return                      Binary buffer containing the generated key export request. Set to nil if error occurs.
 */
- (nullable NSData *)generateKeyExportRequest:(UInt32)keyId
                              responderNodeId:(UInt64)responderNodeId
                                   clientCert:(NSData *)clientCert
                                    clientKey:(NSData *)clientKey
                                        error:(NSError **)errOut;

/**
 * Process the response to a previously-generated key export request.
 *
 * @param[in] responderNodeId   The Weave node id of the device to which the request was forwarded; or
 *                              0 if the particular device id is unknown.
 * @param[in] exportResp        A buffer containing a Weave key export response, as returned by the device.
 * @param[out] errOut           Output error parameter, set in the event an error occurs and errOut is not null.
 * @return                      Binary buffer containing exported key.  Set to nil if error occurs.
 */
- (nullable NSData *)processKeyExportResponse:(UInt64)responderNodeId exportResp:(NSData *)exportResp error:(NSError **)errOut;

/**
 * Process a reconfigure message received in response to a previously-generated key export request.
 *
 * @param[in] reconfig          A buffer containing a Weave key export reconfigure message, as returned
 *                              by the device.
 * @param[out] errOut           Output error parameter, set in the event an error occurs and errOut is not null.
 * @return                      True on success, False on failure.
 */
- (BOOL)processKeyExportReconfigure:(NSData *)reconfig error:(NSError **)errOut;

/**
 * Reset the key export client object, discarding any state associated with a pending key export request.
 */
- (void)reset;

/**
 * True if key export responses from Nest development devices will be allowed.
 */
- (BOOL)allowNestDevelopmentDevices;

/**
 * Allow or disallow key export responses from Nest development devices.
 */
- (void)setAllowNestDevelopmentDevices:(BOOL)nestDev;

/**
 * True if key export responses from devices with SHA1 certificates will be allowed.
 */
- (BOOL)allowSHA1DeviceCertificates;

/**
 * Allow or disallow key export responses from devices with SHA1 certificates.
 */
- (void)setAllowSHA1DeviceCertificates:(BOOL)nestDev;

/**
 *  Initializes NLWeaveKeyExportClient object.  Creates instance and initializes instace of
 *  internal C++ object for performing key export functionality.
 */
- (instancetype)init;

@end
NS_ASSUME_NONNULL_END
