X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/b54c578e17e9bcbd74aa30ea75e25e955b9a6205..HEAD:/keychain/TrustedPeersHelper/RecoveryKey/RecoveryKey.swift diff --git a/keychain/TrustedPeersHelper/RecoveryKey/RecoveryKey.swift b/keychain/TrustedPeersHelper/RecoveryKey/RecoveryKey.swift index 35cd9b3f..373a256d 100644 --- a/keychain/TrustedPeersHelper/RecoveryKey/RecoveryKey.swift +++ b/keychain/TrustedPeersHelper/RecoveryKey/RecoveryKey.swift @@ -25,20 +25,38 @@ import Foundation import SecurityFoundation class RecoveryKey: NSObject { - public var recoveryKeys: RecoveryKeySet - public var secret: Data + internal var recoveryKeys: RecoveryKeySet + internal var secret: Data - public var peerKeys: OctagonSelfPeerKeys + internal var peerKeys: OctagonSelfPeerKeys - public init(recoveryKeyString: String, recoverySalt: String) throws { + internal init(recoveryKeyString: String, recoverySalt: String) throws { self.secret = Data(bytes: Array(recoveryKeyString.utf8), count: recoveryKeyString.utf8.count) self.recoveryKeys = try RecoveryKeySet(secret: self.secret, recoverySalt: recoverySalt) - let hash = try RecoveryKeySet.hashRecoveryedSigningPublicKey(keyData: self.recoveryKeys.signingKey.publicKey.keyData) - let peerID = "RK-" + hash + let peerID = RecoveryKey.PeerID(signingPublicKeyData: self.recoveryKeys.signingKey.publicKey.keyData) try self.peerKeys = OctagonSelfPeerKeys(peerID: peerID, signingKey: self.recoveryKeys.signingKey, encryptionKey: self.recoveryKeys.encryptionKey) } + + static func PeerID(signingPublicKeyData: Data) -> String { + let hash = RecoveryKeySet.hashRecoveryedSigningPublicKey(keyData: signingPublicKeyData) + let peerID = "RK-" + hash + + return peerID + } + + static func spki(publicKeyData: Data) throws -> Data { + let key = try _SFECPublicKey(data: publicKeyData, specifier: _SFECKeySpecifier(curve: SFEllipticCurve.nistp384)) + return key.encodeSubjectPublicKeyInfo() + } + + public static func asPeer(recoveryKeys: TPRecoveryKeyPair, viewList: Set) throws -> TrustedPeersHelperPeer { + return TrustedPeersHelperPeer(peerID: self.PeerID(signingPublicKeyData: recoveryKeys.signingKeyData), + signingSPKI: try self.spki(publicKeyData: recoveryKeys.signingKeyData), + encryptionSPKI: try self.spki(publicKeyData: recoveryKeys.encryptionKeyData), + viewList: viewList) + } } extension RecoveryKey {