Browse Source

Introduced the Signature Protocol. Keys that are capable of signing data (and verifying signed data) should conform to this protocol.

Brandon Toms 3 years ago
parent
commit
0e41a8f467
1 changed files with 47 additions and 0 deletions
  1. 47 0
      Sources/CryptoSwift/Signature.swift

+ 47 - 0
Sources/CryptoSwift/Signature.swift

@@ -0,0 +1,47 @@
+//
+//  CryptoSwift
+//
+//  Copyright (C) 2014-2021 Marcin Krzyżanowski <marcin@krzyzanowskim.com>
+//  This software is provided 'as-is', without any express or implied warranty.
+//
+//  In no event will the authors be held liable for any damages arising from the use of this software.
+//
+//  Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+//
+//  - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required.
+//  - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+//  - This notice may not be removed or altered from any source or binary distribution.
+//
+
+public enum SignatureError: Error {
+  case sign
+  case verify
+}
+
+public protocol Signature: AnyObject {
+  var keySize: Int { get }
+
+  /// Sign the given bytes at once
+  ///
+  /// - parameter bytes: Plaintext data
+  /// - returns: Encrypted data
+  func sign(_ bytes: ArraySlice<UInt8>) throws -> Array<UInt8>
+  func sign(_ bytes: Array<UInt8>) throws -> Array<UInt8>
+
+  /// Verify the given bytes against the expected data
+  ///
+  /// - parameter bytes: Signature data
+  /// - returns: Plaintext data
+  func verify(signature: ArraySlice<UInt8>, for expectedData: ArraySlice<UInt8>) throws -> Bool
+  func verify(signature: Array<UInt8>, for expectedData: Array<UInt8>) throws -> Bool
+}
+
+extension Signature {
+  public func sign(_ bytes: Array<UInt8>) throws -> Array<UInt8> {
+    try self.sign(bytes.slice)
+  }
+
+  public func verify(signature: Array<UInt8>, for expectedData: Array<UInt8>) throws -> Bool {
+    try self.verify(signature: signature.slice, for: expectedData.slice)
+  }
+}