Hex Artifact Content
Not logged in

Artifact 111ef93e4f82ec81c11ec293e8129d27c239bb3f:


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 6d 61 72 73 68  e ffi;.use marsh
0120: 61 6c 3a 3a 6d 61 72 73 68 61 6c 3b 0a 75 73 65  al::marshal;.use
0130: 20 72 61 6e 64 6f 6d 62 79 74 65 73 3a 3a 72 61   randombytes::ra
0140: 6e 64 6f 6d 62 79 74 65 73 5f 69 6e 74 6f 3b 0a  ndombytes_into;.
0150: 23 5b 63 66 67 28 66 65 61 74 75 72 65 20 3d 20  #[cfg(feature = 
0160: 22 72 75 73 74 63 2d 73 65 72 69 61 6c 69 7a 65  "rustc-serialize
0170: 22 29 5d 0a 75 73 65 20 72 75 73 74 63 5f 73 65  ")].use rustc_se
0180: 72 69 61 6c 69 7a 65 3b 0a 0a 2f 2f 2f 20 4e 75  rialize;../// Nu
0190: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
01a0: 20 60 4b 65 79 60 2e 0a 70 75 62 20 63 6f 6e 73   `Key`..pub cons
01b0: 74 20 4b 45 59 42 59 54 45 53 3a 20 75 73 69 7a  t KEYBYTES: usiz
01c0: 65 20 3d 20 66 66 69 3a 3a 63 72 79 70 74 6f 5f  e = ffi::crypto_
01d0: 73 65 63 72 65 74 62 6f 78 5f 78 73 61 6c 73 61  secretbox_xsalsa
01e0: 32 30 70 6f 6c 79 31 33 30 35 5f 4b 45 59 42 59  20poly1305_KEYBY
01f0: 54 45 53 3b 0a 0a 2f 2f 2f 20 4e 75 6d 62 65 72  TES;../// Number
0200: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 60   of bytes in a `
0210: 4e 6f 6e 63 65 60 2e 0a 70 75 62 20 63 6f 6e 73  Nonce`..pub cons
0220: 74 20 4e 4f 4e 43 45 42 59 54 45 53 3a 20 75 73  t NONCEBYTES: us
0230: 69 7a 65 20 3d 20 66 66 69 3a 3a 63 72 79 70 74  ize = ffi::crypt
0240: 6f 5f 73 65 63 72 65 74 62 6f 78 5f 78 73 61 6c  o_secretbox_xsal
0250: 73 61 32 30 70 6f 6c 79 31 33 30 35 5f 4e 4f 4e  sa20poly1305_NON
0260: 43 45 42 59 54 45 53 3b 0a 0a 6e 65 77 5f 74 79  CEBYTES;..new_ty
0270: 70 65 21 20 7b 0a 20 20 20 20 2f 2f 2f 20 60 4b  pe! {.    /// `K
0280: 65 79 60 20 66 6f 72 20 73 79 6d 6d 65 74 72 69  ey` for symmetri
0290: 63 20 61 75 74 68 65 6e 74 69 63 61 74 65 64 20  c authenticated 
02a0: 65 6e 63 72 79 70 74 69 6f 6e 0a 20 20 20 20 2f  encryption.    /
02b0: 2f 2f 0a 20 20 20 20 2f 2f 2f 20 57 68 65 6e 20  //.    /// When 
02c0: 61 20 60 4b 65 79 60 20 67 6f 65 73 20 6f 75 74  a `Key` goes out
02d0: 20 6f 66 20 73 63 6f 70 65 20 69 74 73 20 63 6f   of scope its co
02e0: 6e 74 65 6e 74 73 0a 20 20 20 20 2f 2f 2f 20 77  ntents.    /// w
02f0: 69 6c 6c 20 62 65 20 7a 65 72 6f 65 64 20 6f 75  ill be zeroed ou
0300: 74 0a 20 20 20 20 73 65 63 72 65 74 20 4b 65 79  t.    secret Key
0310: 28 4b 45 59 42 59 54 45 53 29 3b 0a 7d 0a 0a 6e  (KEYBYTES);.}..n
0320: 65 77 5f 74 79 70 65 21 20 7b 0a 20 20 20 20 2f  ew_type! {.    /
0330: 2f 2f 20 60 4e 6f 6e 63 65 60 20 66 6f 72 20 73  // `Nonce` for s
0340: 79 6d 6d 65 74 72 69 63 20 61 75 74 68 65 6e 74  ymmetric authent
0350: 69 63 61 74 65 64 20 65 6e 63 72 79 70 74 69 6f  icated encryptio
0360: 6e 0a 20 20 20 20 6e 6f 6e 63 65 20 4e 6f 6e 63  n.    nonce Nonc
0370: 65 28 4e 4f 4e 43 45 42 59 54 45 53 29 3b 0a 7d  e(NONCEBYTES);.}
0380: 0a 0a 63 6f 6e 73 74 20 5a 45 52 4f 42 59 54 45  ..const ZEROBYTE
0390: 53 3a 20 75 73 69 7a 65 20 3d 20 33 32 3b 0a 63  S: usize = 32;.c
03a0: 6f 6e 73 74 20 42 4f 58 5a 45 52 4f 42 59 54 45  onst BOXZEROBYTE
03b0: 53 3a 20 75 73 69 7a 65 20 3d 20 31 36 3b 0a 0a  S: usize = 16;..
03c0: 2f 2f 2f 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  /// Number of by
03d0: 74 65 73 20 69 6e 20 74 68 65 20 61 75 74 68 65  tes in the authe
03e0: 6e 74 69 63 61 74 6f 72 20 74 61 67 20 6f 66 20  nticator tag of 
03f0: 61 6e 20 65 6e 63 72 79 70 74 65 64 20 6d 65 73  an encrypted mes
0400: 73 61 67 65 0a 2f 2f 2f 20 69 2e 65 2e 20 74 68  sage./// i.e. th
0410: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
0420: 73 20 62 79 20 77 68 69 63 68 20 74 68 65 20 63  s by which the c
0430: 69 70 68 65 72 74 65 78 74 20 69 73 20 6c 61 72  iphertext is lar
0440: 67 65 72 20 74 68 61 6e 20 74 68 65 0a 2f 2f 2f  ger than the.///
0450: 20 70 6c 61 69 6e 74 65 78 74 2e 0a 70 75 62 20   plaintext..pub 
0460: 63 6f 6e 73 74 20 4d 41 43 42 59 54 45 53 3a 20  const MACBYTES: 
0470: 75 73 69 7a 65 20 3d 20 66 66 69 3a 3a 63 72 79  usize = ffi::cry
0480: 70 74 6f 5f 73 65 63 72 65 74 62 6f 78 5f 78 73  pto_secretbox_xs
0490: 61 6c 73 61 32 30 70 6f 6c 79 31 33 30 35 5f 4d  alsa20poly1305_M
04a0: 41 43 42 59 54 45 53 3b 0a 0a 2f 2f 2f 20 60 67  ACBYTES;../// `g
04b0: 65 6e 5f 6b 65 79 28 29 60 20 72 61 6e 64 6f 6d  en_key()` random
04c0: 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 73  ly generates a s
04d0: 65 63 72 65 74 20 6b 65 79 0a 2f 2f 2f 0a 2f 2f  ecret key.///.//
04e0: 2f 20 54 48 52 45 41 44 20 53 41 46 45 54 59 3a  / THREAD SAFETY:
04f0: 20 60 67 65 6e 5f 6b 65 79 28 29 60 20 69 73 20   `gen_key()` is 
0500: 74 68 72 65 61 64 2d 73 61 66 65 20 70 72 6f 76  thread-safe prov
0510: 69 64 65 64 20 74 68 61 74 20 79 6f 75 20 68 61  ided that you ha
0520: 76 65 0a 2f 2f 2f 20 63 61 6c 6c 65 64 20 60 72  ve./// called `r
0530: 75 73 74 5f 73 6f 64 69 75 6d 3a 3a 69 6e 69 74  ust_sodium::init
0540: 28 29 60 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ()` once before 
0550: 75 73 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  using any other 
0560: 66 75 6e 63 74 69 6f 6e 0a 2f 2f 2f 20 66 72 6f  function./// fro
0570: 6d 20 60 72 75 73 74 5f 73 6f 64 69 75 6d 60 2e  m `rust_sodium`.
0580: 0a 70 75 62 20 66 6e 20 67 65 6e 5f 6b 65 79 28  .pub fn gen_key(
0590: 29 20 2d 3e 20 4b 65 79 20 7b 0a 20 20 20 20 6c  ) -> Key {.    l
05a0: 65 74 20 6d 75 74 20 6b 65 79 20 3d 20 5b 30 3b  et mut key = [0;
05b0: 20 4b 45 59 42 59 54 45 53 5d 3b 0a 20 20 20 20   KEYBYTES];.    
05c0: 72 61 6e 64 6f 6d 62 79 74 65 73 5f 69 6e 74 6f  randombytes_into
05d0: 28 26 6d 75 74 20 6b 65 79 29 3b 0a 20 20 20 20  (&mut key);.    
05e0: 4b 65 79 28 6b 65 79 29 0a 7d 0a 0a 2f 2f 2f 20  Key(key).}../// 
05f0: 60 67 65 6e 5f 6e 6f 6e 63 65 28 29 60 20 72 61  `gen_nonce()` ra
0600: 6e 64 6f 6d 6c 79 20 67 65 6e 65 72 61 74 65 73  ndomly generates
0610: 20 61 20 6e 6f 6e 63 65 0a 2f 2f 2f 0a 2f 2f 2f   a nonce.///.///
0620: 20 54 48 52 45 41 44 20 53 41 46 45 54 59 3a 20   THREAD SAFETY: 
0630: 60 67 65 6e 5f 6b 65 79 28 29 60 20 69 73 20 74  `gen_key()` is t
0640: 68 72 65 61 64 2d 73 61 66 65 20 70 72 6f 76 69  hread-safe provi
0650: 64 65 64 20 74 68 61 74 20 79 6f 75 20 68 61 76  ded that you hav
0660: 65 0a 2f 2f 2f 20 63 61 6c 6c 65 64 20 60 72 75  e./// called `ru
0670: 73 74 5f 73 6f 64 69 75 6d 3a 3a 69 6e 69 74 28  st_sodium::init(
0680: 29 60 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 75  )` once before u
0690: 73 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  sing any other f
06a0: 75 6e 63 74 69 6f 6e 0a 2f 2f 2f 20 66 72 6f 6d  unction./// from
06b0: 20 60 72 75 73 74 5f 73 6f 64 69 75 6d 60 2e 0a   `rust_sodium`..
06c0: 70 75 62 20 66 6e 20 67 65 6e 5f 6e 6f 6e 63 65  pub fn gen_nonce
06d0: 28 29 20 2d 3e 20 4e 6f 6e 63 65 20 7b 0a 20 20  () -> Nonce {.  
06e0: 20 20 6c 65 74 20 6d 75 74 20 6e 6f 6e 63 65 20    let mut nonce 
06f0: 3d 20 5b 30 3b 20 4e 4f 4e 43 45 42 59 54 45 53  = [0; NONCEBYTES
0700: 5d 3b 0a 20 20 20 20 72 61 6e 64 6f 6d 62 79 74  ];.    randombyt
0710: 65 73 5f 69 6e 74 6f 28 26 6d 75 74 20 6e 6f 6e  es_into(&mut non
0720: 63 65 29 3b 0a 20 20 20 20 4e 6f 6e 63 65 28 6e  ce);.    Nonce(n
0730: 6f 6e 63 65 29 0a 7d 0a 0a 2f 2f 2f 20 60 73 65  once).}../// `se
0740: 61 6c 28 29 60 20 65 6e 63 72 79 70 74 73 20 61  al()` encrypts a
0750: 6e 64 20 61 75 74 68 65 6e 74 69 63 61 74 65 73  nd authenticates
0760: 20 61 20 6d 65 73 73 61 67 65 20 60 6d 60 20 75   a message `m` u
0770: 73 69 6e 67 20 61 20 73 65 63 72 65 74 20 6b 65  sing a secret ke
0780: 79 20 60 6b 60 20 61 6e 64 20 61 0a 2f 2f 2f 20  y `k` and a./// 
0790: 6e 6f 6e 63 65 20 60 6e 60 2e 20 20 49 74 20 72  nonce `n`.  It r
07a0: 65 74 75 72 6e 73 20 61 20 63 69 70 68 65 72 74  eturns a ciphert
07b0: 65 78 74 20 60 63 60 2e 0a 70 75 62 20 66 6e 20  ext `c`..pub fn 
07c0: 73 65 61 6c 28 6d 3a 20 26 5b 75 38 5d 2c 20 26  seal(m: &[u8], &
07d0: 4e 6f 6e 63 65 28 72 65 66 20 6e 29 3a 20 26 4e  Nonce(ref n): &N
07e0: 6f 6e 63 65 2c 20 26 4b 65 79 28 72 65 66 20 6b  once, &Key(ref k
07f0: 29 3a 20 26 4b 65 79 29 20 2d 3e 20 56 65 63 3c  ): &Key) -> Vec<
0800: 75 38 3e 20 7b 0a 20 20 20 20 6c 65 74 20 28 63  u8> {.    let (c
0810: 2c 20 5f 29 20 3d 20 6d 61 72 73 68 61 6c 28 6d  , _) = marshal(m
0820: 2c 20 5a 45 52 4f 42 59 54 45 53 2c 20 42 4f 58  , ZEROBYTES, BOX
0830: 5a 45 52 4f 42 59 54 45 53 2c 20 7c 64 73 74 2c  ZEROBYTES, |dst,
0840: 20 73 72 63 2c 20 6c 65 6e 7c 20 75 6e 73 61 66   src, len| unsaf
0850: 65 20 7b 0a 20 20 20 20 20 20 20 20 66 66 69 3a  e {.        ffi:
0860: 3a 63 72 79 70 74 6f 5f 73 65 63 72 65 74 62 6f  :crypto_secretbo
0870: 78 5f 78 73 61 6c 73 61 32 30 70 6f 6c 79 31 33  x_xsalsa20poly13
0880: 30 35 28 64 73 74 2c 20 73 72 63 2c 20 6c 65 6e  05(dst, src, len
0890: 2c 20 6e 2e 61 73 5f 70 74 72 28 29 2c 20 6b 2e  , n.as_ptr(), k.
08a0: 61 73 5f 70 74 72 28 29 29 0a 20 20 20 20 7d 29  as_ptr()).    })
08b0: 3b 0a 20 20 20 20 63 0a 7d 0a 0a 2f 2f 2f 20 60  ;.    c.}../// `
08c0: 6f 70 65 6e 28 29 60 20 76 65 72 69 66 69 65 73  open()` verifies
08d0: 20 61 6e 64 20 64 65 63 72 79 70 74 73 20 61 20   and decrypts a 
08e0: 63 69 70 68 65 72 74 65 78 74 20 60 63 60 20 75  ciphertext `c` u
08f0: 73 69 6e 67 20 61 20 73 65 63 72 65 74 20 6b 65  sing a secret ke
0900: 79 20 60 6b 60 20 61 6e 64 20 61 20 6e 6f 6e 63  y `k` and a nonc
0910: 65 20 60 6e 60 2e 0a 2f 2f 2f 20 49 74 20 72 65  e `n`../// It re
0920: 74 75 72 6e 73 20 61 20 70 6c 61 69 6e 74 65 78  turns a plaintex
0930: 74 20 60 4f 6b 28 6d 29 60 2e 0a 2f 2f 2f 20 49  t `Ok(m)`../// I
0940: 66 20 74 68 65 20 63 69 70 68 65 72 74 65 78 74  f the ciphertext
0950: 20 66 61 69 6c 73 20 76 65 72 69 66 69 63 61 74   fails verificat
0960: 69 6f 6e 2c 20 60 6f 70 65 6e 28 29 60 20 72 65  ion, `open()` re
0970: 74 75 72 6e 73 20 60 45 72 72 28 28 29 29 60 2e  turns `Err(())`.
0980: 0a 70 75 62 20 66 6e 20 6f 70 65 6e 28 63 3a 20  .pub fn open(c: 
0990: 26 5b 75 38 5d 2c 20 26 4e 6f 6e 63 65 28 72 65  &[u8], &Nonce(re
09a0: 66 20 6e 29 3a 20 26 4e 6f 6e 63 65 2c 20 26 4b  f n): &Nonce, &K
09b0: 65 79 28 72 65 66 20 6b 29 3a 20 26 4b 65 79 29  ey(ref k): &Key)
09c0: 20 2d 3e 20 52 65 73 75 6c 74 3c 56 65 63 3c 75   -> Result<Vec<u
09d0: 38 3e 2c 20 28 29 3e 20 7b 0a 20 20 20 20 69 66  8>, ()> {.    if
09e0: 20 63 2e 6c 65 6e 28 29 20 3c 20 42 4f 58 5a 45   c.len() < BOXZE
09f0: 52 4f 42 59 54 45 53 20 7b 0a 20 20 20 20 20 20  ROBYTES {.      
0a00: 20 20 72 65 74 75 72 6e 20 45 72 72 28 28 29 29    return Err(())
0a10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 74 20  ;.    }.    let 
0a20: 28 6d 2c 20 72 65 74 29 20 3d 0a 20 20 20 20 20  (m, ret) =.     
0a30: 20 20 20 6d 61 72 73 68 61 6c 28 63 2c 20 42 4f     marshal(c, BO
0a40: 58 5a 45 52 4f 42 59 54 45 53 2c 20 5a 45 52 4f  XZEROBYTES, ZERO
0a50: 42 59 54 45 53 2c 20 7c 64 73 74 2c 20 73 72 63  BYTES, |dst, src
0a60: 2c 20 6c 65 6e 7c 20 75 6e 73 61 66 65 20 7b 0a  , len| unsafe {.
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 66 66 69 3a              ffi:
0a80: 3a 63 72 79 70 74 6f 5f 73 65 63 72 65 74 62 6f  :crypto_secretbo
0a90: 78 5f 78 73 61 6c 73 61 32 30 70 6f 6c 79 31 33  x_xsalsa20poly13
0aa0: 30 35 5f 6f 70 65 6e 28 64 73 74 2c 20 73 72 63  05_open(dst, src
0ab0: 2c 20 6c 65 6e 2c 20 6e 2e 61 73 5f 70 74 72 28  , len, n.as_ptr(
0ac0: 29 2c 20 6b 2e 61 73 5f 70 74 72 28 29 29 0a 20  ), k.as_ptr()). 
0ad0: 20 20 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 69         });.    i
0ae0: 66 20 72 65 74 20 3d 3d 20 30 20 7b 20 4f 6b 28  f ret == 0 { Ok(
0af0: 6d 29 20 7d 20 65 6c 73 65 20 7b 20 45 72 72 28  m) } else { Err(
0b00: 28 29 29 20 7d 0a 7d 0a 0a 23 5b 63 66 67 28 74  ()) }.}..#[cfg(t
0b10: 65 73 74 29 5d 0a 6d 6f 64 20 74 65 73 74 20 7b  est)].mod test {
0b20: 0a 20 20 20 20 75 73 65 20 73 75 70 65 72 3a 3a  .    use super::
0b30: 2a 3b 0a 0a 20 20 20 20 23 5b 74 65 73 74 5d 0a  *;..    #[test].
0b40: 20 20 20 20 66 6e 20 74 65 73 74 5f 73 65 61 6c      fn test_seal
0b50: 5f 6f 70 65 6e 28 29 20 7b 0a 20 20 20 20 20 20  _open() {.      
0b60: 20 20 75 73 65 20 72 61 6e 64 6f 6d 62 79 74 65    use randombyte
0b70: 73 3a 3a 72 61 6e 64 6f 6d 62 79 74 65 73 3b 0a  s::randombytes;.
0b80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 21 28          assert!(
0b90: 3a 3a 69 6e 69 74 28 29 29 3b 0a 20 20 20 20 20  ::init());.     
0ba0: 20 20 20 66 6f 72 20 69 20 69 6e 20 30 2e 2e 32     for i in 0..2
0bb0: 35 36 75 73 69 7a 65 20 7b 0a 20 20 20 20 20 20  56usize {.      
0bc0: 20 20 20 20 20 20 6c 65 74 20 6b 20 3d 20 67 65        let k = ge
0bd0: 6e 5f 6b 65 79 28 29 3b 0a 20 20 20 20 20 20 20  n_key();.       
0be0: 20 20 20 20 20 6c 65 74 20 6d 20 3d 20 72 61 6e       let m = ran
0bf0: 64 6f 6d 62 79 74 65 73 28 69 29 3b 0a 20 20 20  dombytes(i);.   
0c00: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e 20 3d           let n =
0c10: 20 67 65 6e 5f 6e 6f 6e 63 65 28 29 3b 0a 20 20   gen_nonce();.  
0c20: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 63 20            let c 
0c30: 3d 20 73 65 61 6c 28 26 6d 2c 20 26 6e 2c 20 26  = seal(&m, &n, &
0c40: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
0c50: 6c 65 74 20 6f 70 65 6e 65 64 20 3d 20 6f 70 65  let opened = ope
0c60: 6e 28 26 63 2c 20 26 6e 2c 20 26 6b 29 3b 0a 20  n(&c, &n, &k);. 
0c70: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
0c80: 74 21 28 4f 6b 28 6d 29 20 3d 3d 20 6f 70 65 6e  t!(Ok(m) == open
0c90: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ed);.        }. 
0ca0: 20 20 20 7d 0a 0a 20 20 20 20 23 5b 74 65 73 74     }..    #[test
0cb0: 5d 0a 20 20 20 20 23 5b 63 66 67 5f 61 74 74 72  ].    #[cfg_attr
0cc0: 28 66 65 61 74 75 72 65 3d 22 63 61 72 67 6f 2d  (feature="cargo-
0cd0: 63 6c 69 70 70 79 22 2c 20 61 6c 6c 6f 77 28 6e  clippy", allow(n
0ce0: 65 65 64 6c 65 73 73 5f 72 61 6e 67 65 5f 6c 6f  eedless_range_lo
0cf0: 6f 70 29 29 5d 0a 20 20 20 20 66 6e 20 74 65 73  op))].    fn tes
0d00: 74 5f 73 65 61 6c 5f 6f 70 65 6e 5f 74 61 6d 70  t_seal_open_tamp
0d10: 65 72 28 29 20 7b 0a 20 20 20 20 20 20 20 20 75  er() {.        u
0d20: 73 65 20 72 61 6e 64 6f 6d 62 79 74 65 73 3a 3a  se randombytes::
0d30: 72 61 6e 64 6f 6d 62 79 74 65 73 3b 0a 20 20 20  randombytes;.   
0d40: 20 20 20 20 20 61 73 73 65 72 74 21 28 3a 3a 69       assert!(::i
0d50: 6e 69 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20  nit());.        
0d60: 66 6f 72 20 69 20 69 6e 20 30 2e 2e 33 32 75 73  for i in 0..32us
0d70: 69 7a 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ize {.          
0d80: 20 20 6c 65 74 20 6b 20 3d 20 67 65 6e 5f 6b 65    let k = gen_ke
0d90: 79 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  y();.           
0da0: 20 6c 65 74 20 6d 20 3d 20 72 61 6e 64 6f 6d 62   let m = randomb
0db0: 79 74 65 73 28 69 29 3b 0a 20 20 20 20 20 20 20  ytes(i);.       
0dc0: 20 20 20 20 20 6c 65 74 20 6e 20 3d 20 67 65 6e       let n = gen
0dd0: 5f 6e 6f 6e 63 65 28 29 3b 0a 20 20 20 20 20 20  _nonce();.      
0de0: 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 63 20        let mut c 
0df0: 3d 20 73 65 61 6c 28 26 6d 2c 20 26 6e 2c 20 26  = seal(&m, &n, &
0e00: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
0e10: 66 6f 72 20 69 20 69 6e 20 30 2e 2e 63 2e 6c 65  for i in 0..c.le
0e20: 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n() {.          
0e30: 20 20 20 20 20 20 63 5b 69 5d 20 5e 3d 20 30 78        c[i] ^= 0x
0e40: 32 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  20;.            
0e50: 20 20 20 20 61 73 73 65 72 74 21 28 45 72 72 28      assert!(Err(
0e60: 28 29 29 20 3d 3d 20 6f 70 65 6e 28 26 63 2c 20  ()) == open(&c, 
0e70: 26 6e 2c 20 26 6b 29 29 3b 0a 20 20 20 20 20 20  &n, &k));.      
0e80: 20 20 20 20 20 20 20 20 20 20 63 5b 69 5d 20 5e            c[i] ^
0e90: 3d 20 30 78 32 30 3b 0a 20 20 20 20 20 20 20 20  = 0x20;.        
0ea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
0eb0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 74 65 73      }..    #[tes
0ec0: 74 5d 0a 20 20 20 20 66 6e 20 74 65 73 74 5f 76  t].    fn test_v
0ed0: 65 63 74 6f 72 5f 31 28 29 20 7b 0a 20 20 20 20  ector_1() {.    
0ee0: 20 20 20 20 61 73 73 65 72 74 21 28 3a 3a 69 6e      assert!(::in
0ef0: 69 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20 6c  it());.        l
0f00: 65 74 20 66 69 72 73 74 6b 65 79 20 3d 20 4b 65  et firstkey = Ke
0f10: 79 28 5b 30 78 31 62 2c 20 30 78 32 37 2c 20 30  y([0x1b, 0x27, 0
0f20: 78 35 35 2c 20 30 78 36 34 2c 20 30 78 37 33 2c  x55, 0x64, 0x73,
0f30: 20 30 78 65 39 2c 20 30 78 38 35 2c 20 30 78 64   0xe9, 0x85, 0xd
0f40: 34 2c 20 30 78 36 32 2c 20 30 78 63 64 2c 20 30  4, 0x62, 0xcd, 0
0f50: 78 35 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x51,.           
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f70: 20 30 78 31 39 2c 20 30 78 37 61 2c 20 30 78 39   0x19, 0x7a, 0x9
0f80: 61 2c 20 30 78 34 36 2c 20 30 78 63 37 2c 20 30  a, 0x46, 0xc7, 0
0f90: 78 36 30 2c 20 30 78 30 39 2c 20 30 78 35 34 2c  x60, 0x09, 0x54,
0fa0: 20 30 78 39 65 2c 20 30 78 61 63 2c 20 30 78 36   0x9e, 0xac, 0x6
0fb0: 34 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4,.             
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0fd0: 78 37 34 2c 20 30 78 66 32 2c 20 30 78 30 36 2c  x74, 0xf2, 0x06,
0fe0: 20 30 78 63 34 2c 20 30 78 65 65 2c 20 30 78 30   0xc4, 0xee, 0x0
0ff0: 38 2c 20 30 78 34 34 2c 20 30 78 66 36 2c 20 30  8, 0x44, 0xf6, 0
1000: 78 38 33 2c 20 30 78 38 39 5d 29 3b 0a 20 20 20  x83, 0x89]);.   
1010: 20 20 20 20 20 6c 65 74 20 6e 6f 6e 63 65 20 3d       let nonce =
1020: 20 4e 6f 6e 63 65 28 5b 30 78 36 39 2c 20 30 78   Nonce([0x69, 0x
1030: 36 39 2c 20 30 78 36 65 2c 20 30 78 65 39 2c 20  69, 0x6e, 0xe9, 
1040: 30 78 35 35 2c 20 30 78 62 36 2c 20 30 78 32 62  0x55, 0xb6, 0x2b
1050: 2c 20 30 78 37 33 2c 20 30 78 63 64 2c 20 30 78  , 0x73, 0xcd, 0x
1060: 36 32 2c 20 30 78 62 64 2c 0a 20 20 20 20 20 20  62, 0xbd,.      
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 20 20 20 20 20 30 78 61 38 2c 20 30 78 37 35 2c       0xa8, 0x75,
1090: 20 30 78 66 63 2c 20 30 78 37 33 2c 20 30 78 64   0xfc, 0x73, 0xd
10a0: 36 2c 20 30 78 38 32 2c 20 30 78 31 39 2c 20 30  6, 0x82, 0x19, 0
10b0: 78 65 30 2c 20 30 78 30 33 2c 20 30 78 36 62 2c  xe0, 0x03, 0x6b,
10c0: 20 30 78 37 61 2c 0a 20 20 20 20 20 20 20 20 20   0x7a,.         
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 30 78 30 62 2c 20 30 78 33 37 5d 29 3b 0a    0x0b, 0x37]);.
10f0: 20 20 20 20 20 20 20 20 6c 65 74 20 6d 20 3d 20          let m = 
1100: 76 65 63 21 5b 30 78 62 65 2c 20 30 78 30 37 2c  vec![0xbe, 0x07,
1110: 20 30 78 35 66 2c 20 30 78 63 35 2c 20 30 78 33   0x5f, 0xc5, 0x3
1120: 63 2c 20 30 78 38 31 2c 20 30 78 66 32 2c 20 30  c, 0x81, 0xf2, 0
1130: 78 64 35 2c 20 30 78 63 66 2c 20 30 78 31 34 2c  xd5, 0xcf, 0x14,
1140: 20 30 78 31 33 2c 20 30 78 31 36 2c 20 30 78 65   0x13, 0x16, 0xe
1150: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1160: 20 20 20 20 20 20 20 20 30 78 65 62 2c 20 30 78          0xeb, 0x
1170: 30 63 2c 20 30 78 37 62 2c 20 30 78 35 32 2c 20  0c, 0x7b, 0x52, 
1180: 30 78 32 38 2c 20 30 78 63 35 2c 20 30 78 32 61  0x28, 0xc5, 0x2a
1190: 2c 20 30 78 34 63 2c 20 30 78 36 32 2c 20 30 78  , 0x4c, 0x62, 0x
11a0: 63 62 2c 20 30 78 64 34 2c 20 30 78 34 62 2c 20  cb, 0xd4, 0x4b, 
11b0: 30 78 36 36 2c 0a 20 20 20 20 20 20 20 20 20 20  0x66,.          
11c0: 20 20 20 20 20 20 20 20 20 20 20 30 78 38 34 2c             0x84,
11d0: 20 30 78 39 62 2c 20 30 78 36 34 2c 20 30 78 32   0x9b, 0x64, 0x2
11e0: 34 2c 20 30 78 34 66 2c 20 30 78 66 63 2c 20 30  4, 0x4f, 0xfc, 0
11f0: 78 65 35 2c 20 30 78 65 63 2c 20 30 78 62 61 2c  xe5, 0xec, 0xba,
1200: 20 30 78 61 66 2c 20 30 78 33 33 2c 20 30 78 62   0xaf, 0x33, 0xb
1210: 64 2c 20 30 78 37 35 2c 0a 20 20 20 20 20 20 20  d, 0x75,.       
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
1230: 31 61 2c 20 30 78 31 61 2c 20 30 78 63 37 2c 20  1a, 0x1a, 0xc7, 
1240: 30 78 32 38 2c 20 30 78 64 34 2c 20 30 78 35 65  0x28, 0xd4, 0x5e
1250: 2c 20 30 78 36 63 2c 20 30 78 36 31 2c 20 30 78  , 0x6c, 0x61, 0x
1260: 32 39 2c 20 30 78 36 63 2c 20 30 78 64 63 2c 20  29, 0x6c, 0xdc, 
1270: 30 78 33 63 2c 20 30 78 30 31 2c 0a 20 20 20 20  0x3c, 0x01,.    
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 30 78 32 33 2c 20 30 78 33 35 2c 20 30 78 36   0x23, 0x35, 0x6
12a0: 31 2c 20 30 78 66 34 2c 20 30 78 31 64 2c 20 30  1, 0xf4, 0x1d, 0
12b0: 78 62 36 2c 20 30 78 36 63 2c 20 30 78 63 65 2c  xb6, 0x6c, 0xce,
12c0: 20 30 78 33 31 2c 20 30 78 34 61 2c 20 30 78 64   0x31, 0x4a, 0xd
12d0: 62 2c 20 30 78 33 31 2c 20 30 78 30 65 2c 0a 20  b, 0x31, 0x0e,. 
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 20 30 78 33 62 2c 20 30 78 65 38 2c 20      0x3b, 0xe8, 
1300: 30 78 32 35 2c 20 30 78 30 63 2c 20 30 78 34 36  0x25, 0x0c, 0x46
1310: 2c 20 30 78 66 30 2c 20 30 78 36 64 2c 20 30 78  , 0xf0, 0x6d, 0x
1320: 63 65 2c 20 30 78 65 61 2c 20 30 78 33 61 2c 20  ce, 0xea, 0x3a, 
1330: 30 78 37 66 2c 20 30 78 61 31 2c 20 30 78 33 34  0x7f, 0xa1, 0x34
1340: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1350: 20 20 20 20 20 20 20 30 78 38 30 2c 20 30 78 35         0x80, 0x5
1360: 37 2c 20 30 78 65 32 2c 20 30 78 66 36 2c 20 30  7, 0xe2, 0xf6, 0
1370: 78 35 35 2c 20 30 78 36 61 2c 20 30 78 64 36 2c  x55, 0x6a, 0xd6,
1380: 20 30 78 62 31 2c 20 30 78 33 31 2c 20 30 78 38   0xb1, 0x31, 0x8
1390: 61 2c 20 30 78 30 32 2c 20 30 78 34 61 2c 20 30  a, 0x02, 0x4a, 0
13a0: 78 38 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x83,.           
13b0: 20 20 20 20 20 20 20 20 20 20 30 78 38 66 2c 20            0x8f, 
13c0: 30 78 32 31 2c 20 30 78 61 66 2c 20 30 78 31 66  0x21, 0xaf, 0x1f
13d0: 2c 20 30 78 64 65 2c 20 30 78 30 34 2c 20 30 78  , 0xde, 0x04, 0x
13e0: 38 39 2c 20 30 78 37 37 2c 20 30 78 65 62 2c 20  89, 0x77, 0xeb, 
13f0: 30 78 34 38 2c 20 30 78 66 35 2c 20 30 78 39 66  0x48, 0xf5, 0x9f
1400: 2c 20 30 78 66 64 2c 0a 20 20 20 20 20 20 20 20  , 0xfd,.        
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 34               0x4
1420: 39 2c 20 30 78 32 34 2c 20 30 78 63 61 2c 20 30  9, 0x24, 0xca, 0
1430: 78 31 63 2c 20 30 78 36 30 2c 20 30 78 39 30 2c  x1c, 0x60, 0x90,
1440: 20 30 78 32 65 2c 20 30 78 35 32 2c 20 30 78 66   0x2e, 0x52, 0xf
1450: 30 2c 20 30 78 61 30 2c 20 30 78 38 39 2c 20 30  0, 0xa0, 0x89, 0
1460: 78 62 63 2c 20 30 78 37 36 2c 0a 20 20 20 20 20  xbc, 0x76,.     
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 30 78 38 39 2c 20 30 78 37 30 2c 20 30 78 34 30  0x89, 0x70, 0x40
1490: 2c 20 30 78 65 30 2c 20 30 78 38 32 2c 20 30 78  , 0xe0, 0x82, 0x
14a0: 66 39 2c 20 30 78 33 37 2c 20 30 78 37 36 2c 20  f9, 0x37, 0x76, 
14b0: 30 78 33 38 2c 20 30 78 34 38 2c 20 30 78 36 34  0x38, 0x48, 0x64
14c0: 2c 20 30 78 35 65 2c 20 30 78 30 37 2c 0a 20 20  , 0x5e, 0x07,.  
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 20 20 20 30 78 30 35 5d 3b 0a 0a 20 20 20 20 20     0x05];..     
14f0: 20 20 20 6c 65 74 20 63 5f 65 78 70 65 63 74 65     let c_expecte
1500: 64 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d =.            
1510: 76 65 63 21 5b 30 78 66 33 2c 20 30 78 66 66 2c  vec![0xf3, 0xff,
1520: 20 30 78 63 37 2c 20 30 78 37 30 2c 20 30 78 33   0xc7, 0x70, 0x3
1530: 66 2c 20 30 78 39 34 2c 20 30 78 30 30 2c 20 30  f, 0x94, 0x00, 0
1540: 78 65 35 2c 20 30 78 32 61 2c 20 30 78 37 64 2c  xe5, 0x2a, 0x7d,
1550: 20 30 78 66 62 2c 20 30 78 34 62 2c 20 30 78 33   0xfb, 0x4b, 0x3
1560: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1570: 20 20 20 20 30 78 33 33 2c 20 30 78 30 35 2c 20      0x33, 0x05, 
1580: 30 78 64 39 2c 20 30 78 38 65 2c 20 30 78 39 39  0xd9, 0x8e, 0x99
1590: 2c 20 30 78 33 62 2c 20 30 78 39 66 2c 20 30 78  , 0x3b, 0x9f, 0x
15a0: 34 38 2c 20 30 78 36 38 2c 20 30 78 31 32 2c 20  48, 0x68, 0x12, 
15b0: 30 78 37 33 2c 20 30 78 63 32 2c 20 30 78 39 36  0x73, 0xc2, 0x96
15c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15d0: 20 20 20 30 78 35 30 2c 20 30 78 62 61 2c 20 30     0x50, 0xba, 0
15e0: 78 33 32 2c 20 30 78 66 63 2c 20 30 78 37 36 2c  x32, 0xfc, 0x76,
15f0: 20 30 78 63 65 2c 20 30 78 34 38 2c 20 30 78 33   0xce, 0x48, 0x3
1600: 33 2c 20 30 78 32 65 2c 20 30 78 61 37 2c 20 30  3, 0x2e, 0xa7, 0
1610: 78 31 36 2c 20 30 78 34 64 2c 20 30 78 39 36 2c  x16, 0x4d, 0x96,
1620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1630: 20 20 30 78 61 34 2c 20 30 78 34 37 2c 20 30 78    0xa4, 0x47, 0x
1640: 36 66 2c 20 30 78 62 38 2c 20 30 78 63 35 2c 20  6f, 0xb8, 0xc5, 
1650: 30 78 33 31 2c 20 30 78 61 31 2c 20 30 78 31 38  0x31, 0xa1, 0x18
1660: 2c 20 30 78 36 61 2c 20 30 78 63 30 2c 20 30 78  , 0x6a, 0xc0, 0x
1670: 64 66 2c 20 30 78 63 31 2c 20 30 78 37 63 2c 0a  df, 0xc1, 0x7c,.
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 30 78 39 38 2c 20 30 78 64 63 2c 20 30 78 65   0x98, 0xdc, 0xe
16a0: 38 2c 20 30 78 37 62 2c 20 30 78 34 64 2c 20 30  8, 0x7b, 0x4d, 0
16b0: 78 61 37 2c 20 30 78 66 30 2c 20 30 78 31 31 2c  xa7, 0xf0, 0x11,
16c0: 20 30 78 65 63 2c 20 30 78 34 38 2c 20 30 78 63   0xec, 0x48, 0xc
16d0: 39 2c 20 30 78 37 32 2c 20 30 78 37 31 2c 0a 20  9, 0x72, 0x71,. 
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 30 78 64 32 2c 20 30 78 63 32 2c 20 30 78 30 66  0xd2, 0xc2, 0x0f
1700: 2c 20 30 78 39 62 2c 20 30 78 39 32 2c 20 30 78  , 0x9b, 0x92, 0x
1710: 38 66 2c 20 30 78 65 32 2c 20 30 78 32 37 2c 20  8f, 0xe2, 0x27, 
1720: 30 78 30 64 2c 20 30 78 36 66 2c 20 30 78 62 38  0x0d, 0x6f, 0xb8
1730: 2c 20 30 78 36 33 2c 20 30 78 64 35 2c 0a 20 20  , 0x63, 0xd5,.  
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1750: 78 31 37 2c 20 30 78 33 38 2c 20 30 78 62 34 2c  x17, 0x38, 0xb4,
1760: 20 30 78 38 65 2c 20 30 78 65 65 2c 20 30 78 65   0x8e, 0xee, 0xe
1770: 33 2c 20 30 78 31 34 2c 20 30 78 61 37 2c 20 30  3, 0x14, 0xa7, 0
1780: 78 63 63 2c 20 30 78 38 61 2c 20 30 78 62 39 2c  xcc, 0x8a, 0xb9,
1790: 20 30 78 33 32 2c 20 30 78 31 36 2c 0a 20 20 20   0x32, 0x16,.   
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
17b0: 34 35 2c 20 30 78 34 38 2c 20 30 78 65 35 2c 20  45, 0x48, 0xe5, 
17c0: 30 78 32 36 2c 20 30 78 61 65 2c 20 30 78 39 30  0x26, 0xae, 0x90
17d0: 2c 20 30 78 32 32 2c 20 30 78 34 33 2c 20 30 78  , 0x22, 0x43, 0x
17e0: 36 38 2c 20 30 78 35 31 2c 20 30 78 37 61 2c 20  68, 0x51, 0x7a, 
17f0: 30 78 63 66 2c 20 30 78 65 61 2c 0a 20 20 20 20  0xcf, 0xea,.    
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 62               0xb
1810: 64 2c 20 30 78 36 62 2c 20 30 78 62 33 2c 20 30  d, 0x6b, 0xb3, 0
1820: 78 37 33 2c 20 30 78 32 62 2c 20 30 78 63 30 2c  x73, 0x2b, 0xc0,
1830: 20 30 78 65 39 2c 20 30 78 64 61 2c 20 30 78 39   0xe9, 0xda, 0x9
1840: 39 2c 20 30 78 38 33 2c 20 30 78 32 62 2c 20 30  9, 0x83, 0x2b, 0
1850: 78 36 31 2c 20 30 78 63 61 2c 0a 20 20 20 20 20  x61, 0xca,.     
1860: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 31              0x01
1870: 2c 20 30 78 62 36 2c 20 30 78 64 65 2c 20 30 78  , 0xb6, 0xde, 0x
1880: 35 36 2c 20 30 78 32 34 2c 20 30 78 34 61 2c 20  56, 0x24, 0x4a, 
1890: 30 78 39 65 2c 20 30 78 38 38 2c 20 30 78 64 35  0x9e, 0x88, 0xd5
18a0: 2c 20 30 78 66 39 2c 20 30 78 62 33 2c 20 30 78  , 0xf9, 0xb3, 0x
18b0: 37 39 2c 20 30 78 37 33 2c 0a 20 20 20 20 20 20  79, 0x73,.      
18c0: 20 20 20 20 20 20 20 20 20 20 20 30 78 66 36 2c             0xf6,
18d0: 20 30 78 32 32 2c 20 30 78 61 34 2c 20 30 78 33   0x22, 0xa4, 0x3
18e0: 64 2c 20 30 78 31 34 2c 20 30 78 61 36 2c 20 30  d, 0x14, 0xa6, 0
18f0: 78 35 39 2c 20 30 78 39 62 2c 20 30 78 31 66 2c  x59, 0x9b, 0x1f,
1900: 20 30 78 36 35 2c 20 30 78 34 63 2c 20 30 78 62   0x65, 0x4c, 0xb
1910: 34 2c 20 30 78 35 61 2c 0a 20 20 20 20 20 20 20  4, 0x5a,.       
1920: 20 20 20 20 20 20 20 20 20 20 30 78 37 34 2c 20            0x74, 
1930: 30 78 65 33 2c 20 30 78 35 35 2c 20 30 78 61 35  0xe3, 0x55, 0xa5
1940: 5d 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 63  ];.        let c
1950: 20 3d 20 73 65 61 6c 28 26 6d 2c 20 26 6e 6f 6e   = seal(&m, &non
1960: 63 65 2c 20 26 66 69 72 73 74 6b 65 79 29 3b 0a  ce, &firstkey);.
1970: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 21 28          assert!(
1980: 63 20 3d 3d 20 63 5f 65 78 70 65 63 74 65 64 29  c == c_expected)
1990: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d 32  ;.        let m2
19a0: 20 3d 20 6f 70 65 6e 28 26 63 2c 20 26 6e 6f 6e   = open(&c, &non
19b0: 63 65 2c 20 26 66 69 72 73 74 6b 65 79 29 3b 0a  ce, &firstkey);.
19c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 21 28          assert!(
19d0: 4f 6b 28 6d 29 20 3d 3d 20 6d 32 29 3b 0a 20 20  Ok(m) == m2);.  
19e0: 20 20 7d 0a 0a 20 20 20 20 23 5b 63 66 67 28 61    }..    #[cfg(a
19f0: 6e 79 28 66 65 61 74 75 72 65 20 3d 20 22 73 65  ny(feature = "se
1a00: 72 64 65 22 2c 20 66 65 61 74 75 72 65 20 3d 20  rde", feature = 
1a10: 22 72 75 73 74 63 2d 73 65 72 69 61 6c 69 7a 65  "rustc-serialize
1a20: 22 29 29 5d 0a 20 20 20 20 23 5b 74 65 73 74 5d  "))].    #[test]
1a30: 0a 20 20 20 20 66 6e 20 74 65 73 74 5f 73 65 72  .    fn test_ser
1a40: 69 61 6c 69 73 61 74 69 6f 6e 28 29 20 7b 0a 20  ialisation() {. 
1a50: 20 20 20 20 20 20 20 75 73 65 20 74 65 73 74 5f         use test_
1a60: 75 74 69 6c 73 3a 3a 72 6f 75 6e 64 5f 74 72 69  utils::round_tri
1a70: 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
1a80: 74 21 28 3a 3a 69 6e 69 74 28 29 29 3b 0a 20 20  t!(::init());.  
1a90: 20 20 20 20 20 20 66 6f 72 20 5f 20 69 6e 20 30        for _ in 0
1aa0: 2e 2e 32 35 36 75 73 69 7a 65 20 7b 0a 20 20 20  ..256usize {.   
1ab0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6b 20 3d           let k =
1ac0: 20 67 65 6e 5f 6b 65 79 28 29 3b 0a 20 20 20 20   gen_key();.    
1ad0: 20 20 20 20 20 20 20 20 6c 65 74 20 6e 20 3d 20          let n = 
1ae0: 67 65 6e 5f 6e 6f 6e 63 65 28 29 3b 0a 20 20 20  gen_nonce();.   
1af0: 20 20 20 20 20 20 20 20 20 72 6f 75 6e 64 5f 74           round_t
1b00: 72 69 70 28 6b 29 3b 0a 20 20 20 20 20 20 20 20  rip(k);.        
1b10: 20 20 20 20 72 6f 75 6e 64 5f 74 72 69 70 28 6e      round_trip(n
1b20: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b30: 20 7d 0a 7d 0a 0a 23 5b 63 66 67 28 66 65 61 74   }.}..#[cfg(feat
1b40: 75 72 65 20 3d 20 22 62 65 6e 63 68 6d 61 72 6b  ure = "benchmark
1b50: 73 22 29 5d 0a 23 5b 63 66 67 28 74 65 73 74 29  s")].#[cfg(test)
1b60: 5d 0a 6d 6f 64 20 62 65 6e 63 68 20 7b 0a 20 20  ].mod bench {.  
1b70: 20 20 65 78 74 65 72 6e 20 63 72 61 74 65 20 74    extern crate t
1b80: 65 73 74 3b 0a 20 20 20 20 75 73 65 20 73 75 70  est;.    use sup
1b90: 65 72 3a 3a 2a 3b 0a 20 20 20 20 75 73 65 20 72  er::*;.    use r
1ba0: 61 6e 64 6f 6d 62 79 74 65 73 3a 3a 72 61 6e 64  andombytes::rand
1bb0: 6f 6d 62 79 74 65 73 3b 0a 0a 20 20 20 20 63 6f  ombytes;..    co
1bc0: 6e 73 74 20 42 45 4e 43 48 5f 53 49 5a 45 53 3a  nst BENCH_SIZES:
1bd0: 20 5b 75 73 69 7a 65 3b 20 31 34 5d 20 3d 20 5b   [usize; 14] = [
1be0: 30 2c 20 31 2c 20 32 2c 20 34 2c 20 38 2c 20 31  0, 1, 2, 4, 8, 1
1bf0: 36 2c 20 33 32 2c 20 36 34 2c 20 31 32 38 2c 20  6, 32, 64, 128, 
1c00: 32 35 36 2c 20 35 31 32 2c 20 31 30 32 34 2c 20  256, 512, 1024, 
1c10: 32 30 34 38 2c 20 34 30 39 36 5d 3b 0a 0a 20 20  2048, 4096];..  
1c20: 20 20 23 5b 62 65 6e 63 68 5d 0a 20 20 20 20 66    #[bench].    f
1c30: 6e 20 62 65 6e 63 68 5f 73 65 61 6c 5f 6f 70 65  n bench_seal_ope
1c40: 6e 28 62 3a 20 26 6d 75 74 20 74 65 73 74 3a 3a  n(b: &mut test::
1c50: 42 65 6e 63 68 65 72 29 20 7b 0a 20 20 20 20 20  Bencher) {.     
1c60: 20 20 20 61 73 73 65 72 74 21 28 3a 3a 69 6e 69     assert!(::ini
1c70: 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  t());.        le
1c80: 74 20 6b 20 3d 20 67 65 6e 5f 6b 65 79 28 29 3b  t k = gen_key();
1c90: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e 20 3d  .        let n =
1ca0: 20 67 65 6e 5f 6e 6f 6e 63 65 28 29 3b 0a 20 20   gen_nonce();.  
1cb0: 20 20 20 20 20 20 6c 65 74 20 6d 73 3a 20 56 65        let ms: Ve
1cc0: 63 3c 56 65 63 3c 75 38 3e 3e 20 3d 20 42 45 4e  c<Vec<u8>> = BEN
1cd0: 43 48 5f 53 49 5a 45 53 2e 69 74 65 72 28 29 2e  CH_SIZES.iter().
1ce0: 6d 61 70 28 7c 73 7c 20 72 61 6e 64 6f 6d 62 79  map(|s| randomby
1cf0: 74 65 73 28 2a 73 29 29 2e 63 6f 6c 6c 65 63 74  tes(*s)).collect
1d00: 28 29 3b 0a 20 20 20 20 20 20 20 20 62 2e 69 74  ();.        b.it
1d10: 65 72 28 7c 7c 20 66 6f 72 20 6d 20 69 6e 20 6d  er(|| for m in m
1d20: 73 2e 69 74 65 72 28 29 20 7b 0a 20 20 20 20 20  s.iter() {.     
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
1d40: 77 72 61 70 21 28 6f 70 65 6e 28 26 73 65 61 6c  wrap!(open(&seal
1d50: 28 26 6d 2c 20 26 6e 2c 20 26 6b 29 2c 20 26 6e  (&m, &n, &k), &n
1d60: 2c 20 26 6b 29 29 3b 0a 20 20 20 20 20 20 20 20  , &k));.        
1d70: 20 20 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 7d         });.    }
1d80: 0a 7d 0a                                         .}.