Hex Artifact Content
Not logged in

Artifact a3fd22b031f7d4cbc9d07a58b142af59d1a29222:


0000: 2f 2f 21 20 60 63 72 79 70 74 6f 5f 73 65 63 72  //! `crypto_secr
0010: 65 74 62 6f 78 5f 78 73 61 6c 73 61 32 30 70 6f  etbox_xsalsa20po
0020: 6c 79 31 33 30 35 60 2c 20 61 20 70 61 72 74 69  ly1305`, a parti
0030: 63 75 6c 61 72 0a 2f 2f 21 20 63 6f 6d 62 69 6e  cular.//! combin
0040: 61 74 69 6f 6e 20 6f 66 20 53 61 6c 73 61 32 30  ation of Salsa20
0050: 20 61 6e 64 20 50 6f 6c 79 31 33 30 35 20 73 70   and Poly1305 sp
0060: 65 63 69 66 69 65 64 20 69 6e 0a 2f 2f 21 20 5b  ecified in.//! [
0070: 43 72 79 70 74 6f 67 72 61 70 68 79 20 69 6e 20  Cryptography in 
0080: 60 4e 61 43 6c 60 5d 28 68 74 74 70 3a 2f 2f 6e  `NaCl`](http://n
0090: 61 63 6c 2e 63 72 2e 79 70 2e 74 6f 2f 76 61 6c  acl.cr.yp.to/val
00a0: 69 64 2e 68 74 6d 6c 29 2e 0a 2f 2f 21 0a 2f 2f  id.html)..//!.//
00b0: 21 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  ! This function 
00c0: 69 73 20 63 6f 6e 6a 65 63 74 75 72 65 64 20 74  is conjectured t
00d0: 6f 20 6d 65 65 74 20 74 68 65 20 73 74 61 6e 64  o meet the stand
00e0: 61 72 64 20 6e 6f 74 69 6f 6e 73 20 6f 66 20 70  ard notions of p
00f0: 72 69 76 61 63 79 20 61 6e 64 0a 2f 2f 21 20 61  rivacy and.//! a
0100: 75 74 68 65 6e 74 69 63 69 74 79 2e 0a 0a 75 73  uthenticity...us
0110: 65 20 66 66 69 3b 0a 75 73 65 20 72 61 6e 64 6f  e ffi;.use rando
0120: 6d 62 79 74 65 73 3a 3a 72 61 6e 64 6f 6d 62 79  mbytes::randomby
0130: 74 65 73 5f 69 6e 74 6f 3b 0a 23 5b 63 66 67 28  tes_into;.#[cfg(
0140: 66 65 61 74 75 72 65 20 3d 20 22 72 75 73 74 63  feature = "rustc
0150: 2d 73 65 72 69 61 6c 69 7a 65 22 29 5d 0a 75 73  -serialize")].us
0160: 65 20 72 75 73 74 63 5f 73 65 72 69 61 6c 69 7a  e rustc_serializ
0170: 65 3b 0a 0a 2f 2f 2f 20 4e 75 6d 62 65 72 20 6f  e;../// Number o
0180: 66 20 62 79 74 65 73 20 69 6e 20 60 4b 65 79 60  f bytes in `Key`
0190: 2e 0a 70 75 62 20 63 6f 6e 73 74 20 4b 45 59 42  ..pub const KEYB
01a0: 59 54 45 53 3a 20 75 73 69 7a 65 20 3d 20 66 66  YTES: usize = ff
01b0: 69 3a 3a 63 72 79 70 74 6f 5f 73 65 63 72 65 74  i::crypto_secret
01c0: 62 6f 78 5f 78 73 61 6c 73 61 32 30 70 6f 6c 79  box_xsalsa20poly
01d0: 31 33 30 35 5f 4b 45 59 42 59 54 45 53 3b 0a 0a  1305_KEYBYTES;..
01e0: 2f 2f 2f 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  /// Number of by
01f0: 74 65 73 20 69 6e 20 61 20 60 4e 6f 6e 63 65 60  tes in a `Nonce`
0200: 2e 0a 70 75 62 20 63 6f 6e 73 74 20 4e 4f 4e 43  ..pub const NONC
0210: 45 42 59 54 45 53 3a 20 75 73 69 7a 65 20 3d 20  EBYTES: usize = 
0220: 66 66 69 3a 3a 63 72 79 70 74 6f 5f 73 65 63 72  ffi::crypto_secr
0230: 65 74 62 6f 78 5f 78 73 61 6c 73 61 32 30 70 6f  etbox_xsalsa20po
0240: 6c 79 31 33 30 35 5f 4e 4f 4e 43 45 42 59 54 45  ly1305_NONCEBYTE
0250: 53 3b 0a 0a 6e 65 77 5f 74 79 70 65 21 20 7b 0a  S;..new_type! {.
0260: 20 20 20 20 2f 2f 2f 20 60 4b 65 79 60 20 66 6f      /// `Key` fo
0270: 72 20 73 79 6d 6d 65 74 72 69 63 20 61 75 74 68  r symmetric auth
0280: 65 6e 74 69 63 61 74 65 64 20 65 6e 63 72 79 70  enticated encryp
0290: 74 69 6f 6e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20  tion.    ///.   
02a0: 20 2f 2f 2f 20 57 68 65 6e 20 61 20 60 4b 65 79   /// When a `Key
02b0: 60 20 67 6f 65 73 20 6f 75 74 20 6f 66 20 73 63  ` goes out of sc
02c0: 6f 70 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ope its contents
02d0: 0a 20 20 20 20 2f 2f 2f 20 77 69 6c 6c 20 62 65  .    /// will be
02e0: 20 7a 65 72 6f 65 64 20 6f 75 74 0a 20 20 20 20   zeroed out.    
02f0: 73 65 63 72 65 74 20 4b 65 79 28 4b 45 59 42 59  secret Key(KEYBY
0300: 54 45 53 29 3b 0a 7d 0a 0a 6e 65 77 5f 74 79 70  TES);.}..new_typ
0310: 65 21 20 7b 0a 20 20 20 20 2f 2f 2f 20 41 75 74  e! {.    /// Aut
0320: 68 65 6e 74 69 63 61 74 69 6f 6e 20 60 54 61 67  hentication `Tag
0330: 60 20 66 6f 72 20 74 68 65 20 64 65 74 61 63 68  ` for the detach
0340: 65 64 20 65 6e 63 72 79 70 74 69 6f 6e 20 6d 6f  ed encryption mo
0350: 64 65 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f  de.    ///.    /
0360: 2f 2f 20 49 6e 20 74 68 65 20 63 6f 6d 62 69 6e  // In the combin
0370: 65 64 20 6d 6f 64 65 2c 20 74 68 65 20 74 61 67  ed mode, the tag
0380: 20 6f 63 63 75 70 69 65 73 20 74 68 65 20 66 69   occupies the fi
0390: 72 73 74 20 4d 41 43 42 59 54 45 53 20 62 79 74  rst MACBYTES byt
03a0: 65 73 20 6f 66 20 74 68 65 20 63 69 70 68 65 72  es of the cipher
03b0: 74 65 78 74 2e 0a 20 20 20 20 70 75 62 6c 69 63  text..    public
03c0: 20 54 61 67 28 4d 41 43 42 59 54 45 53 29 3b 0a   Tag(MACBYTES);.
03d0: 7d 0a 0a 6e 65 77 5f 74 79 70 65 21 20 7b 0a 20  }..new_type! {. 
03e0: 20 20 20 2f 2f 2f 20 60 4e 6f 6e 63 65 60 20 66     /// `Nonce` f
03f0: 6f 72 20 73 79 6d 6d 65 74 72 69 63 20 61 75 74  or symmetric aut
0400: 68 65 6e 74 69 63 61 74 65 64 20 65 6e 63 72 79  henticated encry
0410: 70 74 69 6f 6e 0a 20 20 20 20 6e 6f 6e 63 65 20  ption.    nonce 
0420: 4e 6f 6e 63 65 28 4e 4f 4e 43 45 42 59 54 45 53  Nonce(NONCEBYTES
0430: 29 3b 0a 7d 0a 0a 2f 2f 2f 20 4e 75 6d 62 65 72  );.}../// Number
0440: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
0450: 20 61 75 74 68 65 6e 74 69 63 61 74 6f 72 20 74   authenticator t
0460: 61 67 20 6f 66 20 61 6e 20 65 6e 63 72 79 70 74  ag of an encrypt
0470: 65 64 20 6d 65 73 73 61 67 65 0a 2f 2f 2f 20 69  ed message./// i
0480: 2e 65 2e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .e. the number o
0490: 66 20 62 79 74 65 73 20 62 79 20 77 68 69 63 68  f bytes by which
04a0: 20 74 68 65 20 63 69 70 68 65 72 74 65 78 74 20   the ciphertext 
04b0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
04c0: 68 65 0a 2f 2f 2f 20 70 6c 61 69 6e 74 65 78 74  he./// plaintext
04d0: 2e 0a 70 75 62 20 63 6f 6e 73 74 20 4d 41 43 42  ..pub const MACB
04e0: 59 54 45 53 3a 20 75 73 69 7a 65 20 3d 20 66 66  YTES: usize = ff
04f0: 69 3a 3a 63 72 79 70 74 6f 5f 73 65 63 72 65 74  i::crypto_secret
0500: 62 6f 78 5f 78 73 61 6c 73 61 32 30 70 6f 6c 79  box_xsalsa20poly
0510: 31 33 30 35 5f 4d 41 43 42 59 54 45 53 3b 0a 0a  1305_MACBYTES;..
0520: 2f 2f 2f 20 60 67 65 6e 5f 6b 65 79 28 29 60 20  /// `gen_key()` 
0530: 72 61 6e 64 6f 6d 6c 79 20 67 65 6e 65 72 61 74  randomly generat
0540: 65 73 20 61 20 73 65 63 72 65 74 20 6b 65 79 0a  es a secret key.
0550: 2f 2f 2f 0a 2f 2f 2f 20 54 48 52 45 41 44 20 53  ///./// THREAD S
0560: 41 46 45 54 59 3a 20 60 67 65 6e 5f 6b 65 79 28  AFETY: `gen_key(
0570: 29 60 20 69 73 20 74 68 72 65 61 64 2d 73 61 66  )` is thread-saf
0580: 65 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20  e provided that 
0590: 79 6f 75 20 68 61 76 65 0a 2f 2f 2f 20 63 61 6c  you have./// cal
05a0: 6c 65 64 20 60 72 75 73 74 5f 73 6f 64 69 75 6d  led `rust_sodium
05b0: 3a 3a 69 6e 69 74 28 29 60 20 6f 6e 63 65 20 62  ::init()` once b
05c0: 65 66 6f 72 65 20 75 73 69 6e 67 20 61 6e 79 20  efore using any 
05d0: 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2f  other function./
05e0: 2f 2f 20 66 72 6f 6d 20 60 72 75 73 74 5f 73 6f  // from `rust_so
05f0: 64 69 75 6d 60 2e 0a 70 75 62 20 66 6e 20 67 65  dium`..pub fn ge
0600: 6e 5f 6b 65 79 28 29 20 2d 3e 20 4b 65 79 20 7b  n_key() -> Key {
0610: 0a 20 20 20 20 6c 65 74 20 6d 75 74 20 6b 65 79  .    let mut key
0620: 20 3d 20 5b 30 3b 20 4b 45 59 42 59 54 45 53 5d   = [0; KEYBYTES]
0630: 3b 0a 20 20 20 20 72 61 6e 64 6f 6d 62 79 74 65  ;.    randombyte
0640: 73 5f 69 6e 74 6f 28 26 6d 75 74 20 6b 65 79 29  s_into(&mut key)
0650: 3b 0a 20 20 20 20 4b 65 79 28 6b 65 79 29 0a 7d  ;.    Key(key).}
0660: 0a 0a 2f 2f 2f 20 60 67 65 6e 5f 6e 6f 6e 63 65  ../// `gen_nonce
0670: 28 29 60 20 72 61 6e 64 6f 6d 6c 79 20 67 65 6e  ()` randomly gen
0680: 65 72 61 74 65 73 20 61 20 6e 6f 6e 63 65 0a 2f  erates a nonce./
0690: 2f 2f 0a 2f 2f 2f 20 54 48 52 45 41 44 20 53 41  //./// THREAD SA
06a0: 46 45 54 59 3a 20 60 67 65 6e 5f 6b 65 79 28 29  FETY: `gen_key()
06b0: 60 20 69 73 20 74 68 72 65 61 64 2d 73 61 66 65  ` is thread-safe
06c0: 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 79   provided that y
06d0: 6f 75 20 68 61 76 65 0a 2f 2f 2f 20 63 61 6c 6c  ou have./// call
06e0: 65 64 20 60 72 75 73 74 5f 73 6f 64 69 75 6d 3a  ed `rust_sodium:
06f0: 3a 69 6e 69 74 28 29 60 20 6f 6e 63 65 20 62 65  :init()` once be
0700: 66 6f 72 65 20 75 73 69 6e 67 20 61 6e 79 20 6f  fore using any o
0710: 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2f 2f  ther function.//
0720: 2f 20 66 72 6f 6d 20 60 72 75 73 74 5f 73 6f 64  / from `rust_sod
0730: 69 75 6d 60 2e 0a 70 75 62 20 66 6e 20 67 65 6e  ium`..pub fn gen
0740: 5f 6e 6f 6e 63 65 28 29 20 2d 3e 20 4e 6f 6e 63  _nonce() -> Nonc
0750: 65 20 7b 0a 20 20 20 20 6c 65 74 20 6d 75 74 20  e {.    let mut 
0760: 6e 6f 6e 63 65 20 3d 20 5b 30 3b 20 4e 4f 4e 43  nonce = [0; NONC
0770: 45 42 59 54 45 53 5d 3b 0a 20 20 20 20 72 61 6e  EBYTES];.    ran
0780: 64 6f 6d 62 79 74 65 73 5f 69 6e 74 6f 28 26 6d  dombytes_into(&m
0790: 75 74 20 6e 6f 6e 63 65 29 3b 0a 20 20 20 20 4e  ut nonce);.    N
07a0: 6f 6e 63 65 28 6e 6f 6e 63 65 29 0a 7d 0a 0a 2f  once(nonce).}../
07b0: 2f 2f 20 60 73 65 61 6c 28 29 60 20 65 6e 63 72  // `seal()` encr
07c0: 79 70 74 73 20 61 6e 64 20 61 75 74 68 65 6e 74  ypts and authent
07d0: 69 63 61 74 65 73 20 61 20 6d 65 73 73 61 67 65  icates a message
07e0: 20 60 6d 60 20 75 73 69 6e 67 20 61 20 73 65 63   `m` using a sec
07f0: 72 65 74 20 6b 65 79 20 60 6b 60 20 61 6e 64 20  ret key `k` and 
0800: 61 0a 2f 2f 2f 20 6e 6f 6e 63 65 20 60 6e 60 2e  a./// nonce `n`.
0810: 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 63    It returns a c
0820: 69 70 68 65 72 74 65 78 74 20 60 63 60 2e 0a 70  iphertext `c`..p
0830: 75 62 20 66 6e 20 73 65 61 6c 28 6d 3a 20 26 5b  ub fn seal(m: &[
0840: 75 38 5d 2c 20 26 4e 6f 6e 63 65 28 72 65 66 20  u8], &Nonce(ref 
0850: 6e 29 3a 20 26 4e 6f 6e 63 65 2c 20 26 4b 65 79  n): &Nonce, &Key
0860: 28 72 65 66 20 6b 29 3a 20 26 4b 65 79 29 20 2d  (ref k): &Key) -
0870: 3e 20 56 65 63 3c 75 38 3e 20 7b 0a 20 20 20 20  > Vec<u8> {.    
0880: 6c 65 74 20 63 6c 65 6e 20 3d 20 6d 2e 6c 65 6e  let clen = m.len
0890: 28 29 20 2b 20 4d 41 43 42 59 54 45 53 3b 0a 20  () + MACBYTES;. 
08a0: 20 20 20 6c 65 74 20 6d 75 74 20 63 20 3d 20 56     let mut c = V
08b0: 65 63 3a 3a 77 69 74 68 5f 63 61 70 61 63 69 74  ec::with_capacit
08c0: 79 28 63 6c 65 6e 29 3b 0a 20 20 20 20 75 6e 73  y(clen);.    uns
08d0: 61 66 65 20 7b 0a 20 20 20 20 20 20 20 20 63 2e  afe {.        c.
08e0: 73 65 74 5f 6c 65 6e 28 63 6c 65 6e 29 3b 0a 20  set_len(clen);. 
08f0: 20 20 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 66         let _ = f
0900: 66 69 3a 3a 63 72 79 70 74 6f 5f 73 65 63 72 65  fi::crypto_secre
0910: 74 62 6f 78 5f 65 61 73 79 28 63 2e 61 73 5f 6d  tbox_easy(c.as_m
0920: 75 74 5f 70 74 72 28 29 2c 0a 20 20 20 20 20 20  ut_ptr(),.      
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 6d 2e 61 73 5f 70 74 72 28 29 2c       m.as_ptr(),
0960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 20 20 20 20 20 20 20 20 20 6d 2e 6c 65              m.le
0990: 6e 28 29 20 61 73 20 75 36 34 2c 0a 20 20 20 20  n() as u64,.    
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 20 20 20 20 20 20 6e 2e 61 73 5f 70 74 72 28         n.as_ptr(
09d0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 2e                k.
0a00: 61 73 5f 70 74 72 28 29 29 3b 0a 20 20 20 20 7d  as_ptr());.    }
0a10: 0a 20 20 20 20 63 0a 7d 0a 0a 2f 2f 2f 20 60 73  .    c.}../// `s
0a20: 65 61 6c 5f 64 65 74 61 63 68 65 64 28 29 60 20  eal_detached()` 
0a30: 65 6e 63 72 79 70 74 73 20 61 6e 64 20 61 75 74  encrypts and aut
0a40: 68 65 6e 74 69 63 61 74 65 73 20 61 20 6d 65 73  henticates a mes
0a50: 73 61 67 65 20 60 6d 60 20 75 73 69 6e 67 20 61  sage `m` using a
0a60: 20 73 65 63 72 65 74 20 6b 65 79 20 60 6b 60 20   secret key `k` 
0a70: 61 6e 64 20 61 20 6e 6f 6e 63 65 0a 2f 2f 2f 20  and a nonce./// 
0a80: 60 6e 60 2e 20 20 60 6d 60 20 69 73 20 65 6e 63  `n`.  `m` is enc
0a90: 72 79 70 74 65 64 20 69 6e 20 70 6c 61 63 65 2c  rypted in place,
0aa0: 20 73 6f 20 61 66 74 65 72 20 74 68 69 73 20 66   so after this f
0ab0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
0ac0: 69 74 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  it will contain 
0ad0: 74 68 65 20 63 69 70 68 65 72 74 65 78 74 2e 0a  the ciphertext..
0ae0: 2f 2f 2f 20 54 68 65 20 64 65 74 61 63 68 65 64  /// The detached
0af0: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
0b00: 74 61 67 20 69 73 20 72 65 74 75 72 6e 65 64 20  tag is returned 
0b10: 62 79 20 76 61 6c 75 65 2e 0a 70 75 62 20 66 6e  by value..pub fn
0b20: 20 73 65 61 6c 5f 64 65 74 61 63 68 65 64 28 6d   seal_detached(m
0b30: 3a 20 26 6d 75 74 20 5b 75 38 5d 2c 20 26 4e 6f  : &mut [u8], &No
0b40: 6e 63 65 28 72 65 66 20 6e 29 3a 20 26 4e 6f 6e  nce(ref n): &Non
0b50: 63 65 2c 20 26 4b 65 79 28 72 65 66 20 6b 29 3a  ce, &Key(ref k):
0b60: 20 26 4b 65 79 29 20 2d 3e 20 54 61 67 20 7b 0a   &Key) -> Tag {.
0b70: 20 20 20 20 6c 65 74 20 6d 75 74 20 74 61 67 20      let mut tag 
0b80: 3d 20 5b 30 3b 20 4d 41 43 42 59 54 45 53 5d 3b  = [0; MACBYTES];
0b90: 0a 20 20 20 20 75 6e 73 61 66 65 20 7b 0a 20 20  .    unsafe {.  
0ba0: 20 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 66 66        let _ = ff
0bb0: 69 3a 3a 63 72 79 70 74 6f 5f 73 65 63 72 65 74  i::crypto_secret
0bc0: 62 6f 78 5f 64 65 74 61 63 68 65 64 28 6d 2e 61  box_detached(m.a
0bd0: 73 5f 6d 75 74 5f 70 74 72 28 29 2c 0a 20 20 20  s_mut_ptr(),.   
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 67 2e              tag.
0c10: 61 73 5f 6d 75 74 5f 70 74 72 28 29 2c 0a 20 20  as_mut_ptr(),.  
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 2e 61               m.a
0c50: 73 5f 70 74 72 28 29 2c 0a 20 20 20 20 20 20 20  s_ptr(),.       
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 20 20 20 20 20 20 20 20 6d 2e 6c 65 6e 28 29 20          m.len() 
0c90: 61 73 20 75 36 34 2c 0a 20 20 20 20 20 20 20 20  as u64,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 20 20 20 20 6e 2e 61 73 5f 70 74 72 28         n.as_ptr(
0cd0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 6b 2e 61 73 5f 70 74 72 28 29 29 3b 0a 20    k.as_ptr());. 
0d10: 20 20 20 7d 3b 0a 20 20 20 20 54 61 67 28 74 61     };.    Tag(ta
0d20: 67 29 0a 7d 0a 0a 2f 2f 2f 20 60 6f 70 65 6e 28  g).}../// `open(
0d30: 29 60 20 76 65 72 69 66 69 65 73 20 61 6e 64 20  )` verifies and 
0d40: 64 65 63 72 79 70 74 73 20 61 20 63 69 70 68 65  decrypts a ciphe
0d50: 72 74 65 78 74 20 60 63 60 20 75 73 69 6e 67 20  rtext `c` using 
0d60: 61 20 73 65 63 72 65 74 20 6b 65 79 20 60 6b 60  a secret key `k`
0d70: 20 61 6e 64 20 61 20 6e 6f 6e 63 65 20 60 6e 60   and a nonce `n`
0d80: 2e 0a 2f 2f 2f 20 49 74 20 72 65 74 75 72 6e 73  ../// It returns
0d90: 20 61 20 70 6c 61 69 6e 74 65 78 74 20 60 4f 6b   a plaintext `Ok
0da0: 28 6d 29 60 2e 0a 2f 2f 2f 20 49 66 20 74 68 65  (m)`../// If the
0db0: 20 63 69 70 68 65 72 74 65 78 74 20 66 61 69 6c   ciphertext fail
0dc0: 73 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2c 20  s verification, 
0dd0: 60 6f 70 65 6e 28 29 60 20 72 65 74 75 72 6e 73  `open()` returns
0de0: 20 60 45 72 72 28 28 29 29 60 2e 0a 70 75 62 20   `Err(())`..pub 
0df0: 66 6e 20 6f 70 65 6e 28 63 3a 20 26 5b 75 38 5d  fn open(c: &[u8]
0e00: 2c 20 26 4e 6f 6e 63 65 28 72 65 66 20 6e 29 3a  , &Nonce(ref n):
0e10: 20 26 4e 6f 6e 63 65 2c 20 26 4b 65 79 28 72 65   &Nonce, &Key(re
0e20: 66 20 6b 29 3a 20 26 4b 65 79 29 20 2d 3e 20 52  f k): &Key) -> R
0e30: 65 73 75 6c 74 3c 56 65 63 3c 75 38 3e 2c 20 28  esult<Vec<u8>, (
0e40: 29 3e 20 7b 0a 20 20 20 20 69 66 20 63 2e 6c 65  )> {.    if c.le
0e50: 6e 28 29 20 3c 20 4d 41 43 42 59 54 45 53 20 7b  n() < MACBYTES {
0e60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0e70: 45 72 72 28 28 29 29 3b 0a 20 20 20 20 7d 0a 20  Err(());.    }. 
0e80: 20 20 20 6c 65 74 20 6d 6c 65 6e 20 3d 20 63 2e     let mlen = c.
0e90: 6c 65 6e 28 29 20 2d 20 4d 41 43 42 59 54 45 53  len() - MACBYTES
0ea0: 3b 0a 20 20 20 20 6c 65 74 20 6d 75 74 20 6d 20  ;.    let mut m 
0eb0: 3d 20 56 65 63 3a 3a 77 69 74 68 5f 63 61 70 61  = Vec::with_capa
0ec0: 63 69 74 79 28 6d 6c 65 6e 29 3b 0a 20 20 20 20  city(mlen);.    
0ed0: 6c 65 74 20 72 65 74 20 3d 20 75 6e 73 61 66 65  let ret = unsafe
0ee0: 20 7b 0a 20 20 20 20 20 20 20 20 6d 2e 73 65 74   {.        m.set
0ef0: 5f 6c 65 6e 28 6d 6c 65 6e 29 3b 0a 20 20 20 20  _len(mlen);.    
0f00: 20 20 20 20 66 66 69 3a 3a 63 72 79 70 74 6f 5f      ffi::crypto_
0f10: 73 65 63 72 65 74 62 6f 78 5f 6f 70 65 6e 5f 65  secretbox_open_e
0f20: 61 73 79 28 6d 2e 61 73 5f 6d 75 74 5f 70 74 72  asy(m.as_mut_ptr
0f30: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 63 2e 61 73              c.as
0f60: 5f 70 74 72 28 29 2c 0a 20 20 20 20 20 20 20 20  _ptr(),.        
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 63 2e 6c 65 6e 28 29 20 61 73 20 75 36 34 2c 0a  c.len() as u64,.
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 20 6e 2e 61 73 5f 70 74 72          n.as_ptr
0fd0: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 6b 2e 61 73              k.as
1000: 5f 70 74 72 28 29 29 0a 20 20 20 20 7d 3b 0a 20  _ptr()).    };. 
1010: 20 20 20 69 66 20 72 65 74 20 3d 3d 20 30 20 7b     if ret == 0 {
1020: 20 4f 6b 28 6d 29 20 7d 20 65 6c 73 65 20 7b 20   Ok(m) } else { 
1030: 45 72 72 28 28 29 29 20 7d 0a 7d 0a 0a 2f 2f 2f  Err(()) }.}..///
1040: 20 60 6f 70 65 6e 5f 64 65 74 61 63 68 65 64 28   `open_detached(
1050: 29 60 20 76 65 72 69 66 69 65 73 20 61 6e 64 20  )` verifies and 
1060: 64 65 63 72 79 70 74 73 20 61 20 63 69 70 68 65  decrypts a ciphe
1070: 72 74 65 78 74 20 60 63 60 20 61 6e 64 20 61 6e  rtext `c` and an
1080: 64 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  d authentication
1090: 20 74 61 67 20 60 74 61 67 60 2c 0a 2f 2f 2f 20   tag `tag`,./// 
10a0: 75 73 69 6e 67 20 61 20 73 65 63 72 65 74 20 6b  using a secret k
10b0: 65 79 20 60 6b 60 20 61 6e 64 20 61 20 6e 6f 6e  ey `k` and a non
10c0: 63 65 20 60 6e 60 2e 20 60 63 60 20 69 73 20 64  ce `n`. `c` is d
10d0: 65 63 72 79 70 74 65 64 20 69 6e 20 70 6c 61 63  ecrypted in plac
10e0: 65 2c 20 73 6f 20 69 66 20 74 68 69 73 20 66 75  e, so if this fu
10f0: 6e 63 74 69 6f 6e 20 69 73 0a 2f 2f 2f 20 73 75  nction is./// su
1100: 63 63 65 73 73 66 75 6c 20 69 74 20 77 69 6c 6c  ccessful it will
1110: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 6c 61   contain the pla
1120: 69 6e 74 65 78 74 2e 20 49 66 20 74 68 65 20 63  intext. If the c
1130: 69 70 68 65 72 74 65 78 74 20 66 61 69 6c 73 20  iphertext fails 
1140: 76 65 72 69 66 69 63 61 74 69 6f 6e 2c 0a 2f 2f  verification,.//
1150: 2f 20 60 6f 70 65 6e 5f 64 65 74 61 63 68 65 64  / `open_detached
1160: 28 29 60 20 72 65 74 75 72 6e 73 20 60 45 72 72  ()` returns `Err
1170: 28 28 29 29 60 2c 20 61 6e 64 20 74 68 65 20 63  (())`, and the c
1180: 69 70 68 65 72 74 65 78 74 20 69 73 20 6e 6f 74  iphertext is not
1190: 20 6d 6f 64 69 66 69 65 64 2e 0a 70 75 62 20 66   modified..pub f
11a0: 6e 20 6f 70 65 6e 5f 64 65 74 61 63 68 65 64 28  n open_detached(
11b0: 63 3a 20 26 6d 75 74 20 5b 75 38 5d 2c 0a 20 20  c: &mut [u8],.  
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 20 20 20 74 61 67 3a 20 26 54 61 67 2c 0a 20 20     tag: &Tag,.  
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 20 20 20 26 4e 6f 6e 63 65 28 72 65 66 20 6e 29     &Nonce(ref n)
1200: 3a 20 26 4e 6f 6e 63 65 2c 0a 20 20 20 20 20 20  : &Nonce,.      
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1220: 4b 65 79 28 72 65 66 20 6b 29 3a 20 26 4b 65 79  Key(ref k): &Key
1230: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1240: 20 20 20 20 20 20 20 2d 3e 20 52 65 73 75 6c 74         -> Result
1250: 3c 28 29 2c 20 28 29 3e 20 7b 0a 20 20 20 20 6c  <(), ()> {.    l
1260: 65 74 20 72 65 74 20 3d 20 75 6e 73 61 66 65 20  et ret = unsafe 
1270: 7b 0a 20 20 20 20 20 20 20 20 66 66 69 3a 3a 63  {.        ffi::c
1280: 72 79 70 74 6f 5f 73 65 63 72 65 74 62 6f 78 5f  rypto_secretbox_
1290: 6f 70 65 6e 5f 64 65 74 61 63 68 65 64 28 63 2e  open_detached(c.
12a0: 61 73 5f 6d 75 74 5f 70 74 72 28 29 2c 0a 20 20  as_mut_ptr(),.  
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 63 2e 61 73 5f 70            c.as_p
12e0: 74 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  tr(),.          
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 74 61 67 2e 30 2e 61 73 5f 70 74 72 28 29    tag.0.as_ptr()
1320: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 2e                c.
1350: 6c 65 6e 28 29 20 61 73 20 75 36 34 2c 0a 20 20  len() as u64,.  
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 20 20 20 20 20 6e 2e 61 73 5f 70            n.as_p
1390: 74 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  tr(),.          
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 6b 2e 61 73 5f 70 74 72 28 29 29 0a 20 20    k.as_ptr()).  
13d0: 20 20 7d 3b 0a 20 20 20 20 69 66 20 72 65 74 20    };.    if ret 
13e0: 3d 3d 20 30 20 7b 20 4f 6b 28 28 29 29 20 7d 20  == 0 { Ok(()) } 
13f0: 65 6c 73 65 20 7b 20 45 72 72 28 28 29 29 20 7d  else { Err(()) }
1400: 0a 7d 0a 0a 23 5b 63 66 67 28 74 65 73 74 29 5d  .}..#[cfg(test)]
1410: 0a 6d 6f 64 20 74 65 73 74 20 7b 0a 20 20 20 20  .mod test {.    
1420: 75 73 65 20 73 75 70 65 72 3a 3a 2a 3b 0a 0a 20  use super::*;.. 
1430: 20 20 20 23 5b 74 65 73 74 5d 0a 20 20 20 20 66     #[test].    f
1440: 6e 20 74 65 73 74 5f 73 65 61 6c 5f 6f 70 65 6e  n test_seal_open
1450: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 75 73 65  () {.        use
1460: 20 72 61 6e 64 6f 6d 62 79 74 65 73 3a 3a 72 61   randombytes::ra
1470: 6e 64 6f 6d 62 79 74 65 73 3b 0a 20 20 20 20 20  ndombytes;.     
1480: 20 20 20 61 73 73 65 72 74 21 28 3a 3a 69 6e 69     assert!(::ini
1490: 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  t());.        fo
14a0: 72 20 69 20 69 6e 20 30 2e 2e 32 35 36 75 73 69  r i in 0..256usi
14b0: 7a 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ze {.           
14c0: 20 6c 65 74 20 6b 20 3d 20 67 65 6e 5f 6b 65 79   let k = gen_key
14d0: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
14e0: 6c 65 74 20 6d 20 3d 20 72 61 6e 64 6f 6d 62 79  let m = randomby
14f0: 74 65 73 28 69 29 3b 0a 20 20 20 20 20 20 20 20  tes(i);.        
1500: 20 20 20 20 6c 65 74 20 6e 20 3d 20 67 65 6e 5f      let n = gen_
1510: 6e 6f 6e 63 65 28 29 3b 0a 20 20 20 20 20 20 20  nonce();.       
1520: 20 20 20 20 20 6c 65 74 20 63 20 3d 20 73 65 61       let c = sea
1530: 6c 28 26 6d 2c 20 26 6e 2c 20 26 6b 29 3b 0a 20  l(&m, &n, &k);. 
1540: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6f             let o
1550: 70 65 6e 65 64 20 3d 20 6f 70 65 6e 28 26 63 2c  pened = open(&c,
1560: 20 26 6e 2c 20 26 6b 29 3b 0a 20 20 20 20 20 20   &n, &k);.      
1570: 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21        assert_eq!
1580: 28 4f 6b 28 6d 29 2c 20 6f 70 65 6e 65 64 29 3b  (Ok(m), opened);
1590: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
15a0: 0a 0a 20 20 20 20 23 5b 74 65 73 74 5d 0a 20 20  ..    #[test].  
15b0: 20 20 23 5b 63 66 67 5f 61 74 74 72 28 66 65 61    #[cfg_attr(fea
15c0: 74 75 72 65 3d 22 63 61 72 67 6f 2d 63 6c 69 70  ture="cargo-clip
15d0: 70 79 22 2c 20 61 6c 6c 6f 77 28 6e 65 65 64 6c  py", allow(needl
15e0: 65 73 73 5f 72 61 6e 67 65 5f 6c 6f 6f 70 29 29  ess_range_loop))
15f0: 5d 0a 20 20 20 20 66 6e 20 74 65 73 74 5f 73 65  ].    fn test_se
1600: 61 6c 5f 6f 70 65 6e 5f 74 61 6d 70 65 72 28 29  al_open_tamper()
1610: 20 7b 0a 20 20 20 20 20 20 20 20 75 73 65 20 72   {.        use r
1620: 61 6e 64 6f 6d 62 79 74 65 73 3a 3a 72 61 6e 64  andombytes::rand
1630: 6f 6d 62 79 74 65 73 3b 0a 20 20 20 20 20 20 20  ombytes;.       
1640: 20 66 6f 72 20 69 20 69 6e 20 30 2e 2e 33 32 75   for i in 0..32u
1650: 73 69 7a 65 20 7b 0a 20 20 20 20 20 20 20 20 20  size {.         
1660: 20 20 20 6c 65 74 20 6b 20 3d 20 67 65 6e 5f 6b     let k = gen_k
1670: 65 79 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey();.          
1680: 20 20 6c 65 74 20 6d 20 3d 20 72 61 6e 64 6f 6d    let m = random
1690: 62 79 74 65 73 28 69 29 3b 0a 20 20 20 20 20 20  bytes(i);.      
16a0: 20 20 20 20 20 20 6c 65 74 20 6e 20 3d 20 67 65        let n = ge
16b0: 6e 5f 6e 6f 6e 63 65 28 29 3b 0a 20 20 20 20 20  n_nonce();.     
16c0: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 63         let mut c
16d0: 20 3d 20 73 65 61 6c 28 26 6d 2c 20 26 6e 2c 20   = seal(&m, &n, 
16e0: 26 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &k);.           
16f0: 20 66 6f 72 20 69 20 69 6e 20 30 2e 2e 63 2e 6c   for i in 0..c.l
1700: 65 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20  en() {.         
1710: 20 20 20 20 20 20 20 63 5b 69 5d 20 5e 3d 20 30         c[i] ^= 0
1720: 78 32 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  x20;.           
1730: 20 20 20 20 20 2f 2f 20 54 65 73 74 20 74 68 65       // Test the
1740: 20 63 6f 6d 62 69 6e 65 64 20 6d 6f 64 65 2e 0a   combined mode..
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 61 73 73 65 72 74 5f 65 71 21 28 45 72 72 28 28  assert_eq!(Err((
1770: 29 29 2c 20 6f 70 65 6e 28 26 63 2c 20 26 6e 2c  )), open(&c, &n,
1780: 20 26 6b 29 29 3b 0a 20 20 20 20 20 20 20 20 20   &k));.         
1790: 20 20 20 20 20 20 20 2f 2f 20 54 65 73 74 20 74         // Test t
17a0: 68 65 20 64 65 74 61 63 68 65 64 20 6d 6f 64 65  he detached mode
17b0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17c0: 20 20 6c 65 74 20 74 61 67 20 3d 20 54 61 67 3a    let tag = Tag:
17d0: 3a 66 72 6f 6d 5f 73 6c 69 63 65 28 26 63 5b 2e  :from_slice(&c[.
17e0: 2e 4d 41 43 42 59 54 45 53 5d 29 2e 75 6e 77 72  .MACBYTES]).unwr
17f0: 61 70 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ap();.          
1800: 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21        assert_eq!
1810: 28 45 72 72 28 28 29 29 2c 20 6f 70 65 6e 5f 64  (Err(()), open_d
1820: 65 74 61 63 68 65 64 28 26 6d 75 74 20 63 5b 4d  etached(&mut c[M
1830: 41 43 42 59 54 45 53 2e 2e 5d 2c 20 26 74 61 67  ACBYTES..], &tag
1840: 2c 20 26 6e 2c 20 26 6b 29 29 3b 0a 20 20 20 20  , &n, &k));.    
1850: 20 20 20 20 20 20 20 20 20 20 20 20 63 5b 69 5d              c[i]
1860: 20 5e 3d 20 30 78 32 30 3b 0a 20 20 20 20 20 20   ^= 0x20;.      
1870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1880: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 74  }.    }..    #[t
1890: 65 73 74 5d 0a 20 20 20 20 66 6e 20 74 65 73 74  est].    fn test
18a0: 5f 73 65 61 6c 5f 6f 70 65 6e 5f 64 65 74 61 63  _seal_open_detac
18b0: 68 65 64 28 29 20 7b 0a 20 20 20 20 20 20 20 20  hed() {.        
18c0: 75 73 65 20 72 61 6e 64 6f 6d 62 79 74 65 73 3a  use randombytes:
18d0: 3a 72 61 6e 64 6f 6d 62 79 74 65 73 3b 0a 20 20  :randombytes;.  
18e0: 20 20 20 20 20 20 66 6f 72 20 69 20 69 6e 20 30        for i in 0
18f0: 2e 2e 32 35 36 75 73 69 7a 65 20 7b 0a 20 20 20  ..256usize {.   
1900: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6b 20 3d           let k =
1910: 20 67 65 6e 5f 6b 65 79 28 29 3b 0a 20 20 20 20   gen_key();.    
1920: 20 20 20 20 20 20 20 20 6c 65 74 20 6d 20 3d 20          let m = 
1930: 72 61 6e 64 6f 6d 62 79 74 65 73 28 69 29 3b 0a  randombytes(i);.
1940: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
1950: 6e 20 3d 20 67 65 6e 5f 6e 6f 6e 63 65 28 29 3b  n = gen_nonce();
1960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
1970: 20 6d 75 74 20 62 75 66 20 3d 20 6d 2e 63 6c 6f   mut buf = m.clo
1980: 6e 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ne();.          
1990: 20 20 6c 65 74 20 74 61 67 20 3d 20 73 65 61 6c    let tag = seal
19a0: 5f 64 65 74 61 63 68 65 64 28 26 6d 75 74 20 62  _detached(&mut b
19b0: 75 66 2c 20 26 6e 2c 20 26 6b 29 3b 0a 20 20 20  uf, &n, &k);.   
19c0: 20 20 20 20 20 20 20 20 20 6f 70 65 6e 5f 64 65           open_de
19d0: 74 61 63 68 65 64 28 26 6d 75 74 20 62 75 66 2c  tached(&mut buf,
19e0: 20 26 74 61 67 2c 20 26 6e 2c 20 26 6b 29 2e 75   &tag, &n, &k).u
19f0: 6e 77 72 61 70 28 29 3b 0a 20 20 20 20 20 20 20  nwrap();.       
1a00: 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28       assert_eq!(
1a10: 6d 2c 20 62 75 66 29 3b 0a 20 20 20 20 20 20 20  m, buf);.       
1a20: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b   }.    }..    #[
1a30: 74 65 73 74 5d 0a 20 20 20 20 66 6e 20 74 65 73  test].    fn tes
1a40: 74 5f 73 65 61 6c 5f 63 6f 6d 62 69 6e 65 64 5f  t_seal_combined_
1a50: 74 68 65 6e 5f 6f 70 65 6e 5f 64 65 74 61 63 68  then_open_detach
1a60: 65 64 28 29 20 7b 0a 20 20 20 20 20 20 20 20 75  ed() {.        u
1a70: 73 65 20 72 61 6e 64 6f 6d 62 79 74 65 73 3a 3a  se randombytes::
1a80: 72 61 6e 64 6f 6d 62 79 74 65 73 3b 0a 20 20 20  randombytes;.   
1a90: 20 20 20 20 20 66 6f 72 20 69 20 69 6e 20 30 2e       for i in 0.
1aa0: 2e 32 35 36 75 73 69 7a 65 20 7b 0a 20 20 20 20  .256usize {.    
1ab0: 20 20 20 20 20 20 20 20 6c 65 74 20 6b 20 3d 20          let k = 
1ac0: 67 65 6e 5f 6b 65 79 28 29 3b 0a 20 20 20 20 20  gen_key();.     
1ad0: 20 20 20 20 20 20 20 6c 65 74 20 6d 20 3d 20 72         let m = r
1ae0: 61 6e 64 6f 6d 62 79 74 65 73 28 69 29 3b 0a 20  andombytes(i);. 
1af0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e             let n
1b00: 20 3d 20 67 65 6e 5f 6e 6f 6e 63 65 28 29 3b 0a   = gen_nonce();.
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
1b20: 6d 75 74 20 63 20 3d 20 73 65 61 6c 28 26 6d 2c  mut c = seal(&m,
1b30: 20 26 6e 2c 20 26 6b 29 3b 0a 20 20 20 20 20 20   &n, &k);.      
1b40: 20 20 20 20 20 20 6c 65 74 20 74 61 67 20 3d 20        let tag = 
1b50: 54 61 67 3a 3a 66 72 6f 6d 5f 73 6c 69 63 65 28  Tag::from_slice(
1b60: 26 63 5b 2e 2e 4d 41 43 42 59 54 45 53 5d 29 2e  &c[..MACBYTES]).
1b70: 75 6e 77 72 61 70 28 29 3b 0a 20 20 20 20 20 20  unwrap();.      
1b80: 20 20 20 20 20 20 6c 65 74 20 62 75 66 20 3d 20        let buf = 
1b90: 26 6d 75 74 20 63 5b 4d 41 43 42 59 54 45 53 2e  &mut c[MACBYTES.
1ba0: 2e 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  .];.            
1bb0: 6f 70 65 6e 5f 64 65 74 61 63 68 65 64 28 62 75  open_detached(bu
1bc0: 66 2c 20 26 74 61 67 2c 20 26 6e 2c 20 26 6b 29  f, &tag, &n, &k)
1bd0: 2e 75 6e 77 72 61 70 28 29 3b 0a 20 20 20 20 20  .unwrap();.     
1be0: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71         assert_eq
1bf0: 21 28 62 75 66 2c 20 26 2a 6d 29 3b 0a 20 20 20  !(buf, &*m);.   
1c00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1c10: 20 20 23 5b 74 65 73 74 5d 0a 20 20 20 20 66 6e    #[test].    fn
1c20: 20 74 65 73 74 5f 73 65 61 6c 5f 64 65 74 61 63   test_seal_detac
1c30: 68 65 64 5f 74 68 65 6e 5f 6f 70 65 6e 5f 63 6f  hed_then_open_co
1c40: 6d 62 69 6e 65 64 28 29 20 7b 0a 20 20 20 20 20  mbined() {.     
1c50: 20 20 20 75 73 65 20 72 61 6e 64 6f 6d 62 79 74     use randombyt
1c60: 65 73 3a 3a 72 61 6e 64 6f 6d 62 79 74 65 73 3b  es::randombytes;
1c70: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 69 20 69  .        for i i
1c80: 6e 20 30 2e 2e 32 35 36 75 73 69 7a 65 20 7b 0a  n 0..256usize {.
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
1ca0: 6b 20 3d 20 67 65 6e 5f 6b 65 79 28 29 3b 0a 20  k = gen_key();. 
1cb0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d             let m
1cc0: 20 3d 20 72 61 6e 64 6f 6d 62 79 74 65 73 28 69   = randombytes(i
1cd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  );.            l
1ce0: 65 74 20 6e 20 3d 20 67 65 6e 5f 6e 6f 6e 63 65  et n = gen_nonce
1cf0: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
1d00: 6c 65 74 20 6d 75 74 20 62 75 66 20 3d 20 76 65  let mut buf = ve
1d10: 63 21 5b 30 3b 20 4d 41 43 42 59 54 45 53 5d 3b  c![0; MACBYTES];
1d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66  .            buf
1d30: 2e 65 78 74 65 6e 64 5f 66 72 6f 6d 5f 73 6c 69  .extend_from_sli
1d40: 63 65 28 26 6d 29 3b 0a 20 20 20 20 20 20 20 20  ce(&m);.        
1d50: 20 20 20 20 6c 65 74 20 74 61 67 20 3d 20 73 65      let tag = se
1d60: 61 6c 5f 64 65 74 61 63 68 65 64 28 26 6d 75 74  al_detached(&mut
1d70: 20 62 75 66 5b 4d 41 43 42 59 54 45 53 2e 2e 5d   buf[MACBYTES..]
1d80: 2c 20 26 6e 2c 20 26 6b 29 3b 0a 20 20 20 20 20  , &n, &k);.     
1d90: 20 20 20 20 20 20 20 62 75 66 5b 2e 2e 4d 41 43         buf[..MAC
1da0: 42 59 54 45 53 5d 2e 63 6f 70 79 5f 66 72 6f 6d  BYTES].copy_from
1db0: 5f 73 6c 69 63 65 28 26 74 61 67 2e 30 5b 2e 2e  _slice(&tag.0[..
1dc0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
1dd0: 6c 65 74 20 6f 70 65 6e 65 64 20 3d 20 6f 70 65  let opened = ope
1de0: 6e 28 26 62 75 66 2c 20 26 6e 2c 20 26 6b 29 3b  n(&buf, &n, &k);
1df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1e00: 65 72 74 5f 65 71 21 28 4f 6b 28 6d 29 2c 20 6f  ert_eq!(Ok(m), o
1e10: 70 65 6e 65 64 29 3b 0a 20 20 20 20 20 20 20 20  pened);.        
1e20: 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 23 5b  }.    }...    #[
1e30: 74 65 73 74 5d 0a 20 20 20 20 23 5b 63 66 67 5f  test].    #[cfg_
1e40: 61 74 74 72 28 66 65 61 74 75 72 65 3d 22 63 61  attr(feature="ca
1e50: 72 67 6f 2d 63 6c 69 70 70 79 22 2c 20 61 6c 6c  rgo-clippy", all
1e60: 6f 77 28 6e 65 65 64 6c 65 73 73 5f 72 61 6e 67  ow(needless_rang
1e70: 65 5f 6c 6f 6f 70 29 29 5d 0a 20 20 20 20 66 6e  e_loop))].    fn
1e80: 20 74 65 73 74 5f 73 65 61 6c 5f 6f 70 65 6e 5f   test_seal_open_
1e90: 64 65 74 61 63 68 65 64 5f 74 61 6d 70 65 72 28  detached_tamper(
1ea0: 29 20 7b 0a 20 20 20 20 20 20 20 20 75 73 65 20  ) {.        use 
1eb0: 72 61 6e 64 6f 6d 62 79 74 65 73 3a 3a 72 61 6e  randombytes::ran
1ec0: 64 6f 6d 62 79 74 65 73 3b 0a 20 20 20 20 20 20  dombytes;.      
1ed0: 20 20 61 73 73 65 72 74 21 28 3a 3a 69 6e 69 74    assert!(::init
1ee0: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ());.        for
1ef0: 20 69 20 69 6e 20 30 2e 2e 33 32 75 73 69 7a 65   i in 0..32usize
1f00: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c   {.            l
1f10: 65 74 20 6b 20 3d 20 67 65 6e 5f 6b 65 79 28 29  et k = gen_key()
1f20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  ;.            le
1f30: 74 20 6d 75 74 20 6d 20 3d 20 72 61 6e 64 6f 6d  t mut m = random
1f40: 62 79 74 65 73 28 69 29 3b 0a 20 20 20 20 20 20  bytes(i);.      
1f50: 20 20 20 20 20 20 6c 65 74 20 6e 20 3d 20 67 65        let n = ge
1f60: 6e 5f 6e 6f 6e 63 65 28 29 3b 0a 20 20 20 20 20  n_nonce();.     
1f70: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 74         let mut t
1f80: 61 67 20 3d 20 73 65 61 6c 5f 64 65 74 61 63 68  ag = seal_detach
1f90: 65 64 28 26 6d 75 74 20 6d 2c 20 26 6e 2c 20 26  ed(&mut m, &n, &
1fa0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
1fb0: 66 6f 72 20 6a 20 69 6e 20 30 2e 2e 6d 2e 6c 65  for j in 0..m.le
1fc0: 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n() {.          
1fd0: 20 20 20 20 20 20 6d 5b 6a 5d 20 5e 3d 20 30 78        m[j] ^= 0x
1fe0: 32 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  20;.            
1ff0: 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 45      assert_eq!(E
2000: 72 72 28 28 29 29 2c 20 6f 70 65 6e 5f 64 65 74  rr(()), open_det
2010: 61 63 68 65 64 28 26 6d 75 74 20 6d 2c 20 26 74  ached(&mut m, &t
2020: 61 67 2c 20 26 6e 2c 20 26 6b 29 29 3b 0a 20 20  ag, &n, &k));.  
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 5b                m[
2040: 6a 5d 20 5e 3d 20 30 78 32 30 3b 0a 20 20 20 20  j] ^= 0x20;.    
2050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2060: 20 20 20 20 20 20 66 6f 72 20 6a 20 69 6e 20 30        for j in 0
2070: 2e 2e 74 61 67 2e 30 2e 6c 65 6e 28 29 20 7b 0a  ..tag.0.len() {.
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 74 61 67 2e 30 5b 6a 5d 20 5e 3d 20 30 78 32 30  tag.0[j] ^= 0x20
20a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20b0: 20 20 61 73 73 65 72 74 5f 65 71 21 28 45 72 72    assert_eq!(Err
20c0: 28 28 29 29 2c 20 6f 70 65 6e 5f 64 65 74 61 63  (()), open_detac
20d0: 68 65 64 28 26 6d 75 74 20 6d 2c 20 26 74 61 67  hed(&mut m, &tag
20e0: 2c 20 26 6e 2c 20 26 6b 29 29 3b 0a 20 20 20 20  , &n, &k));.    
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 67 2e              tag.
2100: 30 5b 6a 5d 20 5e 3d 20 30 78 32 30 3b 0a 20 20  0[j] ^= 0x20;.  
2110: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2120: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2130: 20 23 5b 74 65 73 74 5d 0a 20 20 20 20 66 6e 20   #[test].    fn 
2140: 74 65 73 74 5f 6f 70 65 6e 5f 64 65 74 61 63 68  test_open_detach
2150: 65 64 5f 66 61 69 6c 75 72 65 5f 64 6f 65 73 5f  ed_failure_does_
2160: 6e 6f 74 5f 6d 6f 64 69 66 79 28 29 20 7b 0a 20  not_modify() {. 
2170: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 62         let mut b
2180: 75 66 20 3d 20 62 22 68 65 6c 6c 6f 20 77 6f 72  uf = b"hello wor
2190: 6c 64 22 2e 74 6f 5f 76 65 63 28 29 3b 0a 20 20  ld".to_vec();.  
21a0: 20 20 20 20 20 20 6c 65 74 20 6b 20 3d 20 67 65        let k = ge
21b0: 6e 5f 6b 65 79 28 29 3b 0a 20 20 20 20 20 20 20  n_key();.       
21c0: 20 6c 65 74 20 6e 20 3d 20 67 65 6e 5f 6e 6f 6e   let n = gen_non
21d0: 63 65 28 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  ce();.        le
21e0: 74 20 74 61 67 20 3d 20 73 65 61 6c 5f 64 65 74  t tag = seal_det
21f0: 61 63 68 65 64 28 26 6d 75 74 20 62 75 66 2c 20  ached(&mut buf, 
2200: 26 6e 2c 20 26 6b 29 3b 0a 20 20 20 20 20 20 20  &n, &k);.       
2210: 20 2f 2f 20 46 6c 69 70 20 74 68 65 20 6c 61 73   // Flip the las
2220: 74 20 62 69 74 20 69 6e 20 74 68 65 20 63 69 70  t bit in the cip
2230: 68 65 72 74 65 78 74 2c 20 74 6f 20 62 72 65 61  hertext, to brea
2240: 6b 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  k authentication
2250: 2e 0a 20 20 20 20 20 20 20 20 2a 62 75 66 2e 6c  ..        *buf.l
2260: 61 73 74 5f 6d 75 74 28 29 2e 75 6e 77 72 61 70  ast_mut().unwrap
2270: 28 29 20 5e 3d 20 31 3b 0a 20 20 20 20 20 20 20  () ^= 1;.       
2280: 20 2f 2f 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   // Make a copy 
2290: 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70  that we can comp
22a0: 61 72 65 20 61 67 61 69 6e 73 74 20 61 66 74 65  are against afte
22b0: 72 20 74 68 65 20 66 61 69 6c 75 72 65 20 62 65  r the failure be
22c0: 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 6c 65 74  low..        let
22d0: 20 63 6f 70 79 20 3d 20 62 75 66 2e 63 6c 6f 6e   copy = buf.clon
22e0: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20  e();.        // 
22f0: 4e 6f 77 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  Now try to open 
2300: 74 68 65 20 6d 65 73 73 61 67 65 2e 20 54 68 69  the message. Thi
2310: 73 20 77 69 6c 6c 20 66 61 69 6c 2e 0a 20 20 20  s will fail..   
2320: 20 20 20 20 20 6c 65 74 20 66 61 69 6c 75 72 65       let failure
2330: 20 3d 20 6f 70 65 6e 5f 64 65 74 61 63 68 65 64   = open_detached
2340: 28 26 6d 75 74 20 62 75 66 2c 20 26 74 61 67 2c  (&mut buf, &tag,
2350: 20 26 6e 2c 20 26 6b 29 3b 0a 20 20 20 20 20 20   &n, &k);.      
2360: 20 20 61 73 73 65 72 74 21 28 66 61 69 6c 75 72    assert!(failur
2370: 65 2e 69 73 5f 65 72 72 28 29 29 3b 0a 20 20 20  e.is_err());.   
2380: 20 20 20 20 20 2f 2f 20 4d 61 6b 65 20 73 75 72       // Make sur
2390: 65 20 74 68 65 20 69 6e 70 75 74 20 68 61 73 6e  e the input hasn
23a0: 27 74 20 62 65 65 6e 20 74 6f 75 63 68 65 64 2e  't been touched.
23b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f  .        assert_
23c0: 65 71 21 28 62 75 66 2c 0a 20 20 20 20 20 20 20  eq!(buf,.       
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 70 79              copy
23e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23f0: 20 20 20 20 20 22 69 6e 70 75 74 20 73 68 6f 75       "input shou
2400: 6c 64 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  ld not be modifi
2410: 65 64 20 69 66 20 61 75 74 68 65 6e 74 69 63 61  ed if authentica
2420: 74 69 6f 6e 20 66 61 69 6c 73 22 29 3b 0a 20 20  tion fails");.  
2430: 20 20 7d 0a 0a 20 20 20 20 23 5b 74 65 73 74 5d    }..    #[test]
2440: 0a 20 20 20 20 66 6e 20 74 65 73 74 5f 76 65 63  .    fn test_vec
2450: 74 6f 72 5f 31 28 29 20 7b 0a 20 20 20 20 20 20  tor_1() {.      
2460: 20 20 61 73 73 65 72 74 21 28 3a 3a 69 6e 69 74    assert!(::init
2470: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74  ());.        let
2480: 20 66 69 72 73 74 6b 65 79 20 3d 20 4b 65 79 28   firstkey = Key(
2490: 5b 30 78 31 62 2c 20 30 78 32 37 2c 20 30 78 35  [0x1b, 0x27, 0x5
24a0: 35 2c 20 30 78 36 34 2c 20 30 78 37 33 2c 20 30  5, 0x64, 0x73, 0
24b0: 78 65 39 2c 20 30 78 38 35 2c 20 30 78 64 34 2c  xe9, 0x85, 0xd4,
24c0: 20 30 78 36 32 2c 20 30 78 63 64 2c 20 30 78 35   0x62, 0xcd, 0x5
24d0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
24f0: 78 31 39 2c 20 30 78 37 61 2c 20 30 78 39 61 2c  x19, 0x7a, 0x9a,
2500: 20 30 78 34 36 2c 20 30 78 63 37 2c 20 30 78 36   0x46, 0xc7, 0x6
2510: 30 2c 20 30 78 30 39 2c 20 30 78 35 34 2c 20 30  0, 0x09, 0x54, 0
2520: 78 39 65 2c 20 30 78 61 63 2c 20 30 78 36 34 2c  x9e, 0xac, 0x64,
2530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 37               0x7
2550: 34 2c 20 30 78 66 32 2c 20 30 78 30 36 2c 20 30  4, 0xf2, 0x06, 0
2560: 78 63 34 2c 20 30 78 65 65 2c 20 30 78 30 38 2c  xc4, 0xee, 0x08,
2570: 20 30 78 34 34 2c 20 30 78 66 36 2c 20 30 78 38   0x44, 0xf6, 0x8
2580: 33 2c 20 30 78 38 39 5d 29 3b 0a 20 20 20 20 20  3, 0x89]);.     
2590: 20 20 20 6c 65 74 20 6e 6f 6e 63 65 20 3d 20 4e     let nonce = N
25a0: 6f 6e 63 65 28 5b 30 78 36 39 2c 20 30 78 36 39  once([0x69, 0x69
25b0: 2c 20 30 78 36 65 2c 20 30 78 65 39 2c 20 30 78  , 0x6e, 0xe9, 0x
25c0: 35 35 2c 20 30 78 62 36 2c 20 30 78 32 62 2c 20  55, 0xb6, 0x2b, 
25d0: 30 78 37 33 2c 20 30 78 63 64 2c 20 30 78 36 32  0x73, 0xcd, 0x62
25e0: 2c 20 30 78 62 64 2c 0a 20 20 20 20 20 20 20 20  , 0xbd,.        
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 30 78 61 38 2c 20 30 78 37 35 2c 20 30     0xa8, 0x75, 0
2610: 78 66 63 2c 20 30 78 37 33 2c 20 30 78 64 36 2c  xfc, 0x73, 0xd6,
2620: 20 30 78 38 32 2c 20 30 78 31 39 2c 20 30 78 65   0x82, 0x19, 0xe
2630: 30 2c 20 30 78 30 33 2c 20 30 78 36 62 2c 20 30  0, 0x03, 0x6b, 0
2640: 78 37 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x7a,.           
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 30 78 30 62 2c 20 30 78 33 37 5d 29 3b 0a 20 20  0x0b, 0x37]);.  
2670: 20 20 20 20 20 20 6c 65 74 20 6d 20 3d 20 76 65        let m = ve
2680: 63 21 5b 30 78 62 65 2c 20 30 78 30 37 2c 20 30  c![0xbe, 0x07, 0
2690: 78 35 66 2c 20 30 78 63 35 2c 20 30 78 33 63 2c  x5f, 0xc5, 0x3c,
26a0: 20 30 78 38 31 2c 20 30 78 66 32 2c 20 30 78 64   0x81, 0xf2, 0xd
26b0: 35 2c 20 30 78 63 66 2c 20 30 78 31 34 2c 20 30  5, 0xcf, 0x14, 0
26c0: 78 31 33 2c 20 30 78 31 36 2c 20 30 78 65 62 2c  x13, 0x16, 0xeb,
26d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26e0: 20 20 20 20 20 20 30 78 65 62 2c 20 30 78 30 63        0xeb, 0x0c
26f0: 2c 20 30 78 37 62 2c 20 30 78 35 32 2c 20 30 78  , 0x7b, 0x52, 0x
2700: 32 38 2c 20 30 78 63 35 2c 20 30 78 32 61 2c 20  28, 0xc5, 0x2a, 
2710: 30 78 34 63 2c 20 30 78 36 32 2c 20 30 78 63 62  0x4c, 0x62, 0xcb
2720: 2c 20 30 78 64 34 2c 20 30 78 34 62 2c 20 30 78  , 0xd4, 0x4b, 0x
2730: 36 36 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  66,.            
2740: 20 20 20 20 20 20 20 20 20 30 78 38 34 2c 20 30           0x84, 0
2750: 78 39 62 2c 20 30 78 36 34 2c 20 30 78 32 34 2c  x9b, 0x64, 0x24,
2760: 20 30 78 34 66 2c 20 30 78 66 63 2c 20 30 78 65   0x4f, 0xfc, 0xe
2770: 35 2c 20 30 78 65 63 2c 20 30 78 62 61 2c 20 30  5, 0xec, 0xba, 0
2780: 78 61 66 2c 20 30 78 33 33 2c 20 30 78 62 64 2c  xaf, 0x33, 0xbd,
2790: 20 30 78 37 35 2c 0a 20 20 20 20 20 20 20 20 20   0x75,.         
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31 61              0x1a
27b0: 2c 20 30 78 31 61 2c 20 30 78 63 37 2c 20 30 78  , 0x1a, 0xc7, 0x
27c0: 32 38 2c 20 30 78 64 34 2c 20 30 78 35 65 2c 20  28, 0xd4, 0x5e, 
27d0: 30 78 36 63 2c 20 30 78 36 31 2c 20 30 78 32 39  0x6c, 0x61, 0x29
27e0: 2c 20 30 78 36 63 2c 20 30 78 64 63 2c 20 30 78  , 0x6c, 0xdc, 0x
27f0: 33 63 2c 20 30 78 30 31 2c 0a 20 20 20 20 20 20  3c, 0x01,.      
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2810: 78 32 33 2c 20 30 78 33 35 2c 20 30 78 36 31 2c  x23, 0x35, 0x61,
2820: 20 30 78 66 34 2c 20 30 78 31 64 2c 20 30 78 62   0xf4, 0x1d, 0xb
2830: 36 2c 20 30 78 36 63 2c 20 30 78 63 65 2c 20 30  6, 0x6c, 0xce, 0
2840: 78 33 31 2c 20 30 78 34 61 2c 20 30 78 64 62 2c  x31, 0x4a, 0xdb,
2850: 20 30 78 33 31 2c 20 30 78 30 65 2c 0a 20 20 20   0x31, 0x0e,.   
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2870: 20 20 30 78 33 62 2c 20 30 78 65 38 2c 20 30 78    0x3b, 0xe8, 0x
2880: 32 35 2c 20 30 78 30 63 2c 20 30 78 34 36 2c 20  25, 0x0c, 0x46, 
2890: 30 78 66 30 2c 20 30 78 36 64 2c 20 30 78 63 65  0xf0, 0x6d, 0xce
28a0: 2c 20 30 78 65 61 2c 20 30 78 33 61 2c 20 30 78  , 0xea, 0x3a, 0x
28b0: 37 66 2c 20 30 78 61 31 2c 20 30 78 33 34 2c 0a  7f, 0xa1, 0x34,.
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 20 30 78 38 30 2c 20 30 78 35 37 2c       0x80, 0x57,
28e0: 20 30 78 65 32 2c 20 30 78 66 36 2c 20 30 78 35   0xe2, 0xf6, 0x5
28f0: 35 2c 20 30 78 36 61 2c 20 30 78 64 36 2c 20 30  5, 0x6a, 0xd6, 0
2900: 78 62 31 2c 20 30 78 33 31 2c 20 30 78 38 61 2c  xb1, 0x31, 0x8a,
2910: 20 30 78 30 32 2c 20 30 78 34 61 2c 20 30 78 38   0x02, 0x4a, 0x8
2920: 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
2930: 20 20 20 20 20 20 20 20 30 78 38 66 2c 20 30 78          0x8f, 0x
2940: 32 31 2c 20 30 78 61 66 2c 20 30 78 31 66 2c 20  21, 0xaf, 0x1f, 
2950: 30 78 64 65 2c 20 30 78 30 34 2c 20 30 78 38 39  0xde, 0x04, 0x89
2960: 2c 20 30 78 37 37 2c 20 30 78 65 62 2c 20 30 78  , 0x77, 0xeb, 0x
2970: 34 38 2c 20 30 78 66 35 2c 20 30 78 39 66 2c 20  48, 0xf5, 0x9f, 
2980: 30 78 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  0xfd,.          
2990: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 39 2c             0x49,
29a0: 20 30 78 32 34 2c 20 30 78 63 61 2c 20 30 78 31   0x24, 0xca, 0x1
29b0: 63 2c 20 30 78 36 30 2c 20 30 78 39 30 2c 20 30  c, 0x60, 0x90, 0
29c0: 78 32 65 2c 20 30 78 35 32 2c 20 30 78 66 30 2c  x2e, 0x52, 0xf0,
29d0: 20 30 78 61 30 2c 20 30 78 38 39 2c 20 30 78 62   0xa0, 0x89, 0xb
29e0: 63 2c 20 30 78 37 36 2c 0a 20 20 20 20 20 20 20  c, 0x76,.       
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
2a00: 38 39 2c 20 30 78 37 30 2c 20 30 78 34 30 2c 20  89, 0x70, 0x40, 
2a10: 30 78 65 30 2c 20 30 78 38 32 2c 20 30 78 66 39  0xe0, 0x82, 0xf9
2a20: 2c 20 30 78 33 37 2c 20 30 78 37 36 2c 20 30 78  , 0x37, 0x76, 0x
2a30: 33 38 2c 20 30 78 34 38 2c 20 30 78 36 34 2c 20  38, 0x48, 0x64, 
2a40: 30 78 35 65 2c 20 30 78 30 37 2c 0a 20 20 20 20  0x5e, 0x07,.    
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 30 78 30 35 5d 3b 0a 0a 20 20 20 20 20 20 20   0x05];..       
2a70: 20 6c 65 74 20 63 5f 65 78 70 65 63 74 65 64 20   let c_expected 
2a80: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 65  =.            ve
2a90: 63 21 5b 30 78 66 33 2c 20 30 78 66 66 2c 20 30  c![0xf3, 0xff, 0
2aa0: 78 63 37 2c 20 30 78 37 30 2c 20 30 78 33 66 2c  xc7, 0x70, 0x3f,
2ab0: 20 30 78 39 34 2c 20 30 78 30 30 2c 20 30 78 65   0x94, 0x00, 0xe
2ac0: 35 2c 20 30 78 32 61 2c 20 30 78 37 64 2c 20 30  5, 0x2a, 0x7d, 0
2ad0: 78 66 62 2c 20 30 78 34 62 2c 20 30 78 33 64 2c  xfb, 0x4b, 0x3d,
2ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2af0: 20 20 30 78 33 33 2c 20 30 78 30 35 2c 20 30 78    0x33, 0x05, 0x
2b00: 64 39 2c 20 30 78 38 65 2c 20 30 78 39 39 2c 20  d9, 0x8e, 0x99, 
2b10: 30 78 33 62 2c 20 30 78 39 66 2c 20 30 78 34 38  0x3b, 0x9f, 0x48
2b20: 2c 20 30 78 36 38 2c 20 30 78 31 32 2c 20 30 78  , 0x68, 0x12, 0x
2b30: 37 33 2c 20 30 78 63 32 2c 20 30 78 39 36 2c 0a  73, 0xc2, 0x96,.
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 30 78 35 30 2c 20 30 78 62 61 2c 20 30 78 33   0x50, 0xba, 0x3
2b60: 32 2c 20 30 78 66 63 2c 20 30 78 37 36 2c 20 30  2, 0xfc, 0x76, 0
2b70: 78 63 65 2c 20 30 78 34 38 2c 20 30 78 33 33 2c  xce, 0x48, 0x33,
2b80: 20 30 78 32 65 2c 20 30 78 61 37 2c 20 30 78 31   0x2e, 0xa7, 0x1
2b90: 36 2c 20 30 78 34 64 2c 20 30 78 39 36 2c 0a 20  6, 0x4d, 0x96,. 
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 30 78 61 34 2c 20 30 78 34 37 2c 20 30 78 36 66  0xa4, 0x47, 0x6f
2bc0: 2c 20 30 78 62 38 2c 20 30 78 63 35 2c 20 30 78  , 0xb8, 0xc5, 0x
2bd0: 33 31 2c 20 30 78 61 31 2c 20 30 78 31 38 2c 20  31, 0xa1, 0x18, 
2be0: 30 78 36 61 2c 20 30 78 63 30 2c 20 30 78 64 66  0x6a, 0xc0, 0xdf
2bf0: 2c 20 30 78 63 31 2c 20 30 78 37 63 2c 0a 20 20  , 0xc1, 0x7c,.  
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2c10: 78 39 38 2c 20 30 78 64 63 2c 20 30 78 65 38 2c  x98, 0xdc, 0xe8,
2c20: 20 30 78 37 62 2c 20 30 78 34 64 2c 20 30 78 61   0x7b, 0x4d, 0xa
2c30: 37 2c 20 30 78 66 30 2c 20 30 78 31 31 2c 20 30  7, 0xf0, 0x11, 0
2c40: 78 65 63 2c 20 30 78 34 38 2c 20 30 78 63 39 2c  xec, 0x48, 0xc9,
2c50: 20 30 78 37 32 2c 20 30 78 37 31 2c 0a 20 20 20   0x72, 0x71,.   
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
2c70: 64 32 2c 20 30 78 63 32 2c 20 30 78 30 66 2c 20  d2, 0xc2, 0x0f, 
2c80: 30 78 39 62 2c 20 30 78 39 32 2c 20 30 78 38 66  0x9b, 0x92, 0x8f
2c90: 2c 20 30 78 65 32 2c 20 30 78 32 37 2c 20 30 78  , 0xe2, 0x27, 0x
2ca0: 30 64 2c 20 30 78 36 66 2c 20 30 78 62 38 2c 20  0d, 0x6f, 0xb8, 
2cb0: 30 78 36 33 2c 20 30 78 64 35 2c 0a 20 20 20 20  0x63, 0xd5,.    
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31               0x1
2cd0: 37 2c 20 30 78 33 38 2c 20 30 78 62 34 2c 20 30  7, 0x38, 0xb4, 0
2ce0: 78 38 65 2c 20 30 78 65 65 2c 20 30 78 65 33 2c  x8e, 0xee, 0xe3,
2cf0: 20 30 78 31 34 2c 20 30 78 61 37 2c 20 30 78 63   0x14, 0xa7, 0xc
2d00: 63 2c 20 30 78 38 61 2c 20 30 78 62 39 2c 20 30  c, 0x8a, 0xb9, 0
2d10: 78 33 32 2c 20 30 78 31 36 2c 0a 20 20 20 20 20  x32, 0x16,.     
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 34 35              0x45
2d30: 2c 20 30 78 34 38 2c 20 30 78 65 35 2c 20 30 78  , 0x48, 0xe5, 0x
2d40: 32 36 2c 20 30 78 61 65 2c 20 30 78 39 30 2c 20  26, 0xae, 0x90, 
2d50: 30 78 32 32 2c 20 30 78 34 33 2c 20 30 78 36 38  0x22, 0x43, 0x68
2d60: 2c 20 30 78 35 31 2c 20 30 78 37 61 2c 20 30 78  , 0x51, 0x7a, 0x
2d70: 63 66 2c 20 30 78 65 61 2c 0a 20 20 20 20 20 20  cf, 0xea,.      
2d80: 20 20 20 20 20 20 20 20 20 20 20 30 78 62 64 2c             0xbd,
2d90: 20 30 78 36 62 2c 20 30 78 62 33 2c 20 30 78 37   0x6b, 0xb3, 0x7
2da0: 33 2c 20 30 78 32 62 2c 20 30 78 63 30 2c 20 30  3, 0x2b, 0xc0, 0
2db0: 78 65 39 2c 20 30 78 64 61 2c 20 30 78 39 39 2c  xe9, 0xda, 0x99,
2dc0: 20 30 78 38 33 2c 20 30 78 32 62 2c 20 30 78 36   0x83, 0x2b, 0x6
2dd0: 31 2c 20 30 78 63 61 2c 0a 20 20 20 20 20 20 20  1, 0xca,.       
2de0: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 2c 20            0x01, 
2df0: 30 78 62 36 2c 20 30 78 64 65 2c 20 30 78 35 36  0xb6, 0xde, 0x56
2e00: 2c 20 30 78 32 34 2c 20 30 78 34 61 2c 20 30 78  , 0x24, 0x4a, 0x
2e10: 39 65 2c 20 30 78 38 38 2c 20 30 78 64 35 2c 20  9e, 0x88, 0xd5, 
2e20: 30 78 66 39 2c 20 30 78 62 33 2c 20 30 78 37 39  0xf9, 0xb3, 0x79
2e30: 2c 20 30 78 37 33 2c 0a 20 20 20 20 20 20 20 20  , 0x73,.        
2e40: 20 20 20 20 20 20 20 20 20 30 78 66 36 2c 20 30           0xf6, 0
2e50: 78 32 32 2c 20 30 78 61 34 2c 20 30 78 33 64 2c  x22, 0xa4, 0x3d,
2e60: 20 30 78 31 34 2c 20 30 78 61 36 2c 20 30 78 35   0x14, 0xa6, 0x5
2e70: 39 2c 20 30 78 39 62 2c 20 30 78 31 66 2c 20 30  9, 0x9b, 0x1f, 0
2e80: 78 36 35 2c 20 30 78 34 63 2c 20 30 78 62 34 2c  x65, 0x4c, 0xb4,
2e90: 20 30 78 35 61 2c 0a 20 20 20 20 20 20 20 20 20   0x5a,.         
2ea0: 20 20 20 20 20 20 20 20 30 78 37 34 2c 20 30 78          0x74, 0x
2eb0: 65 33 2c 20 30 78 35 35 2c 20 30 78 61 35 5d 3b  e3, 0x55, 0xa5];
2ec0: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 63 20 3d  .        let c =
2ed0: 20 73 65 61 6c 28 26 6d 2c 20 26 6e 6f 6e 63 65   seal(&m, &nonce
2ee0: 2c 20 26 66 69 72 73 74 6b 65 79 29 3b 0a 20 20  , &firstkey);.  
2ef0: 20 20 20 20 20 20 61 73 73 65 72 74 21 28 63 20        assert!(c 
2f00: 3d 3d 20 63 5f 65 78 70 65 63 74 65 64 29 3b 0a  == c_expected);.
2f10: 20 20 20 20 20 20 20 20 6c 65 74 20 6d 32 20 3d          let m2 =
2f20: 20 6f 70 65 6e 28 26 63 2c 20 26 6e 6f 6e 63 65   open(&c, &nonce
2f30: 2c 20 26 66 69 72 73 74 6b 65 79 29 3b 0a 20 20  , &firstkey);.  
2f40: 20 20 20 20 20 20 61 73 73 65 72 74 21 28 4f 6b        assert!(Ok
2f50: 28 6d 29 20 3d 3d 20 6d 32 29 3b 0a 20 20 20 20  (m) == m2);.    
2f60: 7d 0a 0a 20 20 20 20 23 5b 63 66 67 28 61 6e 79  }..    #[cfg(any
2f70: 28 66 65 61 74 75 72 65 20 3d 20 22 73 65 72 64  (feature = "serd
2f80: 65 22 2c 20 66 65 61 74 75 72 65 20 3d 20 22 72  e", feature = "r
2f90: 75 73 74 63 2d 73 65 72 69 61 6c 69 7a 65 22 29  ustc-serialize")
2fa0: 29 5d 0a 20 20 20 20 23 5b 74 65 73 74 5d 0a 20  )].    #[test]. 
2fb0: 20 20 20 66 6e 20 74 65 73 74 5f 73 65 72 69 61     fn test_seria
2fc0: 6c 69 73 61 74 69 6f 6e 28 29 20 7b 0a 20 20 20  lisation() {.   
2fd0: 20 20 20 20 20 75 73 65 20 74 65 73 74 5f 75 74       use test_ut
2fe0: 69 6c 73 3a 3a 72 6f 75 6e 64 5f 74 72 69 70 3b  ils::round_trip;
2ff0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 21  .        assert!
3000: 28 3a 3a 69 6e 69 74 28 29 29 3b 0a 20 20 20 20  (::init());.    
3010: 20 20 20 20 66 6f 72 20 5f 20 69 6e 20 30 2e 2e      for _ in 0..
3020: 32 35 36 75 73 69 7a 65 20 7b 0a 20 20 20 20 20  256usize {.     
3030: 20 20 20 20 20 20 20 6c 65 74 20 6b 20 3d 20 67         let k = g
3040: 65 6e 5f 6b 65 79 28 29 3b 0a 20 20 20 20 20 20  en_key();.      
3050: 20 20 20 20 20 20 6c 65 74 20 6e 20 3d 20 67 65        let n = ge
3060: 6e 5f 6e 6f 6e 63 65 28 29 3b 0a 20 20 20 20 20  n_nonce();.     
3070: 20 20 20 20 20 20 20 72 6f 75 6e 64 5f 74 72 69         round_tri
3080: 70 28 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  p(k);.          
3090: 20 20 72 6f 75 6e 64 5f 74 72 69 70 28 6e 29 3b    round_trip(n);
30a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
30b0: 0a 7d 0a 0a 23 5b 63 66 67 28 66 65 61 74 75 72  .}..#[cfg(featur
30c0: 65 20 3d 20 22 62 65 6e 63 68 6d 61 72 6b 73 22  e = "benchmarks"
30d0: 29 5d 0a 23 5b 63 66 67 28 74 65 73 74 29 5d 0a  )].#[cfg(test)].
30e0: 6d 6f 64 20 62 65 6e 63 68 20 7b 0a 20 20 20 20  mod bench {.    
30f0: 65 78 74 65 72 6e 20 63 72 61 74 65 20 74 65 73  extern crate tes
3100: 74 3b 0a 20 20 20 20 75 73 65 20 73 75 70 65 72  t;.    use super
3110: 3a 3a 2a 3b 0a 20 20 20 20 75 73 65 20 72 61 6e  ::*;.    use ran
3120: 64 6f 6d 62 79 74 65 73 3a 3a 72 61 6e 64 6f 6d  dombytes::random
3130: 62 79 74 65 73 3b 0a 0a 20 20 20 20 63 6f 6e 73  bytes;..    cons
3140: 74 20 42 45 4e 43 48 5f 53 49 5a 45 53 3a 20 5b  t BENCH_SIZES: [
3150: 75 73 69 7a 65 3b 20 31 34 5d 20 3d 20 5b 30 2c  usize; 14] = [0,
3160: 20 31 2c 20 32 2c 20 34 2c 20 38 2c 20 31 36 2c   1, 2, 4, 8, 16,
3170: 20 33 32 2c 20 36 34 2c 20 31 32 38 2c 20 32 35   32, 64, 128, 25
3180: 36 2c 20 35 31 32 2c 20 31 30 32 34 2c 20 32 30  6, 512, 1024, 20
3190: 34 38 2c 20 34 30 39 36 5d 3b 0a 0a 20 20 20 20  48, 4096];..    
31a0: 23 5b 62 65 6e 63 68 5d 0a 20 20 20 20 66 6e 20  #[bench].    fn 
31b0: 62 65 6e 63 68 5f 73 65 61 6c 5f 6f 70 65 6e 28  bench_seal_open(
31c0: 62 3a 20 26 6d 75 74 20 74 65 73 74 3a 3a 42 65  b: &mut test::Be
31d0: 6e 63 68 65 72 29 20 7b 0a 20 20 20 20 20 20 20  ncher) {.       
31e0: 20 61 73 73 65 72 74 21 28 3a 3a 69 6e 69 74 28   assert!(::init(
31f0: 29 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ));.        let 
3200: 6b 20 3d 20 67 65 6e 5f 6b 65 79 28 29 3b 0a 20  k = gen_key();. 
3210: 20 20 20 20 20 20 20 6c 65 74 20 6e 20 3d 20 67         let n = g
3220: 65 6e 5f 6e 6f 6e 63 65 28 29 3b 0a 20 20 20 20  en_nonce();.    
3230: 20 20 20 20 6c 65 74 20 6d 73 3a 20 56 65 63 3c      let ms: Vec<
3240: 56 65 63 3c 75 38 3e 3e 20 3d 20 42 45 4e 43 48  Vec<u8>> = BENCH
3250: 5f 53 49 5a 45 53 2e 69 74 65 72 28 29 2e 6d 61  _SIZES.iter().ma
3260: 70 28 7c 73 7c 20 72 61 6e 64 6f 6d 62 79 74 65  p(|s| randombyte
3270: 73 28 2a 73 29 29 2e 63 6f 6c 6c 65 63 74 28 29  s(*s)).collect()
3280: 3b 0a 20 20 20 20 20 20 20 20 62 2e 69 74 65 72  ;.        b.iter
3290: 28 7c 7c 20 66 6f 72 20 6d 20 69 6e 20 6d 73 2e  (|| for m in ms.
32a0: 69 74 65 72 28 29 20 7b 0a 20 20 20 20 20 20 20  iter() {.       
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 77 72              unwr
32c0: 61 70 21 28 6f 70 65 6e 28 26 73 65 61 6c 28 26  ap!(open(&seal(&
32d0: 6d 2c 20 26 6e 2c 20 26 6b 29 2c 20 26 6e 2c 20  m, &n, &k), &n, 
32e0: 26 6b 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &k));.          
32f0: 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 7d 0a 7d       });.    }.}
3300: 0a                                               .