SecureStorageSample/SecureStorgageSample/Services/ExternalKeyMaterialProvider.swift

27 lines
773 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()
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
}
}