123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- import UIKit
- enum EncryptionAlgorithm: CC_LONG {
- 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
- })
- }
- }
- extension Data {
- fileprivate func digestAlgorithm(algorithm: EncryptionAlgorithm) ->UnsafeMutablePointer<CUnsignedChar> {
- let strlen = CC_LONG(16)
- switch algorithm {
- 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
- }
- }
-
- 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()
- }
-
- 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 {
-
- func digestString(algorithm: EncryptionAlgorithm) -> String {
- return self.myData.digestString(algorithm: algorithm)
- }
-
- 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)
- }
- }
|