暂无描述

Digest.swift 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //
  2. // Digest.swift
  3. // PaiAi
  4. //
  5. // Created by LISA on 2017/6/1.
  6. // Copyright © 2017年 yb. All rights reserved.
  7. //
  8. import UIKit
  9. enum EncryptionAlgorithm: CC_LONG {
  10. // case md2 = 16
  11. // case md4 = 17
  12. case md5 = 16
  13. case sha1 = 20
  14. case sha224 = 28
  15. case sha256 = 32
  16. case sha384 = 48
  17. case sha512 = 64
  18. }
  19. extension Data {
  20. public var bytes: UnsafePointer<UInt8> {
  21. return self.withUnsafeBytes({ (pointer: UnsafePointer<UInt8>) -> UnsafePointer<UInt8> in
  22. return pointer
  23. })
  24. }
  25. }
  26. // MARK: md and sha
  27. extension Data {
  28. fileprivate func digestAlgorithm(algorithm: EncryptionAlgorithm) ->UnsafeMutablePointer<CUnsignedChar> {
  29. let strlen = CC_LONG(16)
  30. switch algorithm {
  31. // case .md2:
  32. // let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_MD2_DIGEST_LENGTH))
  33. // CC_MD2(self.bytes, strlen, digest)
  34. // return digest
  35. // case .md4:
  36. // let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_MD4_DIGEST_LENGTH))
  37. // CC_MD4(self.bytes, strlen, digest)
  38. // return digest
  39. case .md5:
  40. let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_MD5_DIGEST_LENGTH))
  41. CC_MD5(self.bytes, strlen, digest)
  42. return digest
  43. case .sha1:
  44. let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_SHA1_DIGEST_LENGTH))
  45. CC_SHA1(self.bytes, strlen, digest)
  46. return digest
  47. case .sha224:
  48. let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_SHA224_DIGEST_LENGTH))
  49. CC_SHA224(self.bytes, strlen, digest)
  50. return digest
  51. case .sha256:
  52. let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_SHA256_DIGEST_LENGTH))
  53. CC_SHA256(self.bytes, strlen, digest)
  54. return digest
  55. case .sha384:
  56. let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_SHA384_DIGEST_LENGTH))
  57. CC_SHA384(self.bytes, strlen, digest)
  58. return digest
  59. case .sha512:
  60. let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_SHA512_DIGEST_LENGTH))
  61. CC_SHA512(self.bytes, strlen, digest)
  62. return digest
  63. }
  64. }
  65. //return the string
  66. func digestString(algorithm: EncryptionAlgorithm) -> String {
  67. let length = algorithm.rawValue
  68. let digest = digestAlgorithm(algorithm: algorithm)
  69. var outStr = ""
  70. for i in 0..<Int(length) {
  71. outStr = outStr.appendingFormat("%02x", digest[i])
  72. }
  73. return outStr.uppercased()
  74. }
  75. //return the data
  76. func digestData(algorithm: EncryptionAlgorithm) -> Data {
  77. let str = digestString(algorithm: algorithm)
  78. return str.data(using: String.Encoding.utf8)!
  79. }
  80. func digestBase64Data(algorithm: EncryptionAlgorithm) -> Data {
  81. return digestData(algorithm: algorithm).base64EncodedData()
  82. }
  83. func digestBase64String(algorithm: EncryptionAlgorithm) -> String {
  84. return digestData(algorithm: algorithm).base64EncodedString()
  85. }
  86. }
  87. extension String {
  88. //return the stringx
  89. func digestString(algorithm: EncryptionAlgorithm) -> String {
  90. return self.myData.digestString(algorithm: algorithm)
  91. }
  92. //return the data
  93. func digestData(algorithm: EncryptionAlgorithm) -> Data {
  94. return self.myData.digestData(algorithm: algorithm)
  95. }
  96. func digestBase64Data(algorithm: EncryptionAlgorithm) -> Data {
  97. return self.myData.digestBase64Data(algorithm: algorithm)
  98. }
  99. func digestBase64String(algorithm: EncryptionAlgorithm) -> String {
  100. return self.myData.digestBase64String(algorithm: algorithm)
  101. }
  102. }