//
//  AES.swift
//  PaiAi
//
//  Created by LISA on 2017/6/1.
//  Copyright © 2017年 yb. All rights reserved.
//

import UIKit

private let key = "i29g8au38U3dI8dj"
private let iv = "a2k49g8wJ3F3kf9k"
// MARK: AES
extension Data {
    fileprivate func AES(operation: CCOperation, key: String, iv: String) -> Data? {
        var digest_length = Swift.max(self.count * 2, 16)
        var digest = [UInt8](repeating: 0, count: digest_length)

        //AES encrypt
        let status = CCCrypt(operation, CCAlgorithm(kCCAlgorithmAES128),
                             CCOptions(kCCOptionPKCS7Padding),
                             key.bytes, key.lengthOfBytes(using: .utf8),
                             iv.bytes,
                             self.arrayOfBytes(), self.arrayOfBytes().count,
                             &digest, digest.count, &digest_length)

        if status == CCCryptorStatus(kCCSuccess) {
            return Data(bytes: digest, count: digest_length)
        }
        return nil
    }

    func AES128EncryptToData() -> Data {
        return self.AES(operation: CCOperation(kCCEncrypt), key: key, iv: iv)!
    }
    func AES128EncryptToBase64Data() -> Data {
        return self.AES128EncryptToData().base64EncodedData()
    }
    func AES128EncryptToBase64String() -> String {
        return self.AES128EncryptToData().base64EncodedString()
    }
    func AES128DecryptFromBase64DataToData() -> Data {
        return Data(base64Encoded: self)!.AES128DecryptToData()
    }
    func AES128DecryptFromBase64DataToString() -> String {
        return Data(base64Encoded: self)!.AES128DecryptToString()
    }
    func AES128DecryptToData() -> Data {
        return self.AES(operation: CCOperation(kCCDecrypt), key: key, iv: iv)!
    }
    func AES128DecryptToString() -> String {
        return String.init(data: self.AES128DecryptToData(), encoding: String.Encoding.utf8) ?? ""
    }
}

extension String {

    func AES128EncryptToData() -> Data {

        return self.myData.AES128EncryptToData()
    }
    func AES128EncryptToBase64Data() -> Data {

        return self.myData.AES128EncryptToBase64Data()
    }
    func AES128EncryptToBase64String() -> String {

        return self.myData.AES128EncryptToBase64String()
    }

    func AES128DecryptFromBase64StringToData() -> Data {
        return (Data(base64Encoded: self)?.AES128DecryptToData())!
    }

    func AES128DecryptFromBase64StringToString() -> String {
        return (Data(base64Encoded: self)?.AES128DecryptToString())!
    }
}