Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // remember to import in Bridging-Header.h :
- //#import <CommonCrypto/CommonCryptor.h>
- enum AESError: Error {
- case KeyError((String, Int))
- case IVError((String, Int))
- case CryptorError((String, Int))
- }
- extension String {
- public func aes256Decrypt(key: String) throws -> Data? {
- guard let data = Data(base64Encoded: self, options: Data.Base64DecodingOptions.ignoreUnknownCharacters) else {
- return nil
- }
- guard let keyData = key.data(using: .utf8) else {
- return nil
- }
- let clearLength = size_t(data.count + kCCBlockSizeAES128)
- var clearData = Data(count:clearLength)
- var numBytesDecrypted: size_t = 0
- let options = CCOptions(kCCOptionECBMode + kCCOptionPKCS7Padding)
- let cryptStatus = clearData.withUnsafeMutableBytes {cryptBytes in
- data.withUnsafeBytes {dataBytes in
- keyData.withUnsafeBytes {keyBytes in
- CCCrypt(CCOperation(kCCDecrypt), CCAlgorithm(kCCAlgorithmAES), options,
- keyBytes, kCCKeySizeAES256,
- nil,
- dataBytes + kCCBlockSizeAES128, clearLength,
- cryptBytes, clearLength,
- &numBytesDecrypted)
- }
- }
- }
- if UInt32(cryptStatus) == UInt32(kCCSuccess) {
- clearData.count = numBytesDecrypted
- }
- else {
- throw AESError.CryptorError(("Decryption failed", Int(cryptStatus)))
- }
- return clearData
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement