/**
 * Copyright 2017 Google Inc.
 *
 * 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.
 *
 **************************************************************************
 */

#import <Foundation/Foundation.h>

@class TINKKeyTemplate;
@class TINKKeysetReader;
@protocol TINKAead;

NS_ASSUME_NONNULL_BEGIN

/**
 * KeysetHandle provides abstracted access to Keysets, to limit the exposure of actual protocol
 * buffers that hold sensitive key material.
 */
@interface TINKKeysetHandle : NSObject

/**
 * Use -initWithKeysetReader:andKey:error: or -initWithTemplate:error: to get an instance of
 * TINKKeysetHandle.
 */
- (nullable instancetype)init NS_UNAVAILABLE;

/**
 * Creates a TINKKeysetHandle from an encrypted keyset obtained via @c reader using @c aeadKey to
 * decrypt the keyset.
 *
 * @param reader  An instance of TINKKeysetReader.
 * @param aeadKey An instance of TINKAead that's used to decrypt the keyset.
 * @param error   If non-nil it will be populated with a descriptive error message.
 * @return        A TINKKeysetHandle, or nil in case of error.
 */
- (nullable instancetype)initWithKeysetReader:(TINKKeysetReader *)reader
                                       andKey:(id<TINKAead>)aeadKey
                                        error:(NSError **)error;

/**
 * Returns a new TINKKeysetHandle that contains a single fresh key generated according to
 * @c keyTemplate. @c keyTemplate can be obtained by using one of the subclasses such as
 * TINKAeadKeyTemplate, TINKHybridKeyTemplate etc.
 *
 * @param keyTemplate An instance of TINKKeyTemplate that describes the key to be generated.
 *                    To get an instance of TINKKeyTemplate use one of the primitive-specific
 *                    subclasses such as: TINKAeadKeyTemplate, TINKHybridKeyTemplate etc.
 * @param error       If non-nil it will be populated with a descriptive error message.
 * @return            A TINKKeysetHandle, or nil in case of error.
 */
- (nullable instancetype)initWithKeyTemplate:(TINKKeyTemplate *)keyTemplate error:(NSError **)error;

/**
 * Creates a TINKKeysetHandle from a keyset obtained from the iOS keychain.
 *
 * @param keysetName  The keyset name that was used to store the keyset to the iOS keychain.
 * @param error       If non-nil it will be populated with a descriptive error message.
 * @return            A TINKKeysetHandle, or nil in case of error.
 */
- (nullable instancetype)initFromKeychainWithName:(NSString *)keysetName error:(NSError **)error;

/**
 * Returns a new TINKKeysetHandle that contains the public keys corresponding to the private keys
 * from @c aHandle.
 *
 * @param aHandle   A handle that contains private keys.
 * @param error     If non-nil it will be populated with a descriptive error message.
 * return           An instance of TINKKeysetHandle that contains the corresponding public keys or
 *                  nil in case of error.
 */
+ (nullable instancetype)publicKeysetHandleWithHandle:(TINKKeysetHandle *)aHandle
                                                error:(NSError **)error;

/**
 * Writes the underlying keyset to the iOS keychain under the name specified by @c keysetName.
 * The keyset can be retrieved from the keychain by using -initFromKeychainWithName:error:.
 *
 * @param keysetName  A unique keyset name that's used to store and retrieve the keyset from the iOS
 *                    keychain. If an item with the same name exists in the keychain an error will
 *                    be returned.
 * @param overwrite   If a keyset with the same name exists in the keychain it will be overwritten
 *                    when this property is set to YES.
 * @param error       If non-nill it will be populated with a descriptive error message.
 * @return            YES if the keyset was successfully written in the keychain.
 *                    Otherwise, returns NO and sets @c error.
 */
- (BOOL)writeToKeychainWithName:(NSString *)keysetName
                      overwrite:(BOOL)overwrite
                          error:(NSError **)error;

/**
 * Deletes a keyset from the iOS keychain.
 *
 * @param keysetName The name of the keyset to be deleted.
 * @param error      If non-nil it will be populated with a descriptive error message.
 * @return           YES if the keyset was successfully deleted or if there was no keyset
 *                   with that name in the keychain. Otherwise, returns NO and sets @c error.
 */
+ (BOOL)deleteFromKeychainWithName:(NSString *)keysetName error:(NSError **)error;

@end

NS_ASSUME_NONNULL_END

