27 lines
789 B
Swift
27 lines
789 B
Swift
import CryptoKit
|
|
import Foundation
|
|
import LocalData
|
|
|
|
nonisolated
|
|
struct ExternalKeyMaterialProvider: KeyMaterialProviding {
|
|
private enum Constants {
|
|
static let keyLength = 32
|
|
}
|
|
|
|
func keyMaterial(for keyName: String) async throws -> Data {
|
|
let key = StorageKeys.ExternalKeyMaterialKey(keyName: keyName)
|
|
if let existing = try await StorageRouter.shared.get(key) as Data? {
|
|
return existing
|
|
}
|
|
|
|
let symmetricKey = SymmetricKey(size: .bits256)
|
|
let material = symmetricKey.withUnsafeBytes { Data($0) }
|
|
guard material.count == Constants.keyLength else {
|
|
throw StorageError.securityApplicationFailed
|
|
}
|
|
|
|
try await StorageRouter.shared.set(material, for: key)
|
|
return material
|
|
}
|
|
}
|