SecEncodeTransformTests.swift 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //
  2. // SecEncodeTransformTests.swift
  3. // Base32
  4. //
  5. // Created by 野村 憲男 on 1/25/15.
  6. // Copyright (c) 2015 Norio Nomura. All rights reserved.
  7. //
  8. import Foundation
  9. import XCTest
  10. import Security
  11. public func base32EncodeUsingSecEncodeTransform(data: NSData) -> String {
  12. var transform = SecEncodeTransformCreate(kSecBase32Encoding, nil)
  13. SecTransformSetAttribute(transform.takeUnretainedValue(), kSecTransformInputAttributeName, data, nil)
  14. let encodedData = SecTransformExecute(transform.takeUnretainedValue(), nil) as NSData
  15. transform.release()
  16. return NSString(data: encodedData, encoding: NSUTF8StringEncoding) as String
  17. }
  18. public func base32DecodeToDataUsingSecEncodeTransform(string: String) -> NSData? {
  19. var transform = SecDecodeTransformCreate(kSecBase32Encoding, nil)
  20. SecTransformSetAttribute(transform.takeUnretainedValue(), kSecTransformInputAttributeName, string.dataUsingEncoding(NSUTF8StringEncoding), nil)
  21. let decodedData = SecTransformExecute(transform.takeUnretainedValue(), nil) as NSData
  22. transform.release()
  23. return decodedData
  24. }
  25. class SecEncodeTransformTests: XCTestCase {
  26. let vectors: [(String,String,String)] = [
  27. ("", "", ""),
  28. ("f", "MY======", "CO======"),
  29. ("fo", "MZXQ====", "CPNG===="),
  30. ("foo", "MZXW6===", "CPNMU==="),
  31. ("foob", "MZXW6YQ=", "CPNMUOG="),
  32. ("fooba", "MZXW6YTB", "CPNMUOJ1"),
  33. ("foobar", "MZXW6YTBOI======", "CPNMUOJ1E8======"),
  34. ]
  35. override func setUp() {
  36. super.setUp()
  37. // Put setup code here. This method is called before the invocation of each test method in the class.
  38. }
  39. override func tearDown() {
  40. // Put teardown code here. This method is called after the invocation of each test method in the class.
  41. super.tearDown()
  42. }
  43. // MARK: https://tools.ietf.org/html/rfc4648
  44. // MARK: Using SecEncodeTransform
  45. func test_RFC4648_Encode_UsingSecEncodeTransform() {
  46. self.measureBlock{
  47. for _ in 0...100 {
  48. for (test, expect, expectHex) in self.vectors {
  49. let data = test.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
  50. let result = base32EncodeUsingSecEncodeTransform(data)
  51. XCTAssertEqual(result, expect, "base32EncodeUsingSecEncodeTransform for \(test)")
  52. }
  53. }
  54. }
  55. }
  56. func test_RFC4648_DecodeUsingSecEncodeTransform() {
  57. self.measureBlock{
  58. for _ in 0...100 {
  59. for (expect, test, testHex) in self.vectors {
  60. let data = expect.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
  61. let result = base32DecodeToDataUsingSecEncodeTransform(test)
  62. XCTAssertEqual(result!, data!, "base32DecodeUsingSecEncodeTransform for \(test)")
  63. }
  64. }
  65. }
  66. }
  67. }