| package box_test |
| |
| import ( |
| crypto_rand "crypto/rand" // Custom so it's clear which rand we're using. |
| "fmt" |
| "io" |
| |
| "golang.org/x/crypto/nacl/box" |
| ) |
| |
| func Example() { |
| senderPublicKey, senderPrivateKey, err := box.GenerateKey(crypto_rand.Reader) |
| if err != nil { |
| panic(err) |
| } |
| |
| recipientPublicKey, recipientPrivateKey, err := box.GenerateKey(crypto_rand.Reader) |
| if err != nil { |
| panic(err) |
| } |
| |
| // You must use a different nonce for each message you encrypt with the |
| // same key. Since the nonce here is 192 bits long, a random value |
| // provides a sufficiently small probability of repeats. |
| var nonce [24]byte |
| if _, err := io.ReadFull(crypto_rand.Reader, nonce[:]); err != nil { |
| panic(err) |
| } |
| |
| msg := []byte("Alas, poor Yorick! I knew him, Horatio") |
| // This encrypts msg and appends the result to the nonce. |
| encrypted := box.Seal(nonce[:], msg, &nonce, recipientPublicKey, senderPrivateKey) |
| |
| // The recipient can decrypt the message using their private key and the |
| // sender's public key. When you decrypt, you must use the same nonce you |
| // used to encrypt the message. One way to achieve this is to store the |
| // nonce alongside the encrypted message. Above, we stored the nonce in the |
| // first 24 bytes of the encrypted text. |
| var decryptNonce [24]byte |
| copy(decryptNonce[:], encrypted[:24]) |
| decrypted, ok := box.Open(nil, encrypted[24:], &decryptNonce, senderPublicKey, recipientPrivateKey) |
| if !ok { |
| panic("decryption error") |
| } |
| fmt.Println(string(decrypted)) |
| // Output: Alas, poor Yorick! I knew him, Horatio |
| } |
| |
| func Example_precompute() { |
| senderPublicKey, senderPrivateKey, err := box.GenerateKey(crypto_rand.Reader) |
| if err != nil { |
| panic(err) |
| } |
| |
| recipientPublicKey, recipientPrivateKey, err := box.GenerateKey(crypto_rand.Reader) |
| if err != nil { |
| panic(err) |
| } |
| |
| // The shared key can be used to speed up processing when using the same |
| // pair of keys repeatedly. |
| sharedEncryptKey := new([32]byte) |
| box.Precompute(sharedEncryptKey, recipientPublicKey, senderPrivateKey) |
| |
| // You must use a different nonce for each message you encrypt with the |
| // same key. Since the nonce here is 192 bits long, a random value |
| // provides a sufficiently small probability of repeats. |
| var nonce [24]byte |
| if _, err := io.ReadFull(crypto_rand.Reader, nonce[:]); err != nil { |
| panic(err) |
| } |
| |
| msg := []byte("A fellow of infinite jest, of most excellent fancy") |
| // This encrypts msg and appends the result to the nonce. |
| encrypted := box.SealAfterPrecomputation(nonce[:], msg, &nonce, sharedEncryptKey) |
| |
| // The shared key can be used to speed up processing when using the same |
| // pair of keys repeatedly. |
| var sharedDecryptKey [32]byte |
| box.Precompute(&sharedDecryptKey, senderPublicKey, recipientPrivateKey) |
| |
| // The recipient can decrypt the message using the shared key. When you |
| // decrypt, you must use the same nonce you used to encrypt the message. |
| // One way to achieve this is to store the nonce alongside the encrypted |
| // message. Above, we stored the nonce in the first 24 bytes of the |
| // encrypted text. |
| var decryptNonce [24]byte |
| copy(decryptNonce[:], encrypted[:24]) |
| decrypted, ok := box.OpenAfterPrecomputation(nil, encrypted[24:], &decryptNonce, &sharedDecryptKey) |
| if !ok { |
| panic("decryption error") |
| } |
| fmt.Println(string(decrypted)) |
| // Output: A fellow of infinite jest, of most excellent fancy |
| } |