yourkarma/JWT

View on GitHub
Sources/JWT/include/JWTAlgorithmDataHolder.h

Summary

Maintainability
Test Coverage
//
//  JWTAlgorithmDataHolder.h
//  JWT
//
//  Created by Lobanov Dmitry on 31.08.16.
//  Copyright © 2016 Karma. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "JWTAlgorithm.h"
#import "JWTDeprecations.h"
#import "JWTBase64Coder.h"

// TODO: available in 3.0
// All methods with secret as NSString in algorithms will be deprecated or removed.

@protocol JWTAlgorithmDataHolderProtocol <NSObject, NSCopying>
/**
 The verification key to use when encoding/decoding a JWT in data form
 */
@property (copy, nonatomic, readwrite) NSData *internalSecretData;

/**
 The <JWTAlgorithm> to use for encoding a JWT
 */
@property (strong, nonatomic, readwrite) id <JWTAlgorithm> internalAlgorithm;

/**
 The <JWTStringCoderProtocol> string coder. It converts data to string and vice versa.
 Used only for secret <-> secretData conversions.
 */
@property (strong, nonatomic, readwrite) id <JWTStringCoderProtocol> internalStringCoder;
@end

@interface JWTAlgorithmBaseDataHolder : NSObject <JWTAlgorithmDataHolderProtocol>

#pragma mark - Getters
/**
 The verification key to use when encoding/decoding a JWT
 */
@property (copy, nonatomic, readonly) NSString *internalSecret;

/**
 The algorithm name to use for decoding the JWT. Required unless force decode is true
 */
@property (copy, nonatomic, readonly) NSString *internalAlgorithmName;

@end

// Available in Swift and Objective-C.
@interface JWTAlgorithmBaseDataHolder (Setters)
- (instancetype)secretData:(NSData *)secretData;
- (instancetype)secret:(NSString *)secret;
- (instancetype)algorithm:(id<JWTAlgorithm>)algorithm;
- (instancetype)algorithmName:(NSString *)algorithmName;
- (instancetype)stringCoder:(id<JWTStringCoderProtocol>)stringCoder;
@end

@protocol JWTAlgorithmDataHolderCreateProtocol <NSObject>

+ (instancetype)createWithAlgorithm256;
+ (instancetype)createWithAlgorithm384;
+ (instancetype)createWithAlgorithm512;

@end

@interface JWTAlgorithmNoneDataHolder : JWTAlgorithmBaseDataHolder @end
/*
 Default stringCoder is [JWTBase64Coder withPlainString].
 You could set secretData by secret setter ( holder.secret(secretString) ) in plain format e.g. "secret".
 */
@interface JWTAlgorithmHSFamilyDataHolder : JWTAlgorithmBaseDataHolder <JWTAlgorithmDataHolderCreateProtocol>
@end

@protocol JWTCryptoKeyProtocol;

/*
 JWTAlgorithmRSFamilyDataHolder actually is JWTAlgorithmAsymmetricTypeDataHolder.
 It will be renamed later.
 */
@interface JWTAlgorithmRSFamilyDataHolder : JWTAlgorithmBaseDataHolder <JWTAlgorithmDataHolderCreateProtocol>
/*
 Default stringCoder is [JWTBase64Coder withBase64String].
 You could set secretData by secret setter ( holder.secret(secretString) ) in base64 format e.g. put pem file content in it (ugly string with equal sign at the end for example).
 */
@end

@interface JWTAlgorithmRSFamilyDataHolder (Getters)
/**
 The passphrase for the PKCS12 blob, which represents the certificate containing the private key for the RS algorithms.
 */
@property (copy, nonatomic, readonly) NSString *internalPrivateKeyCertificatePassphrase;
@property (copy, nonatomic, readonly) NSString *internalKeyExtractorType;
@property (strong, nonatomic, readonly) id<JWTCryptoKeyProtocol> internalSignKey;
@property (strong, nonatomic, readonly) id<JWTCryptoKeyProtocol> internalVerifyKey;
@end

// Available in Swift and Objective-C.
@interface JWTAlgorithmRSFamilyDataHolder (Setters)
- (instancetype)privateKeyCertificatePassphrase:(NSString *)passphrase;
- (instancetype)keyExtractorType:(NSString *)type;
- (instancetype)signKey:(id<JWTCryptoKeyProtocol>)key;
- (instancetype)verifyKey:(id<JWTCryptoKeyProtocol>)key;
@end