HashTests.swift 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. //
  2. // CryptoSwiftTests.swift
  3. // CryptoSwiftTests
  4. //
  5. // Created by Marcin Krzyzanowski on 06/07/14.
  6. // Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
  7. //
  8. import XCTest
  9. @testable import CryptoSwift
  10. final class CryptoSwiftTests: XCTestCase {
  11. override func setUp() {
  12. super.setUp()
  13. }
  14. override func tearDown() {
  15. super.tearDown()
  16. }
  17. func testMD5() {
  18. let data1:NSData = NSData(bytes: [0x31, 0x32, 0x33] as [UInt8], length: 3) // "1", "2", "3"
  19. if let hash = Hash.md5(data1).calculate() {
  20. XCTAssertEqual(hash.hexString, "202CB962AC59075B964B07152D234B70", "MD5 calculation failed");
  21. } else {
  22. XCTAssert(false, "Missing result")
  23. }
  24. let string:NSString = ""
  25. let data:NSData = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
  26. if let hashData = Hash.md5(data).calculate() {
  27. XCTAssertEqual(hashData.hexString, "D41D8CD98F00B204E9800998ECF8427E", "MD5 calculation failed")
  28. } else {
  29. XCTAssert(false, "Missing result")
  30. }
  31. if let hash = data1.md5() {
  32. XCTAssertEqual(hash.hexString, "202CB962AC59075B964B07152D234B70", "MD5 calculation failed");
  33. }
  34. if let hash = "123".md5() {
  35. XCTAssertEqual(hash, "202CB962AC59075B964B07152D234B70", "MD5 calculation failed");
  36. }
  37. if let hash = "".md5() {
  38. XCTAssertEqual(hash, "D41D8CD98F00B204E9800998ECF8427E", "MD5 calculation failed")
  39. } else {
  40. XCTAssert(false, "Hash for empty string is missing")
  41. }
  42. if let hash = "a".md5() {
  43. XCTAssertEqual(hash, "0CC175B9C0F1B6A831C399E269772661", "MD5 calculation failed")
  44. }
  45. if let hash = "abc".md5() {
  46. XCTAssertEqual(hash, "900150983CD24FB0D6963F7D28E17F72", "MD5 calculation failed")
  47. }
  48. if let hash = "message digest".md5() {
  49. XCTAssertEqual(hash, "F96B697D7CB7938D525A2F31AAF161D0", "MD5 calculation failed")
  50. }
  51. if let hash = "abcdefghijklmnopqrstuvwxyz".md5() {
  52. XCTAssertEqual(hash, "C3FCD3D76192E4007DFB496CCA67E13B", "MD5 calculation failed")
  53. }
  54. if let hash = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".md5() {
  55. XCTAssertEqual(hash, "D174AB98D277D9F5A5611C2C9F419D9F", "MD5 calculation failed")
  56. }
  57. if let hash = "12345678901234567890123456789012345678901234567890123456789012345678901234567890".md5() {
  58. XCTAssertEqual(hash, "57EDF4A22BE3C955AC49DA2E2107B67A", "MD5 calculation failed")
  59. }
  60. }
  61. func testMD5PerformanceSwift() {
  62. self.measureMetrics([XCTPerformanceMetric_WallClockTime], automaticallyStartMeasuring: false, forBlock: { () -> Void in
  63. let buf = UnsafeMutablePointer<UInt8>(calloc(2048, sizeof(UInt8)))
  64. let data = NSData(bytes: buf, length: 2048)
  65. self.startMeasuring()
  66. Hash.md5(data).calculate()
  67. self.stopMeasuring()
  68. buf.dealloc(1024)
  69. buf.destroy()
  70. })
  71. }
  72. func testMD5PerformanceCommonCrypto() {
  73. self.measureMetrics([XCTPerformanceMetric_WallClockTime], automaticallyStartMeasuring: false, forBlock: { () -> Void in
  74. let buf = UnsafeMutablePointer<UInt8>(calloc(2048, sizeof(UInt8)))
  75. let data = NSData(bytes: buf, length: 2048)
  76. self.startMeasuring()
  77. let outbuf = UnsafeMutablePointer<UInt8>.alloc(Int(CC_MD5_DIGEST_LENGTH))
  78. CC_MD5(data.bytes, CC_LONG(data.length), outbuf)
  79. //let output = NSData(bytes: outbuf, length: Int(CC_MD5_DIGEST_LENGTH));
  80. outbuf.dealloc(Int(CC_MD5_DIGEST_LENGTH))
  81. outbuf.destroy()
  82. self.stopMeasuring()
  83. buf.dealloc(1024)
  84. buf.destroy()
  85. })
  86. }
  87. func testSHA1() {
  88. let data:NSData = NSData(bytes: [0x31, 0x32, 0x33] as [UInt8], length: 3)
  89. if let hash = data.sha1() {
  90. XCTAssertEqual(hash.hexString, "40BD001563085FC35165329EA1FF5C5ECBDBBEEF", "SHA1 calculation failed");
  91. }
  92. if let hash = "abc".sha1() {
  93. XCTAssertEqual(hash, "A9993E364706816ABA3E25717850C26C9CD0D89D", "SHA1 calculation failed")
  94. }
  95. if let hash = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha1() {
  96. XCTAssertEqual(hash, "84983E441C3BD26EBAAE4AA1F95129E5E54670F1", "SHA1 calculation failed")
  97. }
  98. if let hash = "".sha1() {
  99. XCTAssertEqual(hash, "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709", "SHA1 calculation failed")
  100. } else {
  101. XCTAssert(false, "SHA1 calculation failed")
  102. }
  103. }
  104. func testSHA224() {
  105. let data:NSData = NSData(bytes: [0x31, 0x32, 0x33] as [UInt8], length: 3)
  106. if let hash = data.sha224() {
  107. XCTAssertEqual(hash.hexString, "78D8045D684ABD2EECE923758F3CD781489DF3A48E1278982466017F", "SHA224 calculation failed");
  108. }
  109. }
  110. func testSHA256() {
  111. let data:NSData = NSData(bytes: [0x31, 0x32, 0x33] as [UInt8], length: 3)
  112. if let hash = data.sha256() {
  113. XCTAssertEqual(hash.hexString, "A665A45920422F9D417E4867EFDC4FB8A04A1F3FFF1FA07E998E86F7F7A27AE3", "SHA256 calculation failed");
  114. }
  115. if let hash = "Rosetta code".sha256() {
  116. XCTAssertEqual(hash, "764FAF5C61AC315F1497F9DFA542713965B785E5CC2F707D6468D7D1124CDFCF", "SHA256 calculation failed")
  117. }
  118. if let hash = "".sha256() {
  119. XCTAssertEqual(hash, "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855", "SHA256 calculation failed")
  120. } else {
  121. XCTAssert(false, "SHA256 calculation failed")
  122. }
  123. }
  124. func testSHA384() {
  125. let data:NSData = NSData(bytes: [49, 50, 51] as [UInt8], length: 3)
  126. if let hash = data.sha384() {
  127. XCTAssertEqual(hash.hexString, "9A0A82F0C0CF31470D7AFFEDE3406CC9AA8410671520B727044EDA15B4C25532A9B5CD8AAF9CEC4919D76255B6BFB00F", "SHA384 calculation failed");
  128. }
  129. if let hash = "The quick brown fox jumps over the lazy dog.".sha384() {
  130. XCTAssertEqual(hash, "ED892481D8272CA6DF370BF706E4D7BC1B5739FA2177AAE6C50E946678718FC67A7AF2819A021C2FC34E91BDB63409D7", "SHA384 calculation failed");
  131. }
  132. if let hash = "".sha384() {
  133. XCTAssertEqual(hash, "38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07434C0CC7BF63F6E1DA274EDEBFE76F65FBD51AD2F14898B95B", "SHA384 calculation failed")
  134. } else {
  135. XCTAssert(false, "SHA384 calculation failed")
  136. }
  137. }
  138. func testSHA512() {
  139. let data:NSData = NSData(bytes: [49, 50, 51] as [UInt8], length: 3)
  140. if let hash = data.sha512() {
  141. XCTAssertEqual(hash.hexString, "3C9909AFEC25354D551DAE21590BB26E38D53F2173B8D3DC3EEE4C047E7AB1C1EB8B85103E3BE7BA613B31BB5C9C36214DC9F14A42FD7A2FDB84856BCA5C44C2", "SHA512 calculation failed");
  142. }
  143. if let hash = "The quick brown fox jumps over the lazy dog.".sha512() {
  144. XCTAssertEqual(hash, "91EA1245F20D46AE9A037A989F54F1F790F0A47607EEB8A14D12890CEA77A1BBC6C7ED9CF205E67B7F2B8FD4C7DFD3A7A8617E45F3C463D481C7E586C39AC1ED", "SHA512 calculation failed");
  145. }
  146. if let hash = "".sha512() {
  147. XCTAssertEqual(hash, "CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E", "SHA512 calculation failed")
  148. } else {
  149. XCTAssert(false, "SHA512 calculation failed")
  150. }
  151. }
  152. func testCRC32() {
  153. let data:NSData = NSData(bytes: [49, 50, 51] as [UInt8], length: 3)
  154. if let crc = data.crc32() {
  155. XCTAssertEqual(crc.hexString, "884863D2", "CRC32 calculation failed");
  156. }
  157. if let crc = "".crc32() {
  158. XCTAssertEqual(crc, "00000000", "CRC32 calculation failed");
  159. } else {
  160. XCTAssert(false, "CRC32 calculation failed")
  161. }
  162. }
  163. func testCRC32Async() {
  164. let expect = expectationWithDescription("CRC32")
  165. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { () -> Void in
  166. self.testCRC32()
  167. expect.fulfill()
  168. })
  169. waitForExpectationsWithTimeout(10, handler: { (error) -> Void in
  170. XCTAssertNil(error, "CRC32 async failed")
  171. })
  172. }
  173. }