2005-10-16 15:11:50 -04:00
|
|
|
IN: crypto-internals
|
2019-10-18 09:05:06 -04:00
|
|
|
USING: arrays kernel io sbufs strings sequences
|
|
|
|
|
namespaces math parser ;
|
2005-08-25 06:07:50 -04:00
|
|
|
|
2006-09-11 22:11:41 -04:00
|
|
|
IN: crypto
|
|
|
|
|
: >32-bit ( n -- n ) HEX: ffffffff bitand ; inline
|
|
|
|
|
: >64-bit ( n -- n ) HEX: ffffffffffffffff bitand ; inline
|
|
|
|
|
|
|
|
|
|
IN: crypto-internals
|
2006-11-14 01:34:21 -05:00
|
|
|
: w+ ( int int -- int ) + >32-bit ; inline
|
2019-10-18 09:05:06 -04:00
|
|
|
|
|
|
|
|
: (nth-int) ( string n -- int )
|
|
|
|
|
2 shift dup 4 + rot <slice> ; inline
|
|
|
|
|
|
|
|
|
|
: nth-int ( string n -- int ) (nth-int) le> ; inline
|
|
|
|
|
|
|
|
|
|
: nth-int-be ( string n -- int ) (nth-int) be> ; inline
|
|
|
|
|
|
2006-02-27 00:04:25 -05:00
|
|
|
: update ( num var -- ) [ w+ ] change ; inline
|
2005-08-25 06:07:50 -04:00
|
|
|
|
|
|
|
|
: update-old-new ( old new -- )
|
2005-09-10 15:53:17 -04:00
|
|
|
[ get >r get r> ] 2keep >r >r w+ dup r> set r> set ; inline
|
2005-08-25 06:07:50 -04:00
|
|
|
|
2006-08-10 00:27:21 -04:00
|
|
|
: calculate-pad-length ( length -- pad-length )
|
|
|
|
|
dup 56 < 55 119 ? swap - ;
|
2005-08-25 06:07:50 -04:00
|
|
|
|
2006-08-10 00:27:21 -04:00
|
|
|
: preprocess-plaintext ( string big-endian? -- padded-string )
|
2006-09-07 16:56:40 -04:00
|
|
|
#! pad 0x80 then 00 til 8 bytes left, then 64bit length in bits
|
2006-09-07 16:15:41 -04:00
|
|
|
>r >sbuf r> over [
|
|
|
|
|
HEX: 80 ,
|
2019-10-18 09:05:06 -04:00
|
|
|
dup length HEX: 3f bitand
|
|
|
|
|
calculate-pad-length 0 <string> %
|
2006-09-07 16:15:41 -04:00
|
|
|
length 3 shift 8 rot [ >be ] [ >le ] if %
|
2019-10-18 09:05:06 -04:00
|
|
|
] "" make over nappend ;
|
2005-08-25 06:07:50 -04:00
|
|
|
|
2006-09-15 17:22:23 -04:00
|
|
|
SYMBOL: bytes-read
|
|
|
|
|
SYMBOL: big-endian?
|
|
|
|
|
|
|
|
|
|
: pad-last-block ( str big-endian? length -- str )
|
|
|
|
|
[
|
|
|
|
|
rot %
|
|
|
|
|
HEX: 80 ,
|
|
|
|
|
dup HEX: 3f bitand calculate-pad-length 0 <string> %
|
|
|
|
|
3 shift 8 rot [ >be ] [ >le ] if %
|
|
|
|
|
] "" make 64 group ;
|
|
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
: shift-mod ( n s w -- n )
|
|
|
|
|
>r shift r> 1 swap shift 1 - bitand ; inline
|
2006-09-07 19:29:13 -04:00
|
|
|
|
2005-10-16 15:11:50 -04:00
|
|
|
IN: crypto
|
2006-09-07 19:29:13 -04:00
|
|
|
|
2006-09-11 22:11:41 -04:00
|
|
|
: bitroll ( n s w -- n' )
|
2005-10-16 15:11:50 -04:00
|
|
|
#! Roll n by s bits to the left, wrapping around after
|
|
|
|
|
#! w bits.
|
|
|
|
|
[ 1 - bitand ] keep
|
|
|
|
|
over 0 < [ [ + ] keep ] when
|
|
|
|
|
[ shift-mod ] 3keep
|
|
|
|
|
[ - ] keep shift-mod bitor ; inline
|
|
|
|
|
|
2006-09-11 22:11:41 -04:00
|
|
|
: bitroll-32 ( n s -- n' ) 32 bitroll ;
|
|
|
|
|
: bitroll-64 ( n s -- n' ) 64 bitroll ;
|
2019-10-18 09:05:06 -04:00
|
|
|
: hex-string ( str -- str )
|
|
|
|
|
[ [ >hex 2 48 pad-left % ] each ] "" make ;
|
2006-09-11 22:11:41 -04:00
|
|
|
: slice3 ( n seq -- a b c ) >r dup 3 + r> <slice> first3 ;
|
|
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
: seq>2seq ( seq -- seq1 seq2 )
|
|
|
|
|
#! { abcdefgh } -> { aceg } { bdfh }
|
|
|
|
|
2 group 2 [ <column> >array ] map-with first2 ;
|
|
|
|
|
|
|
|
|
|
: 2seq>seq ( seq1 seq2 -- seq )
|
|
|
|
|
#! { aceg } { bdfh } -> { abcdefgh }
|
|
|
|
|
[ [ [ , , ] 2each ] "" make ] keep like ;
|
2006-09-11 22:11:41 -04:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
: mod-nth ( n seq -- elt )
|
|
|
|
|
#! 5 "abcd" -> b
|
|
|
|
|
[ length mod ] keep nth ;
|