1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftCrypto open source project
//
// Copyright (c) 2019-2020 Apple Inc. and the SwiftCrypto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.md for the list of SwiftCrypto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
#if CRYPTO_IN_SWIFTPM && !CRYPTO_IN_SWIFTPM_FORCE_BUILD_API
@_exported import CryptoKit
#else
import Foundation
protocol DigestValidator {
associatedtype Signature
func isValidSignature<D: Digest>(_ signature: Signature, for digest: D) -> Bool
}
protocol DataValidator {
associatedtype Signature
func isValidSignature<D: DataProtocol>(_ signature: Signature, for signedData: D) -> Bool
}
extension Curve25519.Signing {
static var signatureByteCount: Int {
return 64
}
}
extension Curve25519.Signing.PublicKey: DataValidator {
typealias Signature = Data
/// Verifies an EdDSA signature over Curve25519.
///
/// - Parameters:
/// - signature: The signature to check against the given data.
/// - data: The data covered by the signature.
///
/// - Returns: A Boolean value that’s `true` when the signature is valid for
/// the given data.
public func isValidSignature<S: DataProtocol, D: DataProtocol>(_ signature: S, for data: D) -> Bool {
#if !CRYPTO_IN_SWIFTPM_FORCE_BUILD_API
return self.coreCryptoIsValidSignature(signature, for: data)
#else
return self.openSSLIsValidSignature(signature, for: data)
#endif
}
}
extension Curve25519.Signing.PrivateKey: Signer {
/// Generates an EdDSA signature over Curve25519.
///
/// - Parameters:
/// - data: The data to sign.
///
/// - Returns: The signature for the data. Although not required by [RFC
/// 8032](https://tools.ietf.org/html/rfc8032), which describes the
/// Edwards-Curve Digital Signature Algorithm (EdDSA), the CryptoKit
/// implementation of the algorithm employs randomization to generate a
/// different signature on every call, even for the same data and key, to
/// guard against side-channel attacks.
public func signature<D: DataProtocol>(for data: D) throws -> Data {
#if !CRYPTO_IN_SWIFTPM_FORCE_BUILD_API
return try self.coreCryptoSignature(for: data)
#else
return try self.openSSLSignature(for: data)
#endif
}
}
#endif // Linux or !SwiftPM
|