/**
 * 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;

/**
 * Creates a TINKKeysetHandle from a serialized keyset which contains no secret key material.
 * This can be used to load public keysets or envelope encryption keysets.
 *
 * @param keyset  A serialized 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)initWithNoSecretKeyset:(NSData *)keyset 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

