Hex Artifact Content
Not logged in

Artifact 3fe7fc9d238cc11384c3a5bcb0bebb4cd675362b:


0000: 5c 20 74 65 73 74 20 66 6f 72 20 65 64 32 35 35  \ test for ed255
0010: 31 39 20 2d 20 66 69 72 73 74 20 66 75 7a 7a 65  19 - first fuzze
0020: 64 2c 20 74 68 65 6e 20 64 65 74 65 72 6d 69 6e  d, then determin
0030: 69 73 74 69 63 20 74 65 73 74 0a 0a 72 65 71 75  istic test..requ
0040: 69 72 65 20 2e 2e 2f 6e 65 74 32 6f 2e 66 73 0a  ire ../net2o.fs.
0050: 0a 56 61 72 69 61 62 6c 65 20 74 65 73 74 24 0a  .Variable test$.
0060: 0a 3a 20 3e 73 6b 73 69 67 20 28 20 2d 2d 20 29  .: >sksig ( -- )
0070: 0a 20 20 20 20 70 6b 63 20 6b 65 79 73 69 7a 65  .    pkc keysize
0080: 20 73 6b 63 20 6b 65 79 73 69 7a 65 0a 20 20 20   skc keysize.   
0090: 20 63 3a 30 6b 65 79 20 3e 6b 65 79 65 64 2d 68   c:0key >keyed-h
00a0: 61 73 68 20 73 6b 73 69 67 20 24 32 30 20 6b 65  ash sksig $20 ke
00b0: 63 63 61 6b 3e 20 3b 0a 3a 20 67 65 6e 2d 70 61  ccak> ;.: gen-pa
00c0: 69 72 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 73  irs ( -- ).    s
00d0: 6b 63 20 70 6b 63 20 65 64 2d 6b 65 79 70 61 69  kc pkc ed-keypai
00e0: 72 0a 20 20 20 20 73 74 73 6b 63 20 73 74 70 6b  r.    stskc stpk
00f0: 63 20 65 64 2d 6b 65 79 70 61 69 72 20 20 3e 73  c ed-keypair  >s
0100: 6b 73 69 67 20 3b 0a 3a 20 67 65 6e 2d 73 69 67  ksig ;.: gen-sig
0110: 20 28 20 2d 2d 20 61 64 64 72 20 29 0a 20 20 20   ( -- addr ).   
0120: 20 63 3a 30 6b 65 79 20 74 65 73 74 24 20 24 40   c:0key test$ $@
0130: 20 63 3a 68 61 73 68 20 73 6b 73 69 67 20 73 6b   c:hash sksig sk
0140: 63 20 70 6b 63 20 65 64 2d 73 69 67 6e 20 64 72  c pkc ed-sign dr
0150: 6f 70 20 3b 0a 3a 20 63 68 65 63 6b 2d 73 69 67  op ;.: check-sig
0160: 20 28 20 61 64 64 72 20 2d 2d 20 66 6c 61 67 20   ( addr -- flag 
0170: 29 0a 20 20 20 20 63 3a 30 6b 65 79 20 74 65 73  ).    c:0key tes
0180: 74 24 20 24 40 20 63 3a 68 61 73 68 20 70 6b 63  t$ $@ c:hash pkc
0190: 20 65 64 2d 76 65 72 69 66 79 20 3b 0a 3a 20 63   ed-verify ;.: c
01a0: 68 65 63 6b 2d 73 69 67 30 20 28 20 61 64 64 72  heck-sig0 ( addr
01b0: 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20 20 20 63   -- flag ).    c
01c0: 3a 30 6b 65 79 20 74 65 73 74 24 20 24 40 20 31  :0key test$ $@ 1
01d0: 2d 20 63 3a 68 61 73 68 20 70 6b 63 20 65 64 2d  - c:hash pkc ed-
01e0: 76 65 72 69 66 79 20 3b 0a 3a 20 63 68 65 63 6b  verify ;.: check
01f0: 2d 64 68 20 28 20 2d 2d 20 66 6c 61 67 20 29 0a  -dh ( -- flag ).
0200: 20 20 20 20 73 6b 63 20 73 74 70 6b 63 20 70 61      skc stpkc pa
0210: 64 20 65 64 2d 64 68 20 73 74 73 6b 63 20 70 6b  d ed-dh stskc pk
0220: 63 20 70 61 64 20 24 32 30 20 2b 20 65 64 2d 64  c pad $20 + ed-d
0230: 68 20 73 74 72 3d 20 3b 0a 0a 3a 20 64 6f 2d 66  h str= ;..: do-f
0240: 75 7a 7a 20 28 20 2d 2d 20 29 20 20 73 22 20 41  uzz ( -- )  s" A
0250: 22 20 74 65 73 74 24 20 24 2b 21 20 67 65 6e 2d  " test$ $+! gen-
0260: 70 61 69 72 73 0a 20 20 20 20 67 65 6e 2d 73 69  pairs.    gen-si
0270: 67 20 64 75 70 20 63 68 65 63 6b 2d 73 69 67 20  g dup check-sig 
0280: 73 77 61 70 20 63 68 65 63 6b 2d 73 69 67 30 20  swap check-sig0 
0290: 30 3d 20 61 6e 64 20 63 68 65 63 6b 2d 64 68 20  0= and check-dh 
02a0: 61 6e 64 0a 20 20 20 20 49 46 20 2e 22 20 2b 22  and.    IF ." +"
02b0: 20 45 4c 53 45 20 2e 22 20 2d 22 20 54 48 45 4e   ELSE ." -" THEN
02c0: 20 3b 0a 3a 20 66 75 7a 7a 65 73 20 28 20 6e 20   ;.: fuzzes ( n 
02d0: 2d 2d 20 29 20 30 20 3f 44 4f 20 20 64 6f 2d 66  -- ) 0 ?DO  do-f
02e0: 75 7a 7a 20 20 4c 4f 4f 50 20 3b 0a 3a 20 66 75  uzz  LOOP ;.: fu
02f0: 7a 7a 6c 20 28 20 6e 20 2d 2d 20 29 20 20 30 20  zzl ( n -- )  0 
0300: 3f 44 4f 20 20 63 6f 6c 73 20 49 27 20 49 20 2d  ?DO  cols I' I -
0310: 20 75 6d 69 6e 20 66 75 7a 7a 65 73 20 63 6f 6c   umin fuzzes col
0320: 73 20 2b 4c 4f 4f 50 20 3b 0a 3a 20 73 69 67 73  s +LOOP ;.: sigs
0330: 20 28 20 6e 20 2d 2d 20 29 20 20 20 30 20 3f 44   ( n -- )   0 ?D
0340: 4f 20 20 67 65 6e 2d 73 69 67 20 64 72 6f 70 20  O  gen-sig drop 
0350: 20 4c 4f 4f 50 20 3b 0a 3a 20 63 68 65 63 6b 73   LOOP ;.: checks
0360: 69 67 73 20 28 20 6e 20 2d 2d 20 29 20 20 67 65  igs ( n -- )  ge
0370: 6e 2d 73 69 67 20 73 77 61 70 20 20 30 20 3f 44  n-sig swap  0 ?D
0380: 4f 20 20 64 75 70 20 63 68 65 63 6b 2d 73 69 67  O  dup check-sig
0390: 20 64 72 6f 70 20 20 4c 4f 4f 50 20 20 64 72 6f   drop  LOOP  dro
03a0: 70 20 3b 0a 21 74 69 6d 65 20 31 30 30 30 20 66  p ;.!time 1000 f
03b0: 75 7a 7a 6c 20 63 72 20 2e 74 69 6d 65 20 2e 22  uzzl cr .time ."
03c0: 20 20 66 6f 72 20 31 30 30 30 20 63 68 65 63 6b    for 1000 check
03d0: 73 22 20 63 72 0a 21 74 69 6d 65 20 31 30 30 30  s" cr.!time 1000
03e0: 20 73 69 67 73 20 20 2e 74 69 6d 65 20 2e 22 20   sigs  .time ." 
03f0: 20 66 6f 72 20 31 30 30 30 20 73 69 67 73 22 20   for 1000 sigs" 
0400: 63 72 0a 21 74 69 6d 65 20 31 30 30 30 20 63 68  cr.!time 1000 ch
0410: 65 63 6b 73 69 67 73 20 20 2e 74 69 6d 65 20 2e  ecksigs  .time .
0420: 22 20 20 66 6f 72 20 31 30 30 30 20 73 69 67 73  "  for 1000 sigs
0430: 22 20 63 72 0a 0a 5c 20 64 65 74 65 72 6d 69 6e  " cr..\ determin
0440: 69 73 74 69 63 20 74 65 73 74 73 0a 0a 24 34 30  istic tests..$40
0450: 20 62 75 66 66 65 72 3a 20 74 65 73 74 70 6b 0a   buffer: testpk.
0460: 3a 20 3e 74 65 73 74 20 28 20 61 64 64 72 20 69  : >test ( addr i
0470: 20 2d 2d 20 61 64 64 72 27 20 29 20 74 65 73 74   -- addr' ) test
0480: 70 6b 20 2b 20 74 75 63 6b 20 24 32 30 20 6d 6f  pk + tuck $20 mo
0490: 76 65 20 3b 0a 0a 78 22 20 45 30 39 36 35 37 44  ve ;..x" E09657D
04a0: 38 43 30 36 36 46 42 41 41 44 30 30 39 41 31 31  8C066FBAAD009A11
04b0: 38 39 42 33 41 37 45 34 31 38 43 45 32 30 30 32  89B3A7E418CE2002
04c0: 45 37 33 45 36 43 37 39 39 44 41 37 41 36 46 35  E73E6C799DA7A6F5
04d0: 44 38 36 43 41 35 42 37 36 22 20 73 6b 63 20 73  D86CA5B76" skc s
04e0: 77 61 70 20 6d 6f 76 65 0a 78 22 20 43 38 42 30  wap move.x" C8B0
04f0: 35 31 34 38 35 37 45 35 30 35 32 34 44 45 43 39  514857E50524DEC9
0500: 34 46 42 31 31 35 37 45 46 30 42 42 30 42 38 39  4FB1157EF0BB0B89
0510: 46 46 41 44 41 33 41 32 38 31 46 46 32 41 45 30  FFADA3A281FF2AE0
0520: 36 46 34 42 42 44 37 45 45 36 37 31 22 20 73 74  6F4BBD7EE671" st
0530: 73 6b 63 20 73 77 61 70 20 6d 6f 76 65 0a 73 6b  skc swap move.sk
0540: 63 20 70 6b 63 20 73 6b 3e 70 6b 20 70 6b 63 20  c pkc sk>pk pkc 
0550: 24 32 30 20 78 22 20 31 34 38 37 37 37 41 41 39  $20 x" 148777AA9
0560: 31 33 43 41 39 37 30 41 44 32 33 45 31 43 37 31  13CA970AD23E1C71
0570: 42 36 42 35 43 36 35 30 42 30 34 34 38 42 41 36  B6B5C650B0448BA6
0580: 44 41 43 45 41 35 35 38 37 41 44 46 45 31 33 42  DACEA5587ADFE13B
0590: 41 39 32 36 32 42 42 22 20 73 74 72 3d 20 30 3d  A9262BB" str= 0=
05a0: 20 5b 49 46 5d 20 2e 22 20 69 6e 63 6f 72 72 65   [IF] ." incorre
05b0: 63 74 20 70 75 62 6b 65 79 20 22 20 70 6b 63 20  ct pubkey " pkc 
05c0: 24 32 30 20 78 74 79 70 65 20 63 72 20 5b 54 48  $20 xtype cr [TH
05d0: 45 4e 5d 0a 73 74 73 6b 63 20 73 74 70 6b 63 20  EN].stskc stpkc 
05e0: 73 6b 3e 70 6b 20 73 74 70 6b 63 20 24 32 30 20  sk>pk stpkc $20 
05f0: 78 22 20 33 30 31 43 33 33 34 35 45 39 37 35 36  x" 301C3345E9756
0600: 33 34 38 44 44 34 34 32 42 30 33 41 41 45 31 38  348DD442B03AAE18
0610: 36 41 37 33 32 37 32 45 43 46 31 34 35 44 36 33  6A73272ECF145D63
0620: 43 33 41 30 31 44 44 37 42 42 46 37 41 33 46 32  C3A01DD7BBF7A3F2
0630: 34 44 37 22 20 73 74 72 3d 20 30 3d 20 5b 49 46  4D7" str= 0= [IF
0640: 5d 20 2e 22 20 69 6e 63 6f 72 72 65 63 74 20 70  ] ." incorrect p
0650: 75 62 6b 65 79 20 22 20 73 74 70 6b 63 20 24 32  ubkey " stpkc $2
0660: 30 20 78 74 79 70 65 20 63 72 20 5b 54 48 45 4e  0 xtype cr [THEN
0670: 5d 0a 3e 73 6b 73 69 67 0a 0a 31 30 30 20 30 20  ].>sksig..100 0 
0680: 5b 64 6f 5d 20 73 6b 63 20 73 74 70 6b 63 20 70  [do] skc stpkc p
0690: 61 64 20 65 64 2d 64 68 20 32 64 72 6f 70 20 5b  ad ed-dh 2drop [
06a0: 6c 6f 6f 70 5d 20 5c 20 77 61 72 6d 75 70 20 66  loop] \ warmup f
06b0: 6f 72 20 74 68 65 20 43 50 55 0a 0a 2e 22 20 54  or the CPU..." T
06c0: 65 73 74 20 6b 65 79 70 61 69 72 20 22 0a 73 6b  est keypair ".sk
06d0: 63 20 70 6b 63 20 32 64 75 70 20 73 6b 3e 70 6b  c pkc 2dup sk>pk
06e0: 20 21 74 69 6d 65 20 73 6b 3e 70 6b 20 2e 74 69   !time sk>pk .ti
06f0: 6d 65 20 63 72 0a 2e 22 20 54 65 73 74 20 73 69  me cr.." Test si
0700: 67 6e 69 6e 67 20 22 0a 63 3a 30 6b 65 79 20 22  gning ".c:0key "
0710: 54 65 73 74 20 31 32 33 22 20 63 3a 68 61 73 68  Test 123" c:hash
0720: 20 73 6b 73 69 67 20 73 6b 63 20 70 6b 63 20 65   sksig skc pkc e
0730: 64 2d 73 69 67 6e 0a 78 22 20 34 32 32 44 33 39  d-sign.x" 422D39
0740: 33 44 37 39 45 32 34 43 46 43 31 43 42 45 34 32  3D79E24CFC1CBE42
0750: 44 38 30 34 33 46 39 37 30 35 37 36 33 30 44 31  D8043F97057630D1
0760: 45 35 36 44 44 37 45 38 42 35 37 43 45 35 46 42  E56DD7E8B57CE5FB
0770: 38 44 34 38 33 41 45 32 41 31 44 38 36 45 45 31  8D483AE2A1D86EE1
0780: 32 35 30 30 46 35 38 35 36 42 35 35 39 42 46 44  2500F5856B559BFD
0790: 37 38 31 46 45 39 44 34 34 32 43 44 35 30 32 36  781FE9D442CD5026
07a0: 31 38 46 41 39 34 41 36 39 43 39 41 34 31 31 30  18FA94A69C9A4110
07b0: 39 41 45 42 33 45 34 42 30 43 22 20 73 74 72 3d  9AEB3E4B0C" str=
07c0: 20 30 3d 20 5b 49 46 5d 20 2e 22 20 69 6e 22 20   0= [IF] ." in" 
07d0: 5b 54 48 45 4e 5d 20 2e 22 20 63 6f 72 72 65 63  [THEN] ." correc
07e0: 74 20 73 69 67 20 22 0a 63 3a 30 6b 65 79 20 22  t sig ".c:0key "
07f0: 54 65 73 74 20 31 32 33 22 20 63 3a 68 61 73 68  Test 123" c:hash
0800: 0a 73 6b 73 69 67 20 73 6b 63 20 70 6b 63 20 21  .sksig skc pkc !
0810: 74 69 6d 65 20 65 64 2d 73 69 67 6e 20 64 72 6f  time ed-sign dro
0820: 70 20 2e 74 69 6d 65 20 63 72 0a 63 3a 30 6b 65  p .time cr.c:0ke
0830: 79 20 22 54 65 73 74 20 31 32 33 22 20 63 3a 68  y "Test 123" c:h
0840: 61 73 68 20 64 75 70 20 70 6b 63 20 65 64 2d 76  ash dup pkc ed-v
0850: 65 72 69 66 79 20 64 72 6f 70 0a 63 3a 30 6b 65  erify drop.c:0ke
0860: 79 20 22 54 65 73 74 20 31 32 33 22 20 63 3a 68  y "Test 123" c:h
0870: 61 73 68 0a 2e 22 20 54 65 73 74 20 76 65 72 69  ash.." Test veri
0880: 66 79 20 22 0a 64 75 70 20 70 6b 63 20 65 64 2d  fy ".dup pkc ed-
0890: 76 65 72 69 66 79 0a 3e 72 20 64 75 70 20 70 6b  verify.>r dup pk
08a0: 63 20 21 74 69 6d 65 20 65 64 2d 76 65 72 69 66  c !time ed-verif
08b0: 79 20 2e 74 69 6d 65 20 64 72 6f 70 20 72 3e 0a  y .time drop r>.
08c0: 5b 49 46 5d 20 2e 22 20 20 70 61 73 73 65 64 22  [IF] ."  passed"
08d0: 20 5b 45 4c 53 45 5d 20 2e 22 20 20 66 61 69 6c   [ELSE] ."  fail
08e0: 65 64 22 20 5b 54 48 45 4e 5d 20 63 72 0a 2e 22  ed" [THEN] cr.."
08f0: 20 54 65 73 74 20 66 6f 72 67 65 20 22 0a 63 3a   Test forge ".c:
0900: 30 6b 65 79 20 22 54 65 73 74 20 31 32 34 22 20  0key "Test 124" 
0910: 63 3a 68 61 73 68 20 64 75 70 20 70 6b 63 20 65  c:hash dup pkc e
0920: 64 2d 76 65 72 69 66 79 20 64 72 6f 70 0a 63 3a  d-verify drop.c:
0930: 30 6b 65 79 20 22 54 65 73 74 20 31 32 34 22 20  0key "Test 124" 
0940: 63 3a 68 61 73 68 0a 64 75 70 20 70 6b 63 20 21  c:hash.dup pkc !
0950: 74 69 6d 65 20 65 64 2d 76 65 72 69 66 79 20 2e  time ed-verify .
0960: 74 69 6d 65 0a 30 3d 20 5b 49 46 5d 20 2e 22 20  time.0= [IF] ." 
0970: 20 70 61 73 73 65 64 22 20 5b 45 4c 53 45 5d 20   passed" [ELSE] 
0980: 2e 22 20 20 66 61 69 6c 65 64 22 20 5b 54 48 45  ."  failed" [THE
0990: 4e 5d 20 63 72 0a 24 34 30 20 78 74 79 70 65 20  N] cr.$40 xtype 
09a0: 63 72 0a 0a 3a 20 74 65 73 74 2d 65 64 64 68 20  cr..: test-eddh 
09b0: 28 20 2d 2d 20 29 0a 20 20 20 20 2e 22 20 54 65  ( -- ).    ." Te
09c0: 73 74 20 45 64 44 48 20 22 0a 20 20 20 20 24 32  st EdDH ".    $2
09d0: 30 20 30 20 44 4f 0a 09 73 74 73 6b 63 20 73 74  0 0 DO..stskc st
09e0: 70 6b 63 20 73 6b 3e 70 6b 0a 09 73 6b 63 20 73  pkc sk>pk..skc s
09f0: 74 70 6b 63 20 49 20 3e 74 65 73 74 20 32 64 75  tpkc I >test 2du
0a00: 70 20 70 61 64 20 65 64 2d 64 68 20 32 64 72 6f  p pad ed-dh 2dro
0a10: 70 20 70 61 64 20 65 64 2d 64 68 20 70 61 64 20  p pad ed-dh pad 
0a20: 24 32 30 20 2b 20 73 77 61 70 20 6d 6f 76 65 0a  $20 + swap move.
0a30: 09 73 6b 63 20 73 74 70 6b 63 20 49 20 3e 74 65  .skc stpkc I >te
0a40: 73 74 20 32 64 75 70 20 70 61 64 20 65 64 2d 64  st 2dup pad ed-d
0a50: 68 20 32 64 72 6f 70 20 70 61 64 20 65 64 2d 64  h 2drop pad ed-d
0a60: 68 20 32 64 72 6f 70 0a 09 73 74 73 6b 63 20 70  h 2drop..stskc p
0a70: 6b 63 20 49 20 3e 74 65 73 74 20 32 64 75 70 20  kc I >test 2dup 
0a80: 70 61 64 20 65 64 2d 64 68 20 32 64 72 6f 70 20  pad ed-dh 2drop 
0a90: 70 61 64 20 65 64 2d 64 68 0a 09 73 74 73 6b 63  pad ed-dh..stskc
0aa0: 20 70 6b 63 20 49 20 3e 74 65 73 74 20 32 64 75   pkc I >test 2du
0ab0: 70 20 70 61 64 20 65 64 2d 64 68 20 32 64 72 6f  p pad ed-dh 2dro
0ac0: 70 20 70 61 64 0a 09 49 20 30 3d 20 49 46 20 20  p pad..I 0= IF  
0ad0: 21 74 69 6d 65 20 65 64 2d 64 68 20 2e 74 69 6d  !time ed-dh .tim
0ae0: 65 20 20 45 4c 53 45 20 20 65 64 2d 64 68 20 20  e  ELSE  ed-dh  
0af0: 54 48 45 4e 20 20 32 64 72 6f 70 0a 09 32 64 75  THEN  2drop..2du
0b00: 70 20 78 22 20 42 35 42 42 33 42 36 36 36 33 41  p x" B5BB3B6663A
0b10: 39 39 32 41 32 39 41 37 35 38 35 32 41 44 34 39  992A29A75852AD49
0b20: 32 35 30 38 35 31 30 39 45 39 36 34 38 35 41 37  25085109E96485A7
0b30: 37 30 45 44 46 37 41 38 41 39 34 35 31 32 38 46  70EDF7A8A945128F
0b40: 34 32 42 44 32 22 0a 09 73 74 72 3d 20 49 20 30  42BD2"..str= I 0
0b50: 3d 20 49 46 20 20 49 46 20 2e 22 20 20 63 6f 72  = IF  IF ."  cor
0b60: 72 65 63 74 22 20 45 4c 53 45 20 2e 22 20 20 69  rect" ELSE ."  i
0b70: 6e 63 6f 72 72 65 63 74 22 20 54 48 45 4e 0a 09  ncorrect" THEN..
0b80: 45 4c 53 45 20 20 27 2b 27 20 27 2d 27 20 72 6f  ELSE  '+' '-' ro
0b90: 74 20 73 65 6c 65 63 74 20 65 6d 69 74 20 20 54  t select emit  T
0ba0: 48 45 4e 0a 09 32 64 75 70 20 70 61 64 20 24 32  HEN..2dup pad $2
0bb0: 30 20 2b 20 6f 76 65 72 20 73 74 72 3d 20 49 46  0 + over str= IF
0bc0: 20 49 20 30 3d 20 49 46 20 20 2e 22 20 20 70 61   I 0= IF  ."  pa
0bd0: 73 73 65 64 22 20 20 45 4c 53 45 20 20 27 2b 27  ssed"  ELSE  '+'
0be0: 20 65 6d 69 74 20 20 54 48 45 4e 0a 09 45 4c 53   emit  THEN..ELS
0bf0: 45 20 2e 22 20 20 66 61 69 6c 65 64 22 20 70 61  E ."  failed" pa
0c00: 64 20 6f 76 65 72 20 63 72 20 78 74 79 70 65 20  d over cr xtype 
0c10: 54 48 45 4e 0a 09 49 20 30 3d 20 49 46 20 20 63  THEN..I 0= IF  c
0c20: 72 20 78 74 79 70 65 20 63 72 20 20 45 4c 53 45  r xtype cr  ELSE
0c30: 20 20 32 64 72 6f 70 20 20 54 48 45 4e 0a 20 20    2drop  THEN.  
0c40: 20 20 4c 4f 4f 50 20 63 72 20 3b 0a 74 65 73 74    LOOP cr ;.test
0c50: 2d 65 64 64 68 0a 0a 5b 49 46 44 45 46 5d 20 65  -eddh..[IFDEF] e
0c60: 64 2d 64 68 76 0a 20 20 20 20 2e 22 20 54 65 73  d-dhv.    ." Tes
0c70: 74 20 45 64 44 48 20 76 61 72 69 61 62 6c 65 20  t EdDH variable 
0c80: 73 70 65 65 64 20 22 0a 20 20 20 20 73 6b 63 20  speed ".    skc 
0c90: 73 74 70 6b 63 20 32 64 75 70 20 70 61 64 20 65  stpkc 2dup pad e
0ca0: 64 2d 64 68 76 20 32 64 72 6f 70 20 70 61 64 20  d-dhv 2drop pad 
0cb0: 65 64 2d 64 68 76 20 70 61 64 20 24 32 30 20 2b  ed-dhv pad $20 +
0cc0: 20 73 77 61 70 20 6d 6f 76 65 0a 20 20 20 20 73   swap move.    s
0cd0: 6b 63 20 73 74 70 6b 63 20 32 64 75 70 20 70 61  kc stpkc 2dup pa
0ce0: 64 20 65 64 2d 64 68 76 20 32 64 72 6f 70 20 70  d ed-dhv 2drop p
0cf0: 61 64 20 65 64 2d 64 68 76 20 32 64 72 6f 70 0a  ad ed-dhv 2drop.
0d00: 20 20 20 20 73 74 73 6b 63 20 70 6b 63 20 32 64      stskc pkc 2d
0d10: 75 70 20 70 61 64 20 65 64 2d 64 68 76 20 32 64  up pad ed-dhv 2d
0d20: 72 6f 70 20 70 61 64 20 65 64 2d 64 68 76 0a 20  rop pad ed-dhv. 
0d30: 20 20 20 73 74 73 6b 63 20 70 6b 63 20 32 64 75     stskc pkc 2du
0d40: 70 20 70 61 64 20 65 64 2d 64 68 76 20 32 64 72  p pad ed-dhv 2dr
0d50: 6f 70 20 21 74 69 6d 65 20 70 61 64 20 65 64 2d  op !time pad ed-
0d60: 64 68 76 20 2e 74 69 6d 65 20 32 64 72 6f 70 0a  dhv .time 2drop.
0d70: 20 20 20 20 32 64 75 70 20 78 22 20 42 35 42 42      2dup x" B5BB
0d80: 33 42 36 36 36 33 41 39 39 32 41 32 39 41 37 35  3B6663A992A29A75
0d90: 38 35 32 41 44 34 39 32 35 30 38 35 31 30 39 45  852AD4925085109E
0da0: 39 36 34 38 35 41 37 37 30 45 44 46 37 41 38 41  96485A770EDF7A8A
0db0: 39 34 35 31 32 38 46 34 32 42 44 32 22 20 73 74  945128F42BD2" st
0dc0: 72 3d 20 5b 49 46 5d 20 2e 22 20 20 63 6f 72 72  r= [IF] ."  corr
0dd0: 65 63 74 22 20 5b 45 4c 53 45 5d 20 2e 22 20 20  ect" [ELSE] ."  
0de0: 69 6e 63 6f 72 72 65 63 74 22 20 5b 54 48 45 4e  incorrect" [THEN
0df0: 5d 0a 20 20 20 20 32 64 75 70 20 70 61 64 20 24  ].    2dup pad $
0e00: 32 30 20 2b 20 6f 76 65 72 20 73 74 72 3d 20 5b  20 + over str= [
0e10: 49 46 5d 20 2e 22 20 20 70 61 73 73 65 64 22 0a  IF] ."  passed".
0e20: 20 20 20 20 5b 45 4c 53 45 5d 20 2e 22 20 20 66      [ELSE] ."  f
0e30: 61 69 6c 65 64 22 20 70 61 64 20 6f 76 65 72 20  ailed" pad over 
0e40: 63 72 20 78 74 79 70 65 20 5b 54 48 45 4e 5d 20  cr xtype [THEN] 
0e50: 63 72 0a 20 20 20 20 78 74 79 70 65 20 63 72 0a  cr.    xtype cr.
0e60: 5b 54 48 45 4e 5d 0a 73 63 72 69 70 74 3f 20 5b  [THEN].script? [
0e70: 49 46 5d 20 62 79 65 20 5b 54 48 45 4e 5d 0a     IF] bye [THEN].