diff --git a/Sources/App/Message+Extensions.swift b/Sources/App/Message+Extensions.swift new file mode 100644 index 0000000..4bc58a1 --- /dev/null +++ b/Sources/App/Message+Extensions.swift @@ -0,0 +1,33 @@ +import Foundation +import Crypto + +extension Message { + + static var length: Int { + SHA256.byteCount + Content.length + } + + init(decodeFrom data: T) where T.Element == UInt8 { + let count = SHA256.byteCount + self.mac = Data(data.prefix(count)) + self.content = .init(decodeFrom: Array(data.dropFirst(count))) + } + + func isValid(using key: SymmetricKey) -> Bool { + HMAC.isValidAuthenticationCode(mac, authenticating: content.encoded, using: key) + } +} + +extension Message.Content { + + func authenticate(using key: SymmetricKey) -> Message { + let mac = HMAC.authenticationCode(for: encoded, using: key) + return .init(mac: Data(mac.map { $0 }), content: self) + } + + func authenticateAndSerialize(using key: SymmetricKey) -> Data { + let encoded = self.encoded + let mac = HMAC.authenticationCode(for: encoded, using: key) + return Data(mac.map { $0 }) + encoded + } +} diff --git a/Sources/App/Message.swift b/Sources/App/Message.swift index 0c6083c..6891833 100644 --- a/Sources/App/Message.swift +++ b/Sources/App/Message.swift @@ -1,13 +1,8 @@ import Foundation -import CryptoKit import NIOCore struct Message: Equatable, Hashable { - static var length: Int { - SHA256Digest.byteCount + Content.length - } - struct Content: Equatable, Hashable { let time: UInt32 @@ -28,17 +23,6 @@ struct Message: Equatable, Hashable { MemoryLayout.size * 2 } - func authenticate(using key: SymmetricKey) -> Message { - let mac = HMAC.authenticationCode(for: encoded, using: key) - return .init(mac: Data(mac.map { $0 }), content: self) - } - - func authenticateAndSerialize(using key: SymmetricKey) -> Data { - let encoded = self.encoded - let mac = HMAC.authenticationCode(for: encoded, using: key) - return Data(mac.map { $0 }) + encoded - } - var encoded: Data { time.encoded + id.encoded } @@ -64,16 +48,6 @@ struct Message: Equatable, Hashable { self.init(decodeFrom: data) } - private init(decodeFrom data: T) where T.Element == UInt8 { - let count = SHA256Digest.byteCount - self.mac = Data(data.prefix(count)) - self.content = .init(decodeFrom: Array(data.dropFirst(count))) - } - - func isValid(using key: SymmetricKey) -> Bool { - HMAC.isValidAuthenticationCode(mac, authenticating: content.encoded, using: key) - } - var encoded: Data { mac + content.encoded }