Changeset 2888


Ignore:
Timestamp:
Mar 2, 2012, 11: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.