45 lines
1.1 KiB
Swift
45 lines
1.1 KiB
Swift
//
|
|
// Copyright 2024 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import CryptoKit
|
|
import Foundation
|
|
|
|
public class MetadataStreamTransform: StreamTransform, FinalizableStreamTransform {
|
|
public var hasFinalized: Bool = false
|
|
|
|
private var sha256Result: SHA256.Digest?
|
|
private var sha256State: SHA256?
|
|
|
|
public func digest() throws -> Data {
|
|
guard hasFinalized else {
|
|
throw OWSAssertionError("Reading digest before finalized")
|
|
}
|
|
guard let sha256Result else {
|
|
throw OWSAssertionError("Not configured to calculate digest")
|
|
}
|
|
return Data(sha256Result)
|
|
}
|
|
|
|
init(calculateDigest: Bool) {
|
|
if calculateDigest {
|
|
self.sha256State = SHA256()
|
|
}
|
|
}
|
|
|
|
public private(set) var count: Int = 0
|
|
|
|
public func transform(data: Data) -> Data {
|
|
sha256State?.update(data: data)
|
|
count += data.count
|
|
return data
|
|
}
|
|
|
|
public func finalize() -> Data {
|
|
hasFinalized = true
|
|
sha256Result = sha256State?.finalize()
|
|
sha256State = nil
|
|
return Data()
|
|
}
|
|
}
|