From 49dd52a1fbfafb38995be5e3f1d2afccfc34cd11 Mon Sep 17 00:00:00 2001 From: Morgan Pretty Date: Tue, 8 Feb 2022 17:01:37 +1100 Subject: [PATCH] Added code to support generating a derived key for id blinding --- .../Utilities/Sodium+Conversion.swift | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/SessionMessagingKit/Utilities/Sodium+Conversion.swift b/SessionMessagingKit/Utilities/Sodium+Conversion.swift index c522bdf92..9ad03dc67 100644 --- a/SessionMessagingKit/Utilities/Sodium+Conversion.swift +++ b/SessionMessagingKit/Utilities/Sodium+Conversion.swift @@ -39,3 +39,29 @@ extension Sign { return x25519SecretKey } } + +extension Sodium { + public typealias SOGSDerivedKey = Data + + private static let publicKeyBytes: Int = Int(crypto_scalarmult_bytes()) + private static let sharedSecretBytes: Int = Int(crypto_scalarmult_bytes()) + + public func derivedKey(serverPublicKeyBytes: [UInt8], userKeyBytes: [UInt8]) -> SOGSDerivedKey? { + guard serverPublicKeyBytes.count == Sodium.publicKeyBytes && userKeyBytes.count == Sodium.publicKeyBytes else { return nil } + + let sharedSecretPtr: UnsafeMutablePointer = UnsafeMutablePointer.allocate(capacity: Sodium.sharedSecretBytes) + let result = userKeyBytes.withUnsafeBytes { (userPublicKeyPtr: UnsafeRawBufferPointer) in + return serverPublicKeyBytes.withUnsafeBytes { (serverPublicKeyPtr: UnsafeRawBufferPointer) -> Int32 in + guard let serverKeyBaseAddress: UnsafePointer = serverPublicKeyPtr.baseAddress?.assumingMemoryBound(to: UInt8.self), let userKeyBaseAddress: UnsafePointer = userPublicKeyPtr.baseAddress?.assumingMemoryBound(to: UInt8.self) else { + return -1 + } + + return crypto_scalarmult(sharedSecretPtr, serverKeyBaseAddress, userKeyBaseAddress) + } + } + + guard result == 0 else { return nil } + + return Data(bytes: sharedSecretPtr, count: Sodium.sharedSecretBytes) + } +}