5 ms·
Not going to pretend that I know what the most of the stuff mean, or if it is even safe enough, but I've followed the MDN articles and put together this TypeScr
by trusz 4y ago
Not going to pretend that I know what the most of the stuff mean, or if it is even safe enough, but I've followed the MDN articles and put together this TypeScript snippet [1]. Maybe somebody could comment on it?
Also sorry for the long link. Is there any accepted way to post a shorted URL?
Edit: added a corrected version [2]
[1]: https://www.typescriptlang.org/play?#code/DYUwLgBAbiDGYHsBOEC8EDuBLAdgEwQwDpYkBPAB0SIHNwAlAQ3wQFsA1R4AVxAGcAFDhAYIAVVxgAHAEEkSRmQEBGAGwBKdQG4AUHsZ8yOWBABm3Y2CwIcEEMfJUAKgAt7AETiOwAvl-AAsvx8jHQAXHxgSLg0ADQQFAZ8GMh4YRCR0Tg0EOrpAApIbFh+ADwA2pkx8TjcrABGIEgAugB8EADeehA9EAD0fTq9-X0QhSAUQ70DUz2wNpEQANYgZGgQjBiMWJB0wgpgIADSqwBiRaz5SSlIeAKJfMmp6t3Tg8MDEACiDpRWNjRZiMgfMcIt7KQ-iA8EFHqEQOtNttIBDvLCQnQBCsyPE-KRAsF4doQQsUb9Dnh3IwwIx1sJRBIcNI5AolKioTDCXRtCMIKUALQZex4CBgFwlV49Ab8mX8oEzD6jTyQqjy95vUGLPBeDmIrY7CDalVgdHwrGreLsqjQ03cklgyBG7zQvXIw06qi2kDmnF2cnQqk0l7DTWOj0UwO09D08SSWTyRQCJ0c4kh0nu43QpwgAAekHQoJgSDALMUACFuKZTE1EABlKIxJPhgPUxgvSW8zUIUBEYAIGgCABEyudIrwrfSg4gAGoM8GNQtuyAiNr6twBwBycruL5lsQAcWaEA38Q62Mtv2tnLhdAvkIjrfiyavT+blMfGdH2bzAF9ckCkHAbgkFscpnwpb8wDvcgHxpXt7BoMVmh0H99EMYwzAseBrFsPYmmpY4zguK5HhuO4HieW4IgbbI8jGC4ShAUoAGFvAQE4yFaLoIFDCAsFYChkApEjKJFdAkQNbAWGIY0ECIPhuHqMAe34wTiw4gQgWGQcFAwQdYi03pCxresshoJwEFLMgKyrJp7muZ4DOGYYOkHHBGFYEBB0nfIyyOdxTgAJkHH8nOcnpTC4Px4k+AU7DzBR4EYepQAAfkMnpykHbVohgDjB2Q4ZiXtRYQmAfMIEHMUETKyASlFcU+AgBQWFYDIaJoQcSsgbFXUk3ACBktj5MU5TlxyrA8tWTTwp6bjZu09zPO8yrfP8oL9Iy5zB1qlbjOLUyYgsqybOrJBfC4MB1DChaekHHZ8P+MEVuUAAGd73pu27BxcAwXBWwdawACRkflAoAVlULqFtCrbVKE6ERLIr6XK2xaPK8ycZC+Wt+X3ZiAk227ekHUBsjFF7AqkLbYYWyLgGirasqtMB9Mq8CCqBYrhkAsBgNsbEULQowTHMSwcL9Y0vR9dJWL+diLSFfETS5EB0iqWjOgAoCQMwAbCBIYaFKUnsWYEDolrVyrsdx-HCfiSb0hgeBkFC5ZFf2sBDuyY6E2syszt8fwVZvEBNF0VCdAMEXMPFmxPz+aXsVltiOOgjkvXSE6A6adQtZ5nXbCkwbDflkaTfG8NzctrGcbxgm2cd6A4EQJA3fPSXRy9YlI7F7D48973zMsv3TrszJqLMujGWZP3896KBGBQCEEByukRAgSCfnmHKBFTXpef5yXV6aIgV+1Xwoh7nQ+6enibCLEtR5z4sECHgQ11spB0hn+NWTyDWOR5o9EXigI0J8UDRg3pBZUEChzcDAKYfkUhBz7x6IfXW4CcorjgCfD+L9r7CwwrfCWrBtg4D3sA++DoIDICwDQXAXAvTrEHAAYkNAgWAdR7A0jvjQbgWBgDamALgBE0MjLpjxLzFhrA1iIAoErXm4i5jpnKKYRhwAvS4iwAALxAAAeVMNvUckYjziX1GSY0rgPBVzoQw9ymjVa4mDvOFRYIlxECSDWAQdiNHMNQAEswfjVauOoXwDxfYBxUOGKwPgNAwg7V0fwWhphDStjZltXxDj0hZKYareC5MXDxC2izaE6skmGOMRySMxSFoHDVr4CpRjLywUYH0XJjjQ4FMQi4UJP4XiRy7D2WAoAl57x0GQ3Ae8gA https://www.typescriptlang.org/play?#code/DYUwLgBAbiDGYHsBOE...
[2]: https://www.typescriptlang.org/play?#code/FAiGGcE8DsGMAIBmBXOAXAlge2vApnAE6QAOaAKgBYEAiesxZAFMPG-OPYXmgLJ7hwoAOZ4AXODSEM0YQBp4rdiQjgA7lkIATMRykz5SthgBuugKoy0ADgCChQqEhyjHUABs0E-bJfAAlLoACoRYALYYnAA8ANqS0r7w0MhhAEZ4hAC6AHzwAN4g7PAA9MWupfAheCTlZUWwOJLwANZ4kPAAvPCgaqAYaPCi0BmgaHgA0m0AYqFhQaoa2kwqgotaCkKe-oXspbXwAKJEpJg4ta4N0E0EDCd4WvyCInid3b39+Mdkj0KiTK3ODhcHg-Z4KUz+ADcF0aAxuxDGWhoo1Ar2GanglmgNnsjkgTHhdweAl+eChJWK8CiAFogdAtPA0JRIjs2KVqRzqecihU6LcyNzdsVLk0tFwia8en0BmL+XwSc9-m0FISyPdQaJtvVYfBZYxEZL3jLxd8FX8ASrjojkWhQOCTFr2CLjXL7jbUV10ZirHYHE4mHqiVCYVcXfr7uQ8AAPAZdS4mDJoXFOABCyEQiETWAAyj5hAGTdaUdtWRT4CKsO48AA6dxYfMAIj54YZWhRugb8AA1Lr6I62cLGpWa2LUsh8wByGI0A4p8wAcUy8AnCjyFs+ruJT1EltuRdtCkDavWvc37sPhYj0bQAF94P34Nw0MhCLgYkfEZGY7uEW6UbWCGEJlMmAG8wCgOAkFQWBTlwIYRjGSZIBmcJ5lWTQtGWBYMO8BJ5DcTxdHiAxAkqWZIjwKIAGF9SwJDsgKcsdQwMISE0RE0PUDDDWleA1BkLQsDUas5SwatwGQVI0CrasWLYwg0CQlgiiKBtHDUBsXBUp0cATBTczw8gsGTSA0wzDIsPQ7R-C07T8gbaBQDCPAGw7IIU3GGgpgAJgbG9bO0xAPE4BQKhpfAY0cGDQFSKsAH5XCKGIGzFaQEyQhsQKKYMQyaAEeI+fj6SEkTaPEyTpJHDJTAmNplLsxi7NUxznNc+AG3czyfM0xK7IbTY0Da+NEwMgwjJMszM0IJgBps3rtIbfoEOwK42oARgABi2raAqa9rKAgSg2obbMAAlbGpbyAFYADYG3m+B-IeuT2PuTi1l2opGr29qWpcjtbAObNqXnKjeB6n62AbKtZCZdbvOsB6nqaoL3BCh7ktVQaFBSwtMtcHKiifF9cABUDwJgBAUHQFaN31DU8CVSBdBok46OVIEGBBM1xD0PD7QsH0TP8fJXGJ18+IEkrRPKqSZKxpg8j+gGgZBsHNPgUx-JaDnhv0vNxr9Uz0ymmbgXlbcyWDMDgAgSmoJpnBT3pnmmZZ2ikJ-IkGd0CaTYyAXvWxX08RF77Hx4EnJeK4SZYkuWqrlRXlfawHgdB8H7W19csfVHnrZAamYNpvW0FG2RDbxSaLPiXCSMF4OTNFooTFAQgNywVK0TwDEvzQI4GlSphgyJyOJZuTuMmrCexRmqQC6L2CmOgPSkyN6uFJzPMmDHczCAbnEjcCYjZGb9hW-b2VJ-bz0e-gPu+WvpgG2QNBEGpawGxH9hxdwK-UurP-Rmu8poF2AIvWmjhiphAAGoeGQAIYeB8Q5OHDr-aOglY5lVEGgAASqAaBcD3AIPAEwL0WJD54iYGtG6-htg2wppBCBTswh9GgMPcOzp4CaAwMIGQHgGavAbAAYl1FgWAKQCC2iXsIZAGB3BincDIF491tShk5k+IRYR2hoCwCQDRPBVE6XUQmGCmhXhQMErA+BiDv5sC4QNIRTIXiOMiIyZk4BHwEKsXzAwYhOw9kseEIhJDh6li4TERA-D3AMw2BgAAXngAA8ogAeLZ3RLi6FKD4WMqC0ELEwHhfDHIxJ5hsc2ChTG6MIBsDwaAHwVhkqoRMhTpDFIETzToHQuhRJKQzBpQ4ZJ1nzOHIomBnK6BtDWaAQlh6hUpAAK2QE0XRQIXgYEQO4l4wzywHVkAIbhuBnGPl4UyB6YRwDCH8eABJBysCbLbLaDWD0inRNiS8tp0TdCvL6TzACsNKAKAernHQHBbkpLSUSc8igUZvLKQ9RwYwxAzXBakr4+5QDFB+R0y2-ygKUAfDeehIBGk1lgFWNuYTWEyGHkAA https://www.typescriptlang.org/play?#code/FAiGGcE8DsGMAIBmBX...
- tptacek 4y agoIf you call "encrypt" more than once in that code, you'll leak the authentication key. Every invocation of GCM encryption needs a unique nonce. Cryptography nerds will chastise you for using a random nonce (there theoretically isn't enough room in the GCM nonce space to safely encrypt large numbers of message with random nonces), but the alternative (using a counter) is even more hazardous. This problem motivates a lot of people to use other AEADs like XChapoly, which has an extended nonce space that safely admits random nonces. Isn't cryptography fun?
- trusz 4y agoOh yes! Thank you for the feedback. I've added a new version where the `iv` and the `salt` is random. Maybe a followup question: Because you need both the `iv` and `salt` to decrypt the message is it ok in an E2E scenario to send all three: `iv`, `salt` and the encrypted message?
- tptacek 4y agoI didn't look to see what "salt" means in your design, but the idiom for using GCM in message encryption is to send ciphertexts that take the form `nonce || ciphertext`, and to decrypt by reading the nonce off the front of the message.
- majou 4y agoFrom what I shallowly researched; GCM's nonce seems limited to 12 bytes by convention only. That nonce reuse is so fatal seems absurd to me. Would "salting" the key safely tackle the problem? Put explicitly; send <- nonce || salt || ciphertext recv -> decrypt(ciphertext, nonce, pbkdf(pass) || salt) [edit: apply salt outside of the kdf]
- tptacek 4y agoAs I remember it, the balance of the bytes in the AES block are used for the counter. At any rate, the convention is essentially universal.