ChaCha20Tests.swift 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //
  2. // CipherChaCha20Tests.swift
  3. // CryptoSwift
  4. //
  5. // Created by Marcin Krzyzanowski on 27/12/14.
  6. // Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
  7. //
  8. import Foundation
  9. import XCTest
  10. import CryptoSwift
  11. final class ChaCha20Tests: XCTestCase {
  12. override func setUp() {
  13. super.setUp()
  14. }
  15. override func tearDown() {
  16. super.tearDown()
  17. }
  18. func testChaCha20() {
  19. let keys:[[UInt8]] = [
  20. [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
  21. [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01],
  22. [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
  23. [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
  24. [0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F]
  25. ]
  26. let ivs:[[UInt8]] = [
  27. [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
  28. [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
  29. [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01],
  30. [0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
  31. [0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07]
  32. ]
  33. let expectedHexes = [
  34. "76B8E0ADA0F13D90405D6AE55386BD28BDD219B8A08DED1AA836EFCC8B770DC7DA41597C5157488D7724E03FB8D84A376A43B8F41518A11CC387B669B2EE6586",
  35. "4540F05A9F1FB296D7736E7B208E3C96EB4FE1834688D2604F450952ED432D41BBE2A0B6EA7566D2A5D1E7E20D42AF2C53D792B1C43FEA817E9AD275AE546963",
  36. "DE9CBA7BF3D69EF5E786DC63973F653A0B49E015ADBFF7134FCB7DF137821031E85A050278A7084527214F73EFC7FA5B5277062EB7A0433E445F41E3",
  37. "EF3FDFD6C61578FBF5CF35BD3DD33B8009631634D21E42AC33960BD138E50D32111E4CAF237EE53CA8AD6426194A88545DDC497A0B466E7D6BBDB0041B2F586B",
  38. "F798A189F195E66982105FFB640BB7757F579DA31602FC93EC01AC56F85AC3C134A4547B733B46413042C9440049176905D3BE59EA1C53F15916155C2BE8241A38008B9A26BC35941E2444177C8ADE6689DE95264986D95889FB60E84629C9BD9A5ACB1CC118BE563EB9B3A4A472F82E09A7E778492B562EF7130E88DFE031C79DB9D4F7C7A899151B9A475032B63FC385245FE054E3DD5A97A5F576FE064025D3CE042C566AB2C507B138DB853E3D6959660996546CC9C4A6EAFDC777C040D70EAF46F76DAD3979E5C5360C3317166A1C894C94A371876A94DF7628FE4EAAF2CCB27D5AAAE0AD7AD0F9D4B6AD3B54098746D4524D38407A6DEB3AB78FAB78C9"
  39. ]
  40. for (var idx = 0; idx < keys.count; idx++) {
  41. let expectedHex = expectedHexes[idx]
  42. let message = [UInt8](count: (count(expectedHex) / 2), repeatedValue: 0)
  43. let setup = (key: keys[idx], iv: ivs[idx])
  44. var encrypted = Cipher.ChaCha20(setup).encrypt(message)
  45. XCTAssert(encrypted != nil, "missing")
  46. if let encrypted = encrypted {
  47. var decrypted = Cipher.ChaCha20(setup).decrypt(encrypted)
  48. XCTAssert(decrypted != nil, "missing")
  49. if let decrypted = decrypted {
  50. XCTAssertEqual(message, decrypted, "ChaCha20 decryption failed");
  51. }
  52. // check extension
  53. let messageData = NSData(bytes: message, length: message.count);
  54. let encrypted2 = messageData.encrypt(Cipher.ChaCha20(setup))
  55. XCTAssertNotNil(encrypted2, "")
  56. if let encrypted2 = encrypted2 {
  57. XCTAssertEqual(NSData.withBytes(encrypted), encrypted2, "ChaCha20 extension failed")
  58. }
  59. }
  60. }
  61. }
  62. func testChaCha20Performance() {
  63. let key:[UInt8] = [0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c];
  64. let iv:[UInt8] = [0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F]
  65. let message = [UInt8](count: (1024 * 1024) * 1, repeatedValue: 7)
  66. measureMetrics([XCTPerformanceMetric_WallClockTime], automaticallyStartMeasuring: true, forBlock: { () -> Void in
  67. let encrypted = ChaCha20(key: key, iv: iv)?.encrypt(message)
  68. self.stopMeasuring()
  69. XCTAssert(encrypted != nil, "not encrypted")
  70. })
  71. }
  72. }