Nav apraksta

Digest.swift 3.8KB

    // // Digest.swift // PaiAi // // Created by LISA on 2017/6/1. // Copyright © 2017年 yb. All rights reserved. // import UIKit enum EncryptionAlgorithm: CC_LONG { // case md2 = 16 // case md4 = 17 case md5 = 16 case sha1 = 20 case sha224 = 28 case sha256 = 32 case sha384 = 48 case sha512 = 64 } extension Data { public var bytes: UnsafePointer<UInt8> { return self.withUnsafeBytes({ (pointer: UnsafePointer<UInt8>) -> UnsafePointer<UInt8> in return pointer }) } } // MARK: md and sha extension Data { fileprivate func digestAlgorithm(algorithm: EncryptionAlgorithm) ->UnsafeMutablePointer<CUnsignedChar> { let strlen = CC_LONG(16) switch algorithm { // case .md2: // let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_MD2_DIGEST_LENGTH)) // CC_MD2(self.bytes, strlen, digest) // return digest // case .md4: // let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_MD4_DIGEST_LENGTH)) // CC_MD4(self.bytes, strlen, digest) // return digest case .md5: let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_MD5_DIGEST_LENGTH)) CC_MD5(self.bytes, strlen, digest) return digest case .sha1: let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_SHA1_DIGEST_LENGTH)) CC_SHA1(self.bytes, strlen, digest) return digest case .sha224: let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_SHA224_DIGEST_LENGTH)) CC_SHA224(self.bytes, strlen, digest) return digest case .sha256: let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_SHA256_DIGEST_LENGTH)) CC_SHA256(self.bytes, strlen, digest) return digest case .sha384: let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_SHA384_DIGEST_LENGTH)) CC_SHA384(self.bytes, strlen, digest) return digest case .sha512: let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_SHA512_DIGEST_LENGTH)) CC_SHA512(self.bytes, strlen, digest) return digest } } //return the string func digestString(algorithm: EncryptionAlgorithm) -> String { let length = algorithm.rawValue let digest = digestAlgorithm(algorithm: algorithm) var outStr = "" for i in 0..<Int(length) { outStr = outStr.appendingFormat("%02x", digest[i]) } return outStr.uppercased() } //return the data func digestData(algorithm: EncryptionAlgorithm) -> Data { let str = digestString(algorithm: algorithm) return str.data(using: String.Encoding.utf8)! } func digestBase64Data(algorithm: EncryptionAlgorithm) -> Data { return digestData(algorithm: algorithm).base64EncodedData() } func digestBase64String(algorithm: EncryptionAlgorithm) -> String { return digestData(algorithm: algorithm).base64EncodedString() } } extension String { //return the stringx func digestString(algorithm: EncryptionAlgorithm) -> String { return self.myData.digestString(algorithm: algorithm) } //return the data func digestData(algorithm: EncryptionAlgorithm) -> Data { return self.myData.digestData(algorithm: algorithm) } func digestBase64Data(algorithm: EncryptionAlgorithm) -> Data { return self.myData.digestBase64Data(algorithm: algorithm) } func digestBase64String(algorithm: EncryptionAlgorithm) -> String { return self.myData.digestBase64String(algorithm: algorithm) } }