Changeset 2888


Ignore:
Timestamp:
Mar 2, 2012, 10:20:59 PM (3 years ago)
Author:
wmb
Message:

OLPC - change hex-decode to store the decoded information in-place, thus eliminating the need for auxiliary buffers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpu/x86/pc/olpc/security.fth

    r2865 r2888  
    194194/sig buffer: sig-buf
    195195
    196 \ hex-decode decodes a hexadecimal signature string, storing it in
    197 \ binary form at sig-buf.  It returns the adr,len of the binary string.
    198 
    199 : hex-decode  ( hex$ -- true | sig$ false )
    200    sig-buf -rot                 ( adr hex$ )
    201    bounds ?do                   ( adr )
    202       i 2 push-hex $number pop-base  if  ( adr )
    203          2drop true unloop exit
    204       then                      ( adr n )
    205       over c!  1+               ( adr' )
    206    2 +loop                      ( adr )
    207    sig-buf tuck -   false       ( sig$ false )
     196h# 10e constant /key
     197/key buffer: key-buf
     198
     199\ $hex-decode decodes a hexadecimal signature string, storing it in
     200\ binary form at adr, returning adr,len of the binary string and false.
     201\ It returns true if hex$ is too long for the binary buffer length
     202\ maxlen or if hex$ contains a non-hexadecimal character.
     203
     204: $hex-decode  ( hex$ adr maxlen -- true | binary$ false )
     205   2* third <  if               ( hex$ adr )
     206      3drop true exit           ( -- true )
     207   then                         ( hex$ adr )
     208   dup 2swap                    ( adr adr hex$ )
     209   bounds ?do                   ( adr nextadr )
     210      i 2 push-hex $number pop-base  if  ( adr nextadr )
     211         2drop true unloop exit          ( -- true )
     212      then                      ( adr nextadr n )
     213      over c!  1+               ( adr nextadr' )
     214   2 +loop                      ( adr nextadr )
     215   over -   false               ( binary$ false )
    208216;
    209217
     
    231239   bl left-parse-string 2drop          ( rem$ )  \ Discard hash name
    232240   bl left-parse-string 2nip           ( key$ )  \ Get key signature
    233    /sig 2* min  hex-decode  if         ( key$ )
    234       2drop true                       ( true )
    235       exit
    236    then                                ( binary-key$ )
    237    false                               ( binary-key$ false )
     241
     242   key-buf /key $hex-decode            ( true | binary-key$ false )
    238243;
    239244
     
    473478   \ Check that the keyid matches our pubkey
    474479   bl left-parse-string              ( line$' keyid$ )
    475    /sig 2* min  hex-decode  if       ( line$ )
     480   key-buf /key $hex-decode  if      ( line$ )
    476481      2drop false  exit             
    477    then                              ( line$ binary-key$ )
     482   then                              ( line$ binary-keyid$ )
    478483
    479484   key-in-list?  0=  if              ( line$ )
    480485      2drop false  exit
    481486   then                              ( line$ )
     487   \ Now thiskey$ contains the full key$ that was matched by keyid$
    482488
    483489   \ Check that the signature occupies the rest of the line
     
    488494   then                              ( sig$ )
    489495
    490    dup /sig 2* <>  if                ( sig$ )
    491       2drop false exit
    492    then                              ( sig$ )
    493 
    494    hex-decode  if                    ( )
     496   sig-buf /sig $hex-decode  if      ( )
    495497      false exit
    496498   then                              ( binary-sig$ )
    497499
     500   dup /sig <>  if                   ( binary-sig$ )
     501      2drop false exit
     502   then                              ( binary-sig$ )
     503
    498504   \ Cryptographically verify the data against the signature
    499505   2>r  0 signed-data$  2r>  thiskey$  exp-hashname$  signature-bad? 0=
    500506;
    501 
    502 h# 10e constant /key
    503 /key buffer: keybuf
    504507
    5055080 0 2value sig02-key$
     
    518521      \ the first one
    519522      bl left-parse-string              ( line$' pubkey$ )
    520       hex-decode  if                    ( line$ )
    521          2drop false unloop exit
     523
     524      key-buf /key $hex-decode  if      ( line$ )
     525         2drop false unloop exit        ( -- false )
    522526      then                              ( line$ binary-key$ )
    523527
    524       i  if                             ( line$ binary-key$ )
    525          dup /key <>  if                ( line$ binary-key$ )
    526             4drop false unloop exit
    527          then                           ( line$ binary-key$ )
    528          tuck  keybuf  swap move        ( line$ binary-keylen )
    529          keybuf swap                    ( line$ binary-key$' )
    530       else                              ( line$ binary-keyid$ )
     528      dup /key <>  if                   ( line$ binary-keyid$ )
     529         \ If the length is shorter than a full key, it's a keyid
     530         \ which we look for in our key list
    531531         key-in-list? 0=  if            ( line$ )
    532532            2drop false unloop exit
     
    545545      bl left-parse-string              ( line$ sig$)
    546546
    547       dup /sig 2* <>  if                ( line$ sig$ )
     547      sig-buf /sig $hex-decode  if      ( line$ )
     548         2drop false unloop exit        ( -- false )
     549      then                              ( line$ binary-sig$ )
     550
     551      dup /sig <>  if                   ( line$ binary-sig$ )
    548552         4drop false unloop exit
    549       then                              ( line sig$ )
    550 
    551       hex-decode  if                    ( line$ )
    552          2drop false unloop exit
    553       then                              ( line$ binary-sig$ )
     553      then                              ( line binary-sig$ )
    554554
    555555      2>r                               ( line$' r: binary-sig$ )
     
    13481348   date-bad?  if  ." The RTC is not set correctly" cr  exit  then
    13491349   time&date >iso8601$  " md" $add-tag
     1350;
     1351
     1352\ The following is for compatibility with the script fsverify.fth .
     1353\ fs-verify only needs h#20 bytes, that being the length of a sha256 hash
     1354\ in binary form, but we give it h#100 as that is the previous length of
     1355\ hex-decode's buffer.  Since buffer: uses lazy allocation, we won't waste
     1356\ space unless compat-buf is actually used.
     1357
     1358h# 100 constant /compat-buf   \ Large enough for sha512
     1359/compat-buf buffer: compat-buf
     1360
     1361: hex-decode  ( hex$ -- true | binary$ false )
     1362   compat-buf /compat-buf $hex-decode
    13501363;
    13511364
Note: See TracChangeset for help on using the changeset viewer.