#import <Foundation/Foundation.h>
#include <corecrypto/ccdigest.h>
#include <corecrypto/ccrng.h>
#include <corecrypto/ccsrp.h>
NS_ASSUME_NONNULL_BEGIN
@interface KCSRPContext : NSObject
- (instancetype) init NS_UNAVAILABLE;
- (instancetype) initWithUser: (NSString*) user
digestInfo: (const struct ccdigest_info *) di
group: (ccsrp_const_gp_t) gp
randomSource: (struct ccrng_state *) rng NS_DESIGNATED_INITIALIZER;
- (bool) isAuthenticated;
- (NSData*) getKey;
@end
@interface KCSRPClientContext : KCSRPContext
- (nullable NSData*) copyStart: (NSError**) error;
- (nullable NSData*) copyResposeToChallenge: (NSData*) B_data
password: (NSString*) password
salt: (NSData*) salt
error: (NSError**) error;
- (bool) verifyConfirmation: (NSData*) HAMK_data
error: (NSError**) error;
@end
@interface KCSRPServerContext : KCSRPContext
@property (readonly) NSData* salt;
- (instancetype) initWithUser: (NSString*) user
salt: (NSData*) salt
verifier: (NSData*) verifier
digestInfo: (const struct ccdigest_info *) di
group: (ccsrp_const_gp_t) gp
randomSource: (struct ccrng_state *) rng NS_DESIGNATED_INITIALIZER;
- (instancetype) initWithUser: (NSString*)user
password: (NSString*)password
digestInfo: (const struct ccdigest_info *) di
group: (ccsrp_const_gp_t) gp
randomSource: (struct ccrng_state *) rng NS_DESIGNATED_INITIALIZER;
- (instancetype) initWithUser: (NSString*) user
digestInfo: (const struct ccdigest_info *) di
group: (ccsrp_const_gp_t) gp
randomSource: (struct ccrng_state *) rng NS_UNAVAILABLE;
- (bool) resetWithPassword: (NSString*) password
error: (NSError**) error;
- (nullable NSData*) copyChallengeFor: (NSData*) A_data
error: (NSError**) error;
- (nullable NSData*) copyConfirmationFor: (NSData*) M_data
error: (NSError**) error;
@end
NS_ASSUME_NONNULL_END