NSDataExtension.swift 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. //
  2. // PGPDataExtension.swift
  3. // SwiftPGP
  4. //
  5. // Created by Marcin Krzyzanowski on 05/07/14.
  6. // Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
  7. //
  8. import Foundation
  9. enum CryptoHash: Int {
  10. case md5 = 1
  11. case sha1 = 2
  12. case sha224 = 3
  13. case sha256 = 4
  14. case sha384 = 5
  15. case sha512 = 6
  16. case ripemd160 = 7
  17. func hash(data: NSData) -> NSData! {
  18. switch self {
  19. case md5:
  20. return data.md5()
  21. case sha1:
  22. return data.sha1()
  23. case sha224:
  24. return data.sha224()
  25. case sha256:
  26. return data.sha256()
  27. case sha384:
  28. return data.sha384()
  29. case sha512:
  30. return data.sha512()
  31. case ripemd160:
  32. return data.ripemd160()
  33. }
  34. }
  35. }
  36. extension NSData {
  37. func arrayOfBytes() -> Array<Byte> {
  38. let count = self.length / sizeof(Byte)
  39. var bytesArray = [Byte](count: count, repeatedValue: 0)
  40. self.getBytes(&bytesArray, length:count * sizeof(Byte))
  41. return bytesArray
  42. }
  43. func checksum() -> UInt16 {
  44. var s:UInt32 = 0;
  45. var bytesArray = self.arrayOfBytes();
  46. for (var i = 0; i < bytesArray.count; i++) {
  47. var b = bytesArray[i]
  48. s = s + UInt32(bytesArray[i])
  49. }
  50. s = s % 65536;
  51. return UInt16(s);
  52. }
  53. func md5() -> NSData {
  54. var ctx = UnsafePointer<CC_MD5_CTX>.alloc(sizeof(CC_MD5_CTX))
  55. CC_MD5_Init(ctx);
  56. CC_MD5_Update(ctx, self.bytes, UInt32(self.length));
  57. let length = Int(CC_MD5_DIGEST_LENGTH) * sizeof(Byte)
  58. var output = UnsafePointer<Byte>.alloc(length)
  59. CC_MD5_Final(output, ctx);
  60. let outData = NSData(bytes: output, length: Int(CC_MD5_DIGEST_LENGTH))
  61. output.destroy()
  62. ctx.destroy()
  63. //withUnsafePointer
  64. return outData;
  65. }
  66. func sha1() -> NSData {
  67. var ctx = UnsafePointer<CC_SHA1_CTX>.alloc(sizeof(CC_SHA1_CTX))
  68. CC_SHA1_Init(ctx);
  69. CC_SHA1_Update(ctx, self.bytes, UInt32(self.length));
  70. let length = Int(CC_SHA1_DIGEST_LENGTH) * sizeof(Byte)
  71. var output = UnsafePointer<Byte>.alloc(length)
  72. CC_SHA1_Final(output, ctx);
  73. let outData = NSData(bytes: output, length: Int(CC_SHA1_DIGEST_LENGTH))
  74. output.destroy()
  75. ctx.destroy()
  76. return outData;
  77. }
  78. func sha224() -> NSData {
  79. var ctx = UnsafePointer<CC_SHA256_CTX>.alloc(sizeof(CC_SHA256_CTX))
  80. CC_SHA224_Init(ctx);
  81. CC_SHA224_Update(ctx, self.bytes, UInt32(self.length));
  82. let length = Int(CC_SHA224_DIGEST_LENGTH) * sizeof(Byte)
  83. var output = UnsafePointer<Byte>.alloc(length)
  84. CC_SHA224_Final(output, ctx);
  85. let outData = NSData(bytes: output, length: Int(CC_SHA224_DIGEST_LENGTH))
  86. output.destroy()
  87. ctx.destroy()
  88. return outData;
  89. }
  90. func sha256() -> NSData {
  91. var ctx = UnsafePointer<CC_SHA256_CTX>.alloc(sizeof(CC_SHA256_CTX))
  92. CC_SHA256_Init(ctx);
  93. CC_SHA256_Update(ctx, self.bytes, UInt32(self.length));
  94. let length = Int(CC_SHA256_DIGEST_LENGTH) * sizeof(Byte)
  95. var output = UnsafePointer<Byte>.alloc(length)
  96. CC_SHA256_Final(output, ctx);
  97. let outData = NSData(bytes: output, length: Int(CC_SHA256_DIGEST_LENGTH))
  98. output.destroy()
  99. ctx.destroy()
  100. return outData;
  101. }
  102. func sha384() -> NSData {
  103. var ctx = UnsafePointer<CC_SHA512_CTX>.alloc(sizeof(CC_SHA512_CTX))
  104. CC_SHA384_Init(ctx);
  105. CC_SHA384_Update(ctx, self.bytes, UInt32(self.length));
  106. let length = Int(CC_SHA384_DIGEST_LENGTH) * sizeof(Byte)
  107. var output = UnsafePointer<Byte>.alloc(length)
  108. CC_SHA384_Final(output, ctx);
  109. let outData = NSData(bytes: output, length: Int(CC_SHA384_DIGEST_LENGTH))
  110. output.destroy()
  111. ctx.destroy()
  112. return outData;
  113. }
  114. func sha512() -> NSData {
  115. var ctx = UnsafePointer<CC_SHA512_CTX>.alloc(sizeof(CC_SHA512_CTX))
  116. CC_SHA512_Init(ctx);
  117. CC_SHA512_Update(ctx, self.bytes, UInt32(self.length));
  118. let length = Int(CC_SHA512_DIGEST_LENGTH) * sizeof(Byte)
  119. var output = UnsafePointer<Byte>.alloc(length)
  120. CC_SHA512_Final(output, ctx);
  121. let outData = NSData(bytes: output, length: Int(CC_SHA512_DIGEST_LENGTH))
  122. output.destroy()
  123. ctx.destroy()
  124. return outData;
  125. }
  126. func ripemd160() -> NSData {
  127. var ctx = UnsafePointer<RIPEMD160_CTX>.alloc(sizeof(RIPEMD160_CTX))
  128. RIPEMD160_Init(ctx);
  129. RIPEMD160_Update(ctx, self.bytes, UInt(self.length));
  130. let length = Int(RIPEMD160_DIGEST_LENGTH) * sizeof(Byte)
  131. var output = UnsafePointer<Byte>.alloc(length)
  132. RIPEMD160_Final(output, ctx);
  133. let outData = NSData(bytes: output, length: Int(RIPEMD160_DIGEST_LENGTH))
  134. output.destroy()
  135. ctx.destroy()
  136. return outData;
  137. }
  138. func toHexString() -> String {
  139. let count = self.length / sizeof(Byte)
  140. var bytesArray = [Byte](count: count, repeatedValue: 0)
  141. self.getBytes(&bytesArray, length:count * sizeof(Byte))
  142. var s:String = "";
  143. for(var i = 0; i < bytesArray.count; i++) {
  144. var st: String = NSString(format:"%02X", bytesArray[i])
  145. NSLog("\(bytesArray[i]) -> \(st)")
  146. s = s + st
  147. }
  148. return s;
  149. }
  150. }