chez-libs

Hex Artifact Content
Login

Artifact 90cac0344f8a2b3ca4aaf2c7d8b5fed4507e9605:

Wiki page [(crypto tweetnacl)] by murphy 2018-01-31 20:26:38.
0000: 44 20 32 30 31 38 2d 30 31 2d 33 31 54 32 30 3a  D 2018-01-31T20:
0010: 32 36 3a 33 38 2e 37 39 34 0a 4c 20 28 63 72 79  26:38.794.L (cry
0020: 70 74 6f 5c 73 74 77 65 65 74 6e 61 63 6c 29 0a  pto\stweetnacl).
0030: 50 20 62 38 63 65 65 36 37 39 36 31 38 39 35 61  P b8cee67961895a
0040: 65 35 61 63 39 38 39 31 30 30 30 62 36 66 37 30  e5ac9891000b6f70
0050: 39 32 63 61 66 32 30 65 33 37 0a 55 20 6d 75 72  92caf20e37.U mur
0060: 70 68 79 0a 57 20 35 36 33 38 0a 3c 68 31 3e 54  phy.W 5638.<h1>T
0070: 77 65 65 74 4e 61 43 6c 20 42 69 6e 64 69 6e 67  weetNaCl Binding
0080: 73 3c 2f 68 31 3e 0d 0a 0d 0a 3c 68 32 3e 53 79  s</h1>....<h2>Sy
0090: 6e 6f 70 73 69 73 3c 2f 68 32 3e 0d 0a 0d 0a 3c  nopsis</h2>....<
00a0: 63 6f 64 65 3e 28 69 6d 70 6f 72 74 20 28 63 72  code>(import (cr
00b0: 79 70 74 6f 20 74 77 65 65 74 6e 61 63 6c 29 29  ypto tweetnacl))
00c0: 3c 2f 63 6f 64 65 3e 0d 0a 0d 0a 42 69 6e 64 69  </code>....Bindi
00d0: 6e 67 73 20 74 6f 20 74 68 65 20 5b 68 74 74 70  ngs to the [http
00e0: 73 3a 2f 2f 74 77 65 65 74 6e 61 63 6c 2e 63 72  s://tweetnacl.cr
00f0: 2e 79 70 2e 74 6f 2f 7c 54 77 65 65 74 4e 61 43  .yp.to/|TweetNaC
0100: 6c 5d 20 6c 69 62 72 61 72 79 20 6f 66 20 63 72  l] library of cr
0110: 79 70 74 6f 67 72 61 70 68 69 63 20 6f 70 65 72  yptographic oper
0120: 61 74 69 6f 6e 73 2e 0d 0a 0d 0a 3c 68 32 3e 4b  ations.....<h2>K
0130: 65 79 73 3c 2f 68 32 3e 0d 0a 0d 0a 3c 68 33 3e  eys</h2>....<h3>
0140: 72 65 63 6f 72 64 3a 20 3c 63 6f 64 65 3e 6b 65  record: <code>ke
0150: 79 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 3c  y</code></h3>..<
0160: 68 33 3e 70 72 6f 63 65 64 75 72 65 3a 20 3c 63  h3>procedure: <c
0170: 6f 64 65 3e 28 6b 65 79 3f 20 3c 69 3e 61 6e 79  ode>(key? <i>any
0180: 3c 2f 69 3e 29 3c 2f 63 6f 64 65 3e 3c 2f 68 33  </i>)</code></h3
0190: 3e 0d 0a 3c 68 33 3e 70 72 6f 63 65 64 75 72 65  >..<h3>procedure
01a0: 3a 20 3c 63 6f 64 65 3e 28 6d 61 6b 65 2d 6b 65  : <code>(make-ke
01b0: 79 20 3c 69 3e 61 6c 67 6f 72 69 74 68 6d 3c 2f  y <i>algorithm</
01c0: 69 3e 20 3c 69 3e 70 75 62 6c 69 63 3c 2f 69 3e  i> <i>public</i>
01d0: 20 3c 69 3e 73 65 63 72 65 74 3c 2f 69 3e 29 3c   <i>secret</i>)<
01e0: 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 3c 68 33  /code></h3>..<h3
01f0: 3e 70 72 6f 63 65 64 75 72 65 3a 20 3c 63 6f 64  >procedure: <cod
0200: 65 3e 28 6b 65 79 2d 61 6c 67 6f 72 69 74 68 6d  e>(key-algorithm
0210: 20 3c 69 3e 6b 65 79 3c 2f 69 3e 29 3c 2f 63 6f   <i>key</i>)</co
0220: 64 65 3e 3c 2f 68 33 3e 0d 0a 3c 68 33 3e 70 72  de></h3>..<h3>pr
0230: 6f 63 65 64 75 72 65 3a 20 3c 63 6f 64 65 3e 28  ocedure: <code>(
0240: 70 75 62 6c 69 63 2d 6b 65 79 20 3c 69 3e 6b 65  public-key <i>ke
0250: 79 3c 2f 69 3e 29 3c 2f 63 6f 64 65 3e 3c 2f 68  y</i>)</code></h
0260: 33 3e 0d 0a 3c 68 33 3e 70 72 6f 63 65 64 75 72  3>..<h3>procedur
0270: 65 3a 20 3c 63 6f 64 65 3e 28 73 65 63 72 65 74  e: <code>(secret
0280: 2d 6b 65 79 20 3c 69 3e 6b 65 79 3c 2f 69 3e 29  -key <i>key</i>)
0290: 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a  </code></h3>....
02a0: 4b 65 79 73 20 61 72 65 20 72 65 70 72 65 73 65  Keys are represe
02b0: 6e 74 65 64 20 62 79 20 72 65 63 6f 72 64 20 69  nted by record i
02c0: 6e 73 74 61 6e 63 65 73 20 74 68 61 74 20 68 6f  nstances that ho
02d0: 6c 64 20 61 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ld an algorithm 
02e0: 6e 61 6d 65 2c 20 61 20 70 75 62 6c 69 63 20 6b  name, a public k
02f0: 65 79 20 62 79 74 65 76 65 63 74 6f 72 20 61 6e  ey bytevector an
0300: 64 20 61 20 73 65 63 72 65 74 20 6b 65 79 20 62  d a secret key b
0310: 79 74 65 76 65 63 74 6f 72 2e 20 44 65 70 65 6e  ytevector. Depen
0320: 64 69 6e 67 20 6f 6e 20 74 68 65 20 61 6c 67 6f  ding on the algo
0330: 72 69 74 68 6d 20 61 6e 64 20 69 6e 74 65 6e 64  rithm and intend
0340: 65 64 20 75 73 65 20 6f 66 20 74 68 65 20 6b 65  ed use of the ke
0350: 79 2c 20 65 69 74 68 65 72 20 74 68 65 20 70 75  y, either the pu
0360: 62 6c 69 63 20 6f 72 20 73 65 63 72 65 74 20 63  blic or secret c
0370: 6f 6d 70 6f 6e 65 6e 74 20 6d 61 79 20 62 65 20  omponent may be 
0380: 3c 74 74 3e 23 66 3c 2f 74 74 3e 2e 0d 0a 0d 0a  <tt>#f</tt>.....
0390: 3c 68 33 3e 70 72 6f 63 65 64 75 72 65 3a 20 3c  <h3>procedure: <
03a0: 63 6f 64 65 3e 28 63 68 65 63 6b 2d 6b 65 79 20  code>(check-key 
03b0: 3c 69 3e 77 68 6f 3c 2f 69 3e 20 3c 69 3e 61 6c  <i>who</i> <i>al
03c0: 67 6f 72 69 74 68 6d 3c 2f 69 3e 20 3c 69 3e 61  gorithm</i> <i>a
03d0: 6e 79 3c 2f 69 3e 29 3c 2f 63 6f 64 65 3e 3c 2f  ny</i>)</code></
03e0: 68 33 3e 0d 0a 0d 0a 45 6e 73 75 72 65 73 20 74  h3>....Ensures t
03f0: 68 61 74 20 74 68 65 20 67 69 76 65 6e 20 76 61  hat the given va
0400: 6c 75 65 20 69 73 20 61 20 6b 65 79 20 77 69 74  lue is a key wit
0410: 68 20 74 68 65 20 67 69 76 65 6e 20 61 6c 67 6f  h the given algo
0420: 72 69 74 68 6d 20 6e 61 6d 65 20 61 6e 64 20 72  rithm name and r
0430: 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 2e 20  eturns the key. 
0440: 49 66 20 74 68 65 20 76 61 6c 75 65 20 64 6f 65  If the value doe
0450: 73 20 6e 6f 74 20 70 61 73 73 20 74 68 65 20 63  s not pass the c
0460: 68 65 63 6b 2c 20 61 6e 20 65 72 72 6f 72 20 63  heck, an error c
0470: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 72 61 69 73  ondition is rais
0480: 65 64 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ed that contains
0490: 20 61 20 3c 74 74 3e 26 77 68 6f 3c 2f 74 74 3e   a <tt>&who</tt>
04a0: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 6e 64 69 63   condition indic
04b0: 61 74 69 6e 67 20 74 68 65 20 67 69 76 65 6e 20  ating the given 
04c0: 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 0d 0a 3c 68 32  location.....<h2
04d0: 3e 41 73 79 6d 6d 65 74 72 69 63 20 42 6f 78 65  >Asymmetric Boxe
04e0: 73 3c 2f 68 32 3e 0d 0a 0d 0a 3c 68 33 3e 63 6f  s</h2>....<h3>co
04f0: 6e 73 74 61 6e 74 3a 20 3c 63 6f 64 65 3e 61 73  nstant: <code>as
0500: 79 6d 6d 65 74 72 69 63 2d 62 6f 78 2d 61 6c 67  ymmetric-box-alg
0510: 6f 72 69 74 68 6d 3c 2f 63 6f 64 65 3e 3c 2f 68  orithm</code></h
0520: 33 3e 0d 0a 0d 0a 54 68 65 20 6e 61 6d 65 20 6f  3>....The name o
0530: 66 20 74 68 65 20 61 73 79 6d 6d 65 74 72 69 63  f the asymmetric
0540: 20 62 6f 78 20 61 6c 67 6f 72 69 74 68 6d 2e 0d   box algorithm..
0550: 0a 0d 0a 3c 68 33 3e 63 6f 6e 73 74 61 6e 74 3a  ...<h3>constant:
0560: 20 3c 63 6f 64 65 3e 61 73 79 6d 6d 65 74 72 69   <code>asymmetri
0570: 63 2d 62 6f 78 2d 70 75 62 6c 69 63 6b 65 79 62  c-box-publickeyb
0580: 79 74 65 73 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e  ytes</code></h3>
0590: 0d 0a 3c 68 33 3e 63 6f 6e 73 74 61 6e 74 3a 20  ..<h3>constant: 
05a0: 3c 63 6f 64 65 3e 61 73 79 6d 6d 65 74 72 69 63  <code>asymmetric
05b0: 2d 62 6f 78 2d 73 65 63 72 65 74 6b 65 79 62 79  -box-secretkeyby
05c0: 74 65 73 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d  tes</code></h3>.
05d0: 0a 3c 68 33 3e 63 6f 6e 73 74 61 6e 74 3a 20 3c  .<h3>constant: <
05e0: 63 6f 64 65 3e 61 73 79 6d 6d 65 74 72 69 63 2d  code>asymmetric-
05f0: 62 6f 78 2d 6e 6f 6e 63 65 62 79 74 65 73 3c 2f  box-noncebytes</
0600: 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a 42 79  code></h3>....By
0610: 74 65 20 6c 65 6e 67 74 68 73 20 6f 66 20 61 6c  te lengths of al
0620: 67 6f 72 69 74 68 6d 20 70 61 72 61 6d 65 74 65  gorithm paramete
0630: 72 73 2e 0d 0a 0d 0a 3c 68 33 3e 70 72 6f 63 65  rs.....<h3>proce
0640: 64 75 72 65 3a 20 3c 63 6f 64 65 3e 28 6d 61 6b  dure: <code>(mak
0650: 65 2d 61 73 79 6d 6d 65 74 72 69 63 2d 62 6f 78  e-asymmetric-box
0660: 2d 6b 65 79 29 3c 2f 63 6f 64 65 3e 3c 2f 68 33  -key)</code></h3
0670: 3e 0d 0a 3c 68 33 3e 70 72 6f 63 65 64 75 72 65  >..<h3>procedure
0680: 3a 20 3c 63 6f 64 65 3e 28 6d 61 6b 65 2d 61 73  : <code>(make-as
0690: 79 6d 6d 65 74 72 69 63 2d 62 6f 78 2d 6b 65 79  ymmetric-box-key
06a0: 20 3c 69 3e 70 6f 72 74 3c 2f 69 3e 29 3c 2f 63   <i>port</i>)</c
06b0: 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a 47 65 6e  ode></h3>....Gen
06c0: 65 72 61 74 65 20 61 20 6e 65 77 20 6b 65 79 70  erate a new keyp
06d0: 61 69 72 20 75 73 69 6e 67 20 65 6e 74 72 6f 70  air using entrop
06e0: 79 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  y from the given
06f0: 20 70 6f 72 74 20 6f 72 20 66 72 6f 6d 20 3c 74   port or from <t
0700: 74 3e 28 63 75 72 72 65 6e 74 2d 65 6e 74 72 6f  t>(current-entro
0710: 70 79 2d 70 6f 72 74 29 3c 2f 74 74 3e 2e 0d 0a  py-port)</tt>...
0720: 0d 0a 3c 68 33 3e 70 72 6f 63 65 64 75 72 65 3a  ..<h3>procedure:
0730: 20 3c 63 6f 64 65 3e 28 28 61 73 79 6d 6d 65 74   <code>((asymmet
0740: 72 69 63 2d 62 6f 78 20 3c 69 3e 70 6b 3c 2f 69  ric-box <i>pk</i
0750: 3e 20 3c 69 3e 73 6b 3c 2f 69 3e 29 20 3c 69 3e  > <i>sk</i>) <i>
0760: 64 61 74 61 3c 2f 69 3e 20 3c 69 3e 6e 6f 6e 63  data</i> <i>nonc
0770: 65 3c 2f 69 3e 29 3c 2f 63 6f 64 65 3e 3c 2f 68  e</i>)</code></h
0780: 33 3e 0d 0a 3c 68 33 3e 70 72 6f 63 65 64 75 72  3>..<h3>procedur
0790: 65 3a 20 3c 63 6f 64 65 3e 28 28 61 73 79 6d 6d  e: <code>((asymm
07a0: 65 74 72 69 63 2d 75 6e 62 6f 78 20 3c 69 3e 70  etric-unbox <i>p
07b0: 6b 3c 2f 69 3e 20 3c 69 3e 73 6b 3c 2f 69 3e 29  k</i> <i>sk</i>)
07c0: 20 3c 69 3e 64 61 74 61 3c 2f 69 3e 20 3c 69 3e   <i>data</i> <i>
07d0: 6e 6f 6e 63 65 3c 2f 69 3e 29 3c 2f 63 6f 64 65  nonce</i>)</code
07e0: 3e 3c 2f 68 33 3e 0d 0a 0d 0a 50 65 72 66 6f 72  ></h3>....Perfor
07f0: 6d 20 6b 65 79 20 61 67 72 65 65 6d 65 6e 74 20  m key agreement 
0800: 61 6e 64 20 72 65 74 75 72 6e 20 62 6f 78 69 6e  and return boxin
0810: 67 20 61 6e 64 20 75 6e 62 6f 78 69 6e 67 20 70  g and unboxing p
0820: 72 6f 63 65 64 75 72 65 73 2e 0d 0a 0d 0a 3c 68  rocedures.....<h
0830: 32 3e 41 73 79 6d 6d 65 74 72 69 63 20 53 69 67  2>Asymmetric Sig
0840: 6e 61 74 75 72 65 73 3c 2f 68 32 3e 0d 0a 0d 0a  natures</h2>....
0850: 3c 68 33 3e 63 6f 6e 73 74 61 6e 74 3a 20 3c 63  <h3>constant: <c
0860: 6f 64 65 3e 61 73 79 6d 6d 65 74 72 69 63 2d 73  ode>asymmetric-s
0870: 69 67 6e 2d 61 6c 67 6f 72 69 74 68 6d 3c 2f 63  ign-algorithm</c
0880: 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a 54 68 65  ode></h3>....The
0890: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 61 73 79   name of the asy
08a0: 6d 6d 65 74 72 69 63 20 73 69 67 6e 61 74 75 72  mmetric signatur
08b0: 65 20 61 6c 67 6f 72 69 74 68 6d 2e 0d 0a 0d 0a  e algorithm.....
08c0: 3c 68 33 3e 63 6f 6e 73 74 61 6e 74 3a 20 3c 63  <h3>constant: <c
08d0: 6f 64 65 3e 61 73 79 6d 6d 65 74 72 69 63 2d 73  ode>asymmetric-s
08e0: 69 67 6e 2d 70 75 62 6c 69 63 6b 65 79 62 79 74  ign-publickeybyt
08f0: 65 73 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a  es</code></h3>..
0900: 3c 68 33 3e 63 6f 6e 73 74 61 6e 74 3a 20 3c 63  <h3>constant: <c
0910: 6f 64 65 3e 61 73 79 6d 6d 65 74 72 69 63 2d 73  ode>asymmetric-s
0920: 69 67 6e 2d 73 65 63 72 65 74 6b 65 79 62 79 74  ign-secretkeybyt
0930: 65 73 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a  es</code></h3>..
0940: 0d 0a 42 79 74 65 20 6c 65 6e 67 74 68 73 20 6f  ..Byte lengths o
0950: 66 20 61 6c 67 6f 72 69 74 68 6d 20 70 61 72 61  f algorithm para
0960: 6d 65 74 65 72 73 2e 0d 0a 0d 0a 3c 68 33 3e 70  meters.....<h3>p
0970: 72 6f 63 65 64 75 72 65 3a 20 3c 63 6f 64 65 3e  rocedure: <code>
0980: 28 6d 61 6b 65 2d 61 73 79 6d 6d 65 74 72 69 63  (make-asymmetric
0990: 2d 73 69 67 6e 2d 6b 65 79 29 3c 2f 63 6f 64 65  -sign-key)</code
09a0: 3e 3c 2f 68 33 3e 0d 0a 3c 68 33 3e 70 72 6f 63  ></h3>..<h3>proc
09b0: 65 64 75 72 65 3a 20 3c 63 6f 64 65 3e 28 6d 61  edure: <code>(ma
09c0: 6b 65 2d 61 73 79 6d 6d 65 74 72 69 63 2d 73 69  ke-asymmetric-si
09d0: 67 6e 2d 6b 65 79 20 3c 69 3e 70 6f 72 74 3c 2f  gn-key <i>port</
09e0: 69 3e 29 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d  i>)</code></h3>.
09f0: 0a 0d 0a 47 65 6e 65 72 61 74 65 20 61 20 6e 65  ...Generate a ne
0a00: 77 20 6b 65 79 70 61 69 72 20 75 73 69 6e 67 20  w keypair using 
0a10: 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65  entropy from the
0a20: 20 67 69 76 65 6e 20 70 6f 72 74 20 6f 72 20 66   given port or f
0a30: 72 6f 6d 20 3c 74 74 3e 28 63 75 72 72 65 6e 74  rom <tt>(current
0a40: 2d 65 6e 74 72 6f 70 79 2d 70 6f 72 74 29 3c 2f  -entropy-port)</
0a50: 74 74 3e 2e 0d 0a 0d 0a 3c 68 33 3e 70 72 6f 63  tt>.....<h3>proc
0a60: 65 64 75 72 65 3a 20 3c 63 6f 64 65 3e 28 28 61  edure: <code>((a
0a70: 73 79 6d 6d 65 74 72 69 63 2d 73 69 67 6e 20 3c  symmetric-sign <
0a80: 69 3e 73 6b 3c 2f 69 3e 29 20 3c 69 3e 64 61 74  i>sk</i>) <i>dat
0a90: 61 3c 2f 69 3e 29 3c 2f 63 6f 64 65 3e 3c 2f 68  a</i>)</code></h
0aa0: 33 3e 0d 0a 3c 68 33 3e 70 72 6f 63 65 64 75 72  3>..<h3>procedur
0ab0: 65 3a 20 3c 63 6f 64 65 3e 28 28 61 73 79 6d 6d  e: <code>((asymm
0ac0: 65 74 72 69 63 2d 76 65 72 69 66 79 20 3c 69 3e  etric-verify <i>
0ad0: 70 6b 3c 2f 69 3e 29 20 3c 69 3e 64 61 74 61 3c  pk</i>) <i>data<
0ae0: 2f 69 3e 29 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e  /i>)</code></h3>
0af0: 0d 0a 0d 0a 43 72 65 61 74 65 20 73 69 67 6e 61  ....Create signa
0b00: 74 75 72 65 20 61 6e 64 20 76 65 72 69 66 69 63  ture and verific
0b10: 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 73  ation procedures
0b20: 2e 0d 0a 0d 0a 3c 68 32 3e 53 79 6d 6d 65 74 72  .....<h2>Symmetr
0b30: 69 63 20 42 6f 78 65 73 3c 2f 68 32 3e 0d 0a 0d  ic Boxes</h2>...
0b40: 0a 3c 68 33 3e 63 6f 6e 73 74 61 6e 74 3a 20 3c  .<h3>constant: <
0b50: 63 6f 64 65 3e 73 79 6d 6d 65 74 72 69 63 2d 62  code>symmetric-b
0b60: 6f 78 2d 61 6c 67 6f 72 69 74 68 6d 3c 2f 63 6f  ox-algorithm</co
0b70: 64 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a 54 68 65 20  de></h3>....The 
0b80: 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d 6d  name of the symm
0b90: 65 74 72 69 63 20 62 6f 78 20 61 6c 67 6f 72 69  etric box algori
0ba0: 74 68 6d 2e 0d 0a 0d 0a 3c 68 33 3e 63 6f 6e 73  thm.....<h3>cons
0bb0: 74 61 6e 74 3a 20 3c 63 6f 64 65 3e 73 79 6d 6d  tant: <code>symm
0bc0: 65 74 72 69 63 2d 62 6f 78 2d 6b 65 79 62 79 74  etric-box-keybyt
0bd0: 65 73 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a  es</code></h3>..
0be0: 3c 68 33 3e 63 6f 6e 73 74 61 6e 74 3a 20 3c 63  <h3>constant: <c
0bf0: 6f 64 65 3e 73 79 6d 6d 65 74 72 69 63 2d 62 6f  ode>symmetric-bo
0c00: 78 2d 6e 6f 6e 63 65 62 79 74 65 73 3c 2f 63 6f  x-noncebytes</co
0c10: 64 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a 42 79 74 65  de></h3>....Byte
0c20: 20 6c 65 6e 67 74 68 73 20 6f 66 20 61 6c 67 6f   lengths of algo
0c30: 72 69 74 68 6d 20 70 61 72 61 6d 65 74 65 72 73  rithm parameters
0c40: 2e 0d 0a 0d 0a 3c 68 33 3e 70 72 6f 63 65 64 75  .....<h3>procedu
0c50: 72 65 3a 20 3c 63 6f 64 65 3e 28 6d 61 6b 65 2d  re: <code>(make-
0c60: 73 79 6d 6d 65 74 72 69 63 2d 62 6f 78 2d 6b 65  symmetric-box-ke
0c70: 79 29 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a  y)</code></h3>..
0c80: 3c 68 33 3e 70 72 6f 63 65 64 75 72 65 3a 20 3c  <h3>procedure: <
0c90: 63 6f 64 65 3e 28 6d 61 6b 65 2d 73 79 6d 6d 65  code>(make-symme
0ca0: 74 72 69 63 2d 62 6f 78 2d 6b 65 79 20 3c 69 3e  tric-box-key <i>
0cb0: 70 6f 72 74 3c 2f 69 3e 29 3c 2f 63 6f 64 65 3e  port</i>)</code>
0cc0: 3c 2f 68 33 3e 0d 0a 0d 0a 47 65 6e 65 72 61 74  </h3>....Generat
0cd0: 65 20 61 20 6e 65 77 20 6b 65 79 20 75 73 69 6e  e a new key usin
0ce0: 67 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74  g entropy from t
0cf0: 68 65 20 67 69 76 65 6e 20 70 6f 72 74 20 6f 72  he given port or
0d00: 20 66 72 6f 6d 20 3c 74 74 3e 28 63 75 72 72 65   from <tt>(curre
0d10: 6e 74 2d 65 6e 74 72 6f 70 79 2d 70 6f 72 74 29  nt-entropy-port)
0d20: 3c 2f 74 74 3e 2e 0d 0a 0d 0a 3c 68 33 3e 70 72  </tt>.....<h3>pr
0d30: 6f 63 65 64 75 72 65 3a 20 3c 63 6f 64 65 3e 28  ocedure: <code>(
0d40: 64 65 72 69 76 65 2d 73 79 6d 6d 65 74 72 69 63  derive-symmetric
0d50: 2d 62 6f 78 2d 6b 65 79 20 3c 69 3e 70 6b 3c 2f  -box-key <i>pk</
0d60: 69 3e 20 3c 69 3e 73 6b 3c 2f 69 3e 29 3c 2f 63  i> <i>sk</i>)</c
0d70: 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a 44 65 72  ode></h3>....Der
0d80: 69 76 65 20 61 20 73 79 6d 6d 65 74 72 69 63 20  ive a symmetric 
0d90: 62 6f 78 20 6b 65 79 20 74 68 72 6f 75 67 68 20  box key through 
0da0: 61 6e 20 61 73 79 6d 6d 65 74 72 69 63 20 62 6f  an asymmetric bo
0db0: 78 20 6b 65 79 20 61 67 72 65 65 6d 65 6e 74 2e  x key agreement.
0dc0: 0d 0a 0d 0a 3c 68 33 3e 70 72 6f 63 65 64 75 72  ....<h3>procedur
0dd0: 65 3a 20 3c 63 6f 64 65 3e 28 28 73 79 6d 6d 65  e: <code>((symme
0de0: 74 72 69 63 2d 62 6f 78 20 3c 69 3e 6b 3c 2f 69  tric-box <i>k</i
0df0: 3e 29 20 3c 69 3e 64 61 74 61 3c 2f 69 3e 20 3c  >) <i>data</i> <
0e00: 69 3e 6e 6f 6e 63 65 3c 2f 69 3e 29 3c 2f 63 6f  i>nonce</i>)</co
0e10: 64 65 3e 3c 2f 68 33 3e 0d 0a 3c 68 33 3e 70 72  de></h3>..<h3>pr
0e20: 6f 63 65 64 75 72 65 3a 20 3c 63 6f 64 65 3e 28  ocedure: <code>(
0e30: 28 73 79 6d 6d 65 74 72 69 63 2d 75 6e 62 6f 78  (symmetric-unbox
0e40: 20 3c 69 3e 6b 3c 2f 69 3e 29 20 3c 69 3e 64 61   <i>k</i>) <i>da
0e50: 74 61 3c 2f 69 3e 20 3c 69 3e 6e 6f 6e 63 65 3c  ta</i> <i>nonce<
0e60: 2f 69 3e 29 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e  /i>)</code></h3>
0e70: 0d 0a 0d 0a 43 72 65 61 74 65 20 62 6f 78 69 6e  ....Create boxin
0e80: 67 20 61 6e 64 20 75 6e 62 6f 78 69 6e 67 20 70  g and unboxing p
0e90: 72 6f 63 65 64 75 72 65 73 2e 0d 0a 0d 0a 3c 68  rocedures.....<h
0ea0: 32 3e 53 79 6d 6d 65 74 72 69 63 20 53 69 67 6e  2>Symmetric Sign
0eb0: 61 74 75 72 65 73 3c 2f 68 32 3e 0d 0a 0d 0a 3c  atures</h2>....<
0ec0: 68 33 3e 63 6f 6e 73 74 61 6e 74 3a 20 3c 63 6f  h3>constant: <co
0ed0: 64 65 3e 73 79 6d 6d 65 74 72 69 63 2d 73 69 67  de>symmetric-sig
0ee0: 6e 2d 61 6c 67 6f 72 69 74 68 6d 3c 2f 63 6f 64  n-algorithm</cod
0ef0: 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a 54 68 65 20 6e  e></h3>....The n
0f00: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d 6d 65  ame of the symme
0f10: 74 72 69 63 20 73 69 67 6e 61 74 75 72 65 20 61  tric signature a
0f20: 6c 67 6f 72 69 74 68 6d 2e 0d 0a 0d 0a 3c 68 33  lgorithm.....<h3
0f30: 3e 63 6f 6e 73 74 61 6e 74 3a 20 3c 63 6f 64 65  >constant: <code
0f40: 3e 73 79 6d 6d 65 74 72 69 63 2d 73 69 67 6e 2d  >symmetric-sign-
0f50: 6b 65 79 62 79 74 65 73 3c 2f 63 6f 64 65 3e 3c  keybytes</code><
0f60: 2f 68 33 3e 0d 0a 0d 0a 42 79 74 65 20 6c 65 6e  /h3>....Byte len
0f70: 67 74 68 73 20 6f 66 20 61 6c 67 6f 72 69 74 68  gths of algorith
0f80: 6d 20 70 61 72 61 6d 65 74 65 72 73 2e 0d 0a 0d  m parameters....
0f90: 0a 3c 68 33 3e 70 72 6f 63 65 64 75 72 65 3a 20  .<h3>procedure: 
0fa0: 3c 63 6f 64 65 3e 28 6d 61 6b 65 2d 73 79 6d 6d  <code>(make-symm
0fb0: 65 74 72 69 63 2d 73 69 67 6e 2d 6b 65 79 29 3c  etric-sign-key)<
0fc0: 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 3c 68 33  /code></h3>..<h3
0fd0: 3e 70 72 6f 63 65 64 75 72 65 3a 20 3c 63 6f 64  >procedure: <cod
0fe0: 65 3e 28 6d 61 6b 65 2d 73 79 6d 6d 65 74 72 69  e>(make-symmetri
0ff0: 63 2d 73 69 67 6e 2d 6b 65 79 20 3c 69 3e 70 6f  c-sign-key <i>po
1000: 72 74 3c 2f 69 3e 29 3c 2f 63 6f 64 65 3e 3c 2f  rt</i>)</code></
1010: 68 33 3e 0d 0a 0d 0a 47 65 6e 65 72 61 74 65 20  h3>....Generate 
1020: 61 20 6e 65 77 20 6b 65 79 20 75 73 69 6e 67 20  a new key using 
1030: 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65  entropy from the
1040: 20 67 69 76 65 6e 20 70 6f 72 74 20 6f 72 20 66   given port or f
1050: 72 6f 6d 20 3c 74 74 3e 28 63 75 72 72 65 6e 74  rom <tt>(current
1060: 2d 65 6e 74 72 6f 70 79 2d 70 6f 72 74 29 3c 2f  -entropy-port)</
1070: 74 74 3e 2e 0d 0a 0d 0a 3c 68 33 3e 70 72 6f 63  tt>.....<h3>proc
1080: 65 64 75 72 65 3a 20 3c 63 6f 64 65 3e 28 28 73  edure: <code>((s
1090: 79 6d 6d 65 74 72 69 63 2d 73 69 67 6e 20 3c 69  ymmetric-sign <i
10a0: 3e 6b 3c 2f 69 3e 29 20 3c 69 3e 64 61 74 61 3c  >k</i>) <i>data<
10b0: 2f 69 3e 29 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e  /i>)</code></h3>
10c0: 0d 0a 3c 68 33 3e 70 72 6f 63 65 64 75 72 65 3a  ..<h3>procedure:
10d0: 20 3c 63 6f 64 65 3e 28 28 73 79 6d 6d 65 74 72   <code>((symmetr
10e0: 69 63 2d 76 65 72 69 66 79 20 3c 69 3e 6b 3c 2f  ic-verify <i>k</
10f0: 69 3e 29 20 3c 69 3e 64 61 74 61 3c 2f 69 3e 29  i>) <i>data</i>)
1100: 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a  </code></h3>....
1110: 43 72 65 61 74 65 20 73 69 67 6e 61 74 75 72 65  Create signature
1120: 20 61 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f   and verificatio
1130: 6e 20 70 72 6f 63 65 64 75 72 65 73 2e 0d 0a 0d  n procedures....
1140: 0a 3c 68 32 3e 50 73 65 75 64 6f 2d 52 61 6e 64  .<h2>Pseudo-Rand
1150: 6f 6d 20 53 74 72 65 61 6d 73 3c 2f 68 32 3e 0d  om Streams</h2>.
1160: 0a 0d 0a 3c 68 33 3e 63 6f 6e 73 74 61 6e 74 3a  ...<h3>constant:
1170: 20 3c 63 6f 64 65 3e 72 61 6e 64 6f 6d 2d 73 74   <code>random-st
1180: 72 65 61 6d 2d 61 6c 67 6f 72 69 74 68 6d 3c 2f  ream-algorithm</
1190: 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a 54 68  code></h3>....Th
11a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 73  e name of the ps
11b0: 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62  eudo-random numb
11c0: 65 72 20 67 65 6e 65 72 61 74 6f 72 20 61 6c 67  er generator alg
11d0: 6f 72 69 74 68 6d 2e 0d 0a 0d 0a 3c 68 33 3e 63  orithm.....<h3>c
11e0: 6f 6e 73 74 61 6e 74 3a 20 3c 63 6f 64 65 3e 72  onstant: <code>r
11f0: 61 6e 64 6f 6d 2d 73 74 72 65 61 6d 2d 6b 65 79  andom-stream-key
1200: 62 79 74 65 73 3c 2f 63 6f 64 65 3e 3c 2f 68 33  bytes</code></h3
1210: 3e 0d 0a 3c 68 33 3e 63 6f 6e 73 74 61 6e 74 3a  >..<h3>constant:
1220: 20 3c 63 6f 64 65 3e 72 61 6e 64 6f 6d 2d 73 74   <code>random-st
1230: 72 65 61 6d 2d 6e 6f 6e 63 65 62 79 74 65 73 3c  ream-noncebytes<
1240: 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a 42  /code></h3>....B
1250: 79 74 65 20 6c 65 6e 67 74 68 73 20 6f 66 20 61  yte lengths of a
1260: 6c 67 6f 72 69 74 68 6d 20 70 61 72 61 6d 65 74  lgorithm paramet
1270: 65 72 73 2e 0d 0a 0d 0a 3c 68 33 3e 70 72 6f 63  ers.....<h3>proc
1280: 65 64 75 72 65 3a 20 3c 63 6f 64 65 3e 28 6d 61  edure: <code>(ma
1290: 6b 65 2d 72 61 6e 64 6f 6d 2d 73 74 72 65 61 6d  ke-random-stream
12a0: 2d 6b 65 79 29 3c 2f 63 6f 64 65 3e 3c 2f 68 33  -key)</code></h3
12b0: 3e 0d 0a 3c 68 33 3e 70 72 6f 63 65 64 75 72 65  >..<h3>procedure
12c0: 3a 20 3c 63 6f 64 65 3e 28 6d 61 6b 65 2d 72 61  : <code>(make-ra
12d0: 6e 64 6f 6d 2d 73 74 72 65 61 6d 2d 6b 65 79 20  ndom-stream-key 
12e0: 3c 69 3e 70 6f 72 74 3c 2f 69 3e 29 3c 2f 63 6f  <i>port</i>)</co
12f0: 64 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a 47 65 6e 65  de></h3>....Gene
1300: 72 61 74 65 20 61 20 6e 65 77 20 6b 65 79 20 75  rate a new key u
1310: 73 69 6e 67 20 65 6e 74 72 6f 70 79 20 66 72 6f  sing entropy fro
1320: 6d 20 74 68 65 20 67 69 76 65 6e 20 70 6f 72 74  m the given port
1330: 20 6f 72 20 66 72 6f 6d 20 3c 74 74 3e 28 63 75   or from <tt>(cu
1340: 72 72 65 6e 74 2d 65 6e 74 72 6f 70 79 2d 70 6f  rrent-entropy-po
1350: 72 74 29 3c 2f 74 74 3e 2e 0d 0a 0d 0a 3c 68 33  rt)</tt>.....<h3
1360: 3e 70 72 6f 63 65 64 75 72 65 3a 20 3c 63 6f 64  >procedure: <cod
1370: 65 3e 28 64 65 72 69 76 65 2d 72 61 6e 64 6f 6d  e>(derive-random
1380: 2d 73 74 72 65 61 6d 2d 6b 65 79 20 3c 69 3e 70  -stream-key <i>p
1390: 6b 3c 2f 69 3e 20 3c 69 3e 73 6b 3c 2f 69 3e 29  k</i> <i>sk</i>)
13a0: 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 0d 0a  </code></h3>....
13b0: 44 65 72 69 76 65 20 61 20 70 73 65 75 64 6f 2d  Derive a pseudo-
13c0: 72 61 6e 64 6f 6d 20 73 74 72 65 61 6d 20 6b 65  random stream ke
13d0: 79 20 74 68 72 6f 75 67 68 20 61 6e 20 61 73 79  y through an asy
13e0: 6d 6d 65 74 72 69 63 20 62 6f 78 20 6b 65 79 20  mmetric box key 
13f0: 61 67 72 65 65 6d 65 6e 74 2e 0d 0a 0d 0a 3c 68  agreement.....<h
1400: 33 3e 70 72 6f 63 65 64 75 72 65 3a 20 3c 63 6f  3>procedure: <co
1410: 64 65 3e 28 6f 70 65 6e 2d 72 61 6e 64 6f 6d 2d  de>(open-random-
1420: 73 74 72 65 61 6d 20 3c 69 3e 6b 3c 2f 69 3e 20  stream <i>k</i> 
1430: 3c 69 3e 6e 6f 6e 63 65 3c 2f 69 3e 29 3c 2f 63  <i>nonce</i>)</c
1440: 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 3c 68 33 3e 70  ode></h3>..<h3>p
1450: 72 6f 63 65 64 75 72 65 3a 20 3c 63 6f 64 65 3e  rocedure: <code>
1460: 28 6f 70 65 6e 2d 72 61 6e 64 6f 6d 2d 73 74 72  (open-random-str
1470: 65 61 6d 20 3c 69 3e 6b 3c 2f 69 3e 20 3c 69 3e  eam <i>k</i> <i>
1480: 6e 6f 6e 63 65 3c 2f 69 3e 20 3c 69 3e 6c 69 6d  nonce</i> <i>lim
1490: 69 74 3c 2f 69 3e 29 3c 2f 63 6f 64 65 3e 3c 2f  it</i>)</code></
14a0: 68 33 3e 0d 0a 0d 0a 4f 70 65 6e 20 61 20 62 69  h3>....Open a bi
14b0: 6e 61 72 79 20 69 6e 70 75 74 20 70 6f 72 74 20  nary input port 
14c0: 62 61 63 6b 65 64 20 62 79 20 61 20 70 73 65 75  backed by a pseu
14d0: 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  do-random number
14e0: 20 67 65 6e 65 72 61 74 6f 72 2e 20 54 68 65 20   generator. The 
14f0: 64 65 66 61 75 6c 74 20 6c 69 6d 69 74 2c 20 61  default limit, a
1500: 66 74 65 72 20 77 68 69 63 68 20 74 68 65 20 70  fter which the p
1510: 6f 72 74 20 77 69 6c 6c 20 73 69 67 6e 61 6c 20  ort will signal 
1520: 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 69 73 20  end of file, is 
1530: 31 20 47 69 42 20 6f 66 20 72 61 6e 64 6f 6d 20  1 GiB of random 
1540: 64 61 74 61 2c 20 62 75 74 20 3c 74 74 3e 23 66  data, but <tt>#f
1550: 3c 2f 74 74 3e 20 6f 72 20 3c 74 74 3e 2b 69 6e  </tt> or <tt>+in
1560: 66 2e 30 3c 2f 74 74 3e 20 6d 61 79 20 62 65 20  f.0</tt> may be 
1570: 70 61 73 73 65 64 20 74 6f 20 64 65 61 63 74 69  passed to deacti
1580: 76 61 74 65 20 74 68 65 20 6c 69 6d 69 74 2e 0d  vate the limit..
1590: 0a 0d 0a 3c 68 32 3e 4d 65 73 73 61 67 65 20 44  ...<h2>Message D
15a0: 69 67 65 73 74 73 3c 2f 68 32 3e 0d 0a 0d 0a 3c  igests</h2>....<
15b0: 68 33 3e 63 6f 6e 73 74 61 6e 74 3a 20 3c 63 6f  h3>constant: <co
15c0: 64 65 3e 68 61 73 68 2d 61 6c 67 6f 72 69 74 68  de>hash-algorith
15d0: 6d 3c 2f 63 6f 64 65 3e 3c 2f 68 33 3e 0d 0a 0d  m</code></h3>...
15e0: 0a 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65  .The name of the
15f0: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
1600: 61 6c 67 6f 72 69 74 68 6d 2e 0d 0a 0d 0a 3c 68  algorithm.....<h
1610: 33 3e 70 72 6f 63 65 64 75 72 65 3a 20 3c 63 6f  3>procedure: <co
1620: 64 65 3e 28 68 61 73 68 20 3c 69 3e 64 61 74 61  de>(hash <i>data
1630: 3c 2f 69 3e 29 3c 2f 63 6f 64 65 3e 3c 2f 68 33  </i>)</code></h3
1640: 3e 0d 0a 0d 0a 43 6f 6d 70 75 74 65 20 74 68 65  >....Compute the
1650: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
1660: 6f 66 20 62 69 6e 61 72 79 20 64 61 74 61 2e 0d  of binary data..
1670: 0a 0a 5a 20 38 65 62 64 64 39 64 63 35 35 33 30  ..Z 8ebdd9dc5530
1680: 66 38 31 66 30 33 32 64 39 33 31 30 62 31 30 32  f81f032d9310b102
1690: 66 33 37 30 0a                                   f370.