Operations/QCCRSASmallCryptor.h
/* |
Copyright (C) 2016 Apple Inc. All Rights Reserved. |
See LICENSE.txt for this sample’s licensing information |
Abstract: |
Implements RSA encryption and decryption using the unified crypto API. |
*/ |
@import Foundation; |
NS_ASSUME_NONNULL_BEGIN |
/*! Denotes the RSA padding to use. |
* \details The default is `QCCRSASmallCryptorPaddingPKCS1`. |
* |
* \note This operation only supports the traditional OAEP algorithm, as defined by |
* PKCS#1 v2 / RFC 2437. That is, it uses SHA1 as its hash function. It does not |
* support SHA2-based OAEP algorithms because it wants to present the same |
* interface as QCCRSASmallCryptorCompat, and that class relies on legacy APIs that |
* only support SHA1. |
*/ |
typedef NS_ENUM(NSInteger, QCCRSASmallCryptorPadding) { |
QCCRSASmallCryptorPaddingPKCS1, |
QCCRSASmallCryptorPaddingOAEP |
}; |
/*! Implements RSA encryption and decryption for small chunks of data. |
* \details The exact definition of "small" depends on the key size and the padding in |
* use. The key size represents the maximum size, and from that you subtract |
* the padding overhead (11 bytes for PKCS#1, 42 bytes for OAEP). For example, a |
* 2048-bit key with PKCS#1 padding can encrypt 245 bytes (2048 bits -> 256 bytes - 11). |
* |
* \warning This is for encrypting and decrypting small amounts of data, not an |
* entire file. The standard technique for encrypting a large file is to |
* encrypt it with a symmetric algorithm (like AES-128), using a randomly generated |
* key, and then encrypt that key with RSA. However, doing that sort of thing |
* correctly is a challenge and we recommend you use some standard encryption |
* scheme (such as CMS). |
* |
* \note The designated initialiser for this class is private. In the unlikely event you |
* need to subclass it, you will have to make that public. |
* |
* \details This uses the unified asymmetric crypto API added in iOS 10 and macOS 10.12. |
* |
* If your deployment target does not guarantee the availability of the unified asymmetric |
* crypto API, use QCCRSASmallCryptorCompat instead. |
*/ |
@interface QCCRSASmallCryptor : NSOperation |
/*! Initialise the object to encrypt data using a public key. |
* \param smallInputData A small amount of data to encrypt; the exact limit to this length |
* is determined by the key size and the padding as discussed above. |
* \param key The public key used to encrypt the data. |
* \returns The initialised object. |
*/ |
- (instancetype)initToEncryptSmallInputData:(NSData *)smallInputData key:(SecKeyRef)key; |
/*! Initialise the object to decrypt data using a private key. |
* \param smallInputData The data to decrypt; its length must match the key size, for |
* example, for a 2048-bit key this must be 256 bytes. |
* \param key The private key used to decrypt the data. |
* \returns The initialised object. |
*/ |
- (instancetype)initToDecryptSmallInputData:(NSData *)smallInputData key:(SecKeyRef)key; |
- (instancetype)init NS_UNAVAILABLE; |
/*! The data to be encrypted or decrypted. |
* \details This is set by the init method. |
*/ |
@property (atomic, copy, readonly ) NSData * smallInputData; |
/*! The key with which to do the encryption (public key) or decryption (private key). |
* \details This is set by the init method. |
*/ |
@property (atomic, strong, readonly ) SecKeyRef key __attribute__ (( NSObject )); |
/*! The padding to use. |
* \details The default is `QCCRSASmallCryptorPaddingPKCS1`. |
* |
* If you set this, you must set it before queuing the operation. |
*/ |
@property (atomic, assign, readwrite) QCCRSASmallCryptorPadding padding; |
/*! The error, if any, resulting from encryption or decryption operation. |
* \details This is set when the operation is finished. On success, it will be nil. Or error, |
* it will hold a value describing that error. |
*/ |
@property (atomic, copy, readonly, nullable) NSError * error; |
/*! The output data. |
* \details This is only meaningful when the operation has finished without error. |
* If this is an encryption operation, this will be the input data encrypted using the |
* public key. The output data length will match the key size so, for example, a 2048-bit |
* key will output 256 bytes. |
* |
* If this is a decryption operation, this will be the input data decrypted using |
* the private key. Its length will be strictly less than the input data length. |
*/ |
@property (atomic, copy, readonly, nullable) NSData * smallOutputData; |
@end |
NS_ASSUME_NONNULL_END |
Copyright © 2016 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2016-11-17