Some checks failed
Build and Deploy / build-macos (push) Failing after 5s
Build and Deploy / build-windows (CLANG64) (push) Has been cancelled
Build and Deploy / package-dist (push) Has been cancelled
Build and Deploy / deploy-itch (push) Has been cancelled
Build and Deploy / deploy-gitea (push) Has been cancelled
Build and Deploy / build-linux (push) Has been cancelled
118 lines
4.4 KiB
JavaScript
118 lines
4.4 KiB
JavaScript
// Simplified Seif Handshake Example
|
|
// This demonstrates the core cryptographic operations of the Seif handshake
|
|
|
|
var crypto = use('crypto');
|
|
var json = use('json');
|
|
|
|
console.log("=== Seif Handshake Demo ===\n");
|
|
|
|
// Step 1: Generate key pairs for Alice and Bob
|
|
console.log("1. Generating key pairs...");
|
|
var alice_keys = crypto.keypair();
|
|
var bob_keys = crypto.keypair();
|
|
|
|
console.log("Alice's public key:", alice_keys.public);
|
|
console.log("Bob's public key:", bob_keys.public);
|
|
|
|
// Step 2: Alice initiates handshake
|
|
console.log("\n2. Alice initiates handshake...");
|
|
|
|
// Alice generates a random handshake key
|
|
var handshake_key = crypto.keypair().public; // Using public key generation for random 32 bytes
|
|
console.log("Handshake key:", handshake_key);
|
|
|
|
// Alice creates the handshake message
|
|
var alice_message = {
|
|
seif: 1,
|
|
handshake: crypto.encrypt_pk(bob_keys.public, handshake_key),
|
|
payload: crypto.encrypt(handshake_key, alice_keys.public)
|
|
};
|
|
|
|
console.log("Alice's message created (encrypted components)");
|
|
|
|
// Step 3: Bob processes the handshake
|
|
console.log("\n3. Bob processes the handshake...");
|
|
|
|
// Bob decrypts the handshake key
|
|
var decrypted_handshake_key_buffer = crypto.decrypt_pk(bob_keys.private, alice_message.handshake);
|
|
|
|
// Convert buffer to hex string
|
|
var handshake_key_bytes = new Uint8Array(decrypted_handshake_key_buffer);
|
|
var recovered_handshake_key = '';
|
|
for (var i = 0; i < handshake_key_bytes.length; i++) {
|
|
var hex = handshake_key_bytes[i].toString(16);
|
|
recovered_handshake_key += (hex.length === 1 ? '0' : '') + hex;
|
|
}
|
|
|
|
console.log("Bob recovered handshake key:", recovered_handshake_key);
|
|
console.log("Keys match:", recovered_handshake_key === handshake_key);
|
|
|
|
// Bob decrypts Alice's public key
|
|
var alice_public_buffer = crypto.decrypt(recovered_handshake_key, alice_message.payload);
|
|
var alice_public_bytes = new Uint8Array(alice_public_buffer);
|
|
var recovered_alice_public = '';
|
|
for (var i = 0; i < alice_public_bytes.length; i++) {
|
|
recovered_alice_public += String.fromCharCode(alice_public_bytes[i]);
|
|
}
|
|
|
|
console.log("Bob recovered Alice's public key:", recovered_alice_public);
|
|
console.log("Public keys match:", recovered_alice_public === alice_keys.public);
|
|
|
|
// Step 4: Bob generates session key and responds
|
|
console.log("\n4. Bob generates session key and responds...");
|
|
|
|
// Generate a random session key
|
|
var session_key = crypto.keypair().public;
|
|
console.log("Session key:", session_key);
|
|
|
|
// Bob encrypts the session key with Alice's public key
|
|
var bob_response = {
|
|
session: crypto.encrypt_pk(alice_keys.public, session_key)
|
|
};
|
|
|
|
// Encrypt the entire response with the handshake key
|
|
var encrypted_response = crypto.encrypt(handshake_key, json.encode(bob_response));
|
|
console.log("Bob's encrypted response created");
|
|
|
|
// Step 5: Alice processes Bob's response
|
|
console.log("\n5. Alice processes Bob's response...");
|
|
|
|
// Alice decrypts the response
|
|
var decrypted_response_buffer = crypto.decrypt(handshake_key, encrypted_response);
|
|
var response_json = '';
|
|
var response_bytes = new Uint8Array(decrypted_response_buffer);
|
|
for (var i = 0; i < response_bytes.length; i++) {
|
|
response_json += String.fromCharCode(response_bytes[i]);
|
|
}
|
|
var response_data = json.decode(response_json);
|
|
|
|
// Alice decrypts the session key
|
|
var session_key_buffer = crypto.decrypt_pk(alice_keys.private, response_data.session);
|
|
var session_key_bytes = new Uint8Array(session_key_buffer);
|
|
var recovered_session_key = '';
|
|
for (var i = 0; i < session_key_bytes.length; i++) {
|
|
var hex = session_key_bytes[i].toString(16);
|
|
recovered_session_key += (hex.length === 1 ? '0' : '') + hex;
|
|
}
|
|
|
|
console.log("Alice recovered session key:", recovered_session_key);
|
|
console.log("Session keys match:", recovered_session_key === session_key);
|
|
|
|
// Step 6: Demonstrate secure communication
|
|
console.log("\n6. Secure communication established!");
|
|
console.log("Both parties now share the session key and can communicate securely.");
|
|
|
|
// Example encrypted message
|
|
var message = "Hello, this is a secret message!";
|
|
var encrypted_msg = crypto.encrypt(session_key, message);
|
|
console.log("\nAlice encrypts:", message);
|
|
|
|
var decrypted_msg_buffer = crypto.decrypt(session_key, encrypted_msg);
|
|
var decrypted_msg = '';
|
|
var msg_bytes = new Uint8Array(decrypted_msg_buffer);
|
|
for (var i = 0; i < msg_bytes.length; i++) {
|
|
decrypted_msg += String.fromCharCode(msg_bytes[i]);
|
|
}
|
|
console.log("Bob decrypts:", decrypted_msg);
|
|
|
|
console.log("\n=== Seif Handshake Complete ==="); |