Created
April 4, 2020 02:47
-
-
Save cardoso/3dffabbd4907f9ee669f75b155e644e7 to your computer and use it in GitHub Desktop.
CryptoKit End-to-end Encryption
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import CryptoKit | |
import Foundation | |
var protocolSalt = "Hello, playground".data(using: .utf8)! | |
// generate key pairs | |
let sPrivateKey = Curve25519.KeyAgreement.PrivateKey() | |
let sPublicKey = sPrivateKey.publicKey | |
let rPrivateKey = Curve25519.KeyAgreement.PrivateKey() | |
let rPublicKey = rPrivateKey.publicKey | |
// sender derives symmetric key | |
let sSharedSecret = try! sPrivateKey.sharedSecretFromKeyAgreement(with: rPublicKey) | |
let sSymmetricKey = sSharedSecret.hkdfDerivedSymmetricKey(using: SHA256.self, | |
salt: protocolSalt, | |
sharedInfo: Data(), | |
outputByteCount: 32) | |
let sSensitiveMessage = "The result of your test is positive".data(using: .utf8)! | |
// sender encrypts data | |
let encryptedData = try! ChaChaPoly.seal(sSensitiveMessage, using: sSymmetricKey).combined | |
// receiver derives same symmetric key | |
let rSharedSecret = try! rPrivateKey.sharedSecretFromKeyAgreement(with: sPublicKey) | |
let rSymmetricKey = rSharedSecret.hkdfDerivedSymmetricKey(using: SHA256.self, | |
salt: protocolSalt, | |
sharedInfo: Data(), | |
outputByteCount: 32) | |
// receiver decrypts data | |
let sealedBox = try! ChaChaPoly.SealedBox(combined: encryptedData) | |
let decryptedData = try! ChaChaPoly.open(sealedBox, using: rSymmetricKey) | |
let rSensitiveMessage = String(data: decryptedData, encoding: .utf8)! | |
// assertions | |
sSymmetricKey == rSymmetricKey | |
sSensitiveMessage == decryptedData |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment