import Foundation import CryptoKit extension Message { /** Calculate an authentication code for the message content. - Parameter key: The key to use to sign the content. - Returns: The new message signed with the key. */ func authenticate(using key: SymmetricKey) -> SignedMessage { let mac = HMAC.authenticationCode(for: encoded, using: key) return .init(mac: Data(mac.map { $0 }), message: self) } /** Calculate an authentication code for the message content and convert everything to data. - Parameter key: The key to use to sign the content. - Returns: The new message signed with the key, serialized to bytes. */ func authenticateAndSerialize(using key: SymmetricKey) -> Data { let encoded = self.encoded let mac = HMAC.authenticationCode(for: encoded, using: key) return Data(mac.map { $0 }) + encoded } }