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
|
//===----------------------------------------------------------------------===//
//
// 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 MACAlgorithm {
associatedtype Key
#if !CRYPTO_IN_SWIFTPM_FORCE_BUILD_API
associatedtype MAC: CryptoKit.MessageAuthenticationCode
#else
associatedtype MAC: Crypto.MessageAuthenticationCode
#endif
/// Initializes the MAC Algorithm
///
/// - Parameter key: The key used to authenticate the data
init(key: Key)
/// Updates the MAC with the buffer.
///
/// - Parameter bufferPointer: The buffer to update the MAC
mutating func update(bufferPointer: UnsafeRawBufferPointer)
/// Returns the MAC from the input in the MAC Algorithm instance.
///
/// - Returns: The Message Authentication Code
func finalize() -> MAC
}
extension MACAlgorithm {
/// Computes a Message Authentication Code.
///
/// - Parameters:
/// - bufferPointer: The buffer to authenticate
/// - key: The key used to authenticate the data
/// - Returns: A Message Authentication Code
static func authenticationCode(bufferPointer: UnsafeRawBufferPointer, using key: Key) -> MAC {
// swiftlint:disable:next explicit_init
var authenticator = Self(key: key)
// swiftlint:disable:previous explicit_init
authenticator.update(bufferPointer: bufferPointer)
return authenticator.finalize()
}
/// Verifies a Message Authentication Code. The comparison is done in constant-time.
///
/// - Parameters:
/// - key: The key used to authenticate the data
/// - bufferPointer: The buffer to authenticate
/// - mac: The MAC to verify
/// - Returns: Returns true if the MAC is valid. False otherwise.
static func isValidAuthenticationCode(_ mac: MAC, authenticating bufferPointer: UnsafeRawBufferPointer, using key: Key) -> Bool {
return mac == Self.authenticationCode(bufferPointer: bufferPointer, using: key)
}
}
#endif // Linux or !SwiftPM
|