1 import std.algorithm.searching : all, any; 2 import tagion.basic.Types : FileExtension; 3 import tagion.basic.basic : fileId; 4 import tagion.crypto.SecureNet; 5 import tagion.hibon.Document : Document; 6 import tagion.hibon.HiBON : HiBON; 7 import tagion.utils.convert : decode; 8 9 immutable passphrase = "Secret pass word"; 10 auto net = new StdSecureNet; /// Only works with ECDSA for now 11 net.generateKeyPair(passphrase); 12 13 immutable some_secret_message = "Text to be encrypted by ECC public key and " ~ 14 "decrypted by its corresponding ECC private key"; 15 auto hibon = new HiBON; 16 hibon["text"] = some_secret_message; 17 const secret_doc = Document(hibon); 18 19 { // Encrypt and Decrypt secret message 20 auto dummy_net = new StdSecureNet; 21 auto secret_cipher_doc = Cipher.encrypt(dummy_net, net.pubkey, secret_doc).serialize; 22 const encrypted_doc = Cipher.decrypt(net, CipherDocument(Document(secret_cipher_doc))); 23 assert(encrypted_doc["text"].get!string == some_secret_message); 24 assert(secret_doc.data == encrypted_doc.data); 25 } 26 27 { // Use of the wrong privat-key 28 auto dummy_net = new StdSecureNet; 29 auto wrong_net = new StdSecureNet; 30 immutable wrong_passphrase = "wrong word"; 31 wrong_net.generateKeyPair(wrong_passphrase); 32 bool cipher_decrypt_error; 33 bool cipher_decrypt_crc_error; 34 while (!cipher_decrypt_error || !cipher_decrypt_crc_error) { 35 const secret_cipher_doc = Cipher.encrypt(dummy_net, wrong_net.pubkey, secret_doc); 36 try { 37 const encrypted_doc = Cipher.decrypt(net, secret_cipher_doc); 38 assert(secret_doc != encrypted_doc); 39 if (!encrypted_doc.empty) { 40 break; /// Run the loop until the decrypt does not fail 41 } 42 } 43 catch (ConsensusException e) { 44 cipher_decrypt_error |= (e.code == ConsensusFailCode.CIPHER_DECRYPT_ERROR); 45 cipher_decrypt_crc_error |= (e.code == ConsensusFailCode.CIPHER_DECRYPT_CRC_ERROR); 46 } 47 } 48 } 49 50 { // Encrypt and Decrypt secrte message with owner privat-key 51 const secret_cipher_doc = Cipher.encrypt(net, secret_doc); 52 const encrypted_doc = Cipher.decrypt(net, secret_cipher_doc); 53 assert(encrypted_doc["text"].get!string == some_secret_message); 54 assert(secret_doc.data == encrypted_doc.data); 55 } 56