Author: wmb
Date: 2007-11-18 04:54:48 +0100 (Sun, 18 Nov 2007)
New Revision: 736
Modified:
cpu/x86/pc/olpc/fw.bth
cpu/x86/pc/olpc/loaddropins.fth
cpu/x86/pc/olpc/security.fth
Log:
OLPC - Cosmetic improvements in secure boot error messages
and some stuff to help the factory repair systems after FQA.
Modified: cpu/x86/pc/olpc/fw.bth
===================================================================
--- cpu/x86/pc/olpc/fw.bth 2007-11-16 22:29:19 UTC (rev 735)
+++ cpu/x86/pc/olpc/fw.bth 2007-11-18 03:54:48 UTC (rev 736)
@@ -332,9 +332,9 @@
fload ${BP}/cpu/x86/pc/olpc/lzip.fth \ Access zip images from memory
fload ${BP}/cpu/x86/pc/olpc/gamekeys.fth
fload ${BP}/cpu/x86/pc/olpc/linux.fth
+fload ${BP}/cpu/x86/pc/olpc/setwp.fth
fload ${BP}/cpu/x86/pc/olpc/security.fth
fload ${BP}/cpu/x86/pc/olpc/fsupdate.fth
-fload ${BP}/cpu/x86/pc/olpc/setwp.fth
fload ${BP}/ofw/gui/ofpong.fth
fload ${BP}/cpu/x86/pc/olpc/life.fth
fload ${BP}/cpu/x86/pc/olpc/sound.fth
@@ -520,12 +520,13 @@
." Tests complete - powering off" cr d# 5000 ms power-off
then
;
+
: ?scan-nand ( -- )
rocker-up game-key? if text-on scan-nand then
;
: ?fs-update ( -- )
button-check button-x or button-o or button-square or ( mask )
- game-key-mask over and = if
+ game-key-mask = if
try-fs-update
then
;
@@ -547,6 +548,8 @@
no-page
+ ?factory-mode
+
console-start
?resume-botch
Modified: cpu/x86/pc/olpc/loaddropins.fth
===================================================================
--- cpu/x86/pc/olpc/loaddropins.fth 2007-11-16 22:29:19 UTC (rev 735)
+++ cpu/x86/pc/olpc/loaddropins.fth 2007-11-18 03:54:48 UTC (rev 736)
@@ -27,7 +27,7 @@
" ${BP}/ofw/inet/telnetd.fth" " telnetd" $add-deflated-dropin
- " ${BP}/cpu/x86/pc/olpc/images/warnings.565" " warnings.565" $add-deflated-dropin
+\ " ${BP}/cpu/x86/pc/olpc/images/warnings.565" " warnings.565" $add-deflated-dropin
" ${BP}/cpu/x86/pc/olpc/images/lightdot.565" " lightdot.565" $add-deflated-dropin
" ${BP}/cpu/x86/pc/olpc/images/yellowdot.565" " yellowdot.565" $add-deflated-dropin
" ${BP}/cpu/x86/pc/olpc/images/darkdot.565" " darkdot.565" $add-deflated-dropin
Modified: cpu/x86/pc/olpc/security.fth
===================================================================
--- cpu/x86/pc/olpc/security.fth 2007-11-16 22:29:19 UTC (rev 735)
+++ cpu/x86/pc/olpc/security.fth 2007-11-18 03:54:48 UTC (rev 736)
@@ -13,8 +13,8 @@
0 0 2value base-xy
0 0 2value next-xy
-d# 410 d# 540 2constant progress-xy
-d# 557 d# 283 2constant sad-xy
+d# 463 d# 540 2constant progress-xy
+d# 552 d# 283 2constant sad-xy
true value debug-security?
: ?lease-debug ( msg$ -- )
@@ -23,6 +23,9 @@
: ?lease-debug-cr ( msg$2 -- )
debug-security? if type cr else 2drop then
;
+: ?lease-error-cr ( msg$2 -- )
+ debug-security? if red-letters type black-letters cr else 2drop then
+;
: fail-load ( -- )
text-on
@@ -31,15 +34,21 @@
begin again
;
+code halt hlt c; \ To save power
+
0 value security-off?
: security-failure ( -- )
visible
- ." Stopping" cr
- security-off? if quit then
+ security-off? if ." Stopping" cr quit then
- d# 10000 ms
- power-off
+ button-check game-key? if
+ ." Use power button to power off" cr
+ begin halt again
+ else
+ ." Powering off in 10 seconds" cr
+ d# 10000 ms power-off
+ then
;
: +icon-xy ( delta-x,y -- ) icon-xy d+ to icon-xy ;
@@ -56,6 +65,12 @@
sad-xy to icon-xy " sad" show-icon
to icon-xy
;
+: .security-failure ( error$ -- )
+ visible red-letters type black-letters cr
+ show-sad
+ security-failure
+;
+
: show-lock ( -- ) " lock" show-icon ;
: show-unlock ( -- ) " unlock" show-icon ;
: show-child ( -- )
@@ -63,14 +78,16 @@
d# 552 d# 383 to icon-xy " rom:xogray.565" $show-opaque
progress-xy to icon-xy \ For boot progress reports
;
+
+0 [if]
: show-warnings ( -- )
" erase-screen" $call-screen
d# 48 d# 32 to icon-xy " rom:warnings.565" $show-opaque
dcon-freeze
;
+[then]
-
h# 20 buffer: cn-buf \ filename prefix - either "act" or "run"
h# 20 buffer: fn-buf \ filename tail - either "os" or "rd"
h# 100 buffer: pn-buf \ pathname - either "\boot" or "\boot-alt"
@@ -211,7 +228,7 @@
pubkey$ 2swap signature-bad? ( error? )
dup if
- " Signature invalid" ?lease-debug-cr
+ " Signature invalid" ?lease-error-cr
else
" Signature valid" ?lease-debug-cr
then
@@ -233,7 +250,7 @@
2dup our-pubkey? if false exit then ( rem$ line$ )
2drop ( rem$ )
repeat ( rem$ )
- " No signature for our key" ?lease-debug-cr
+ " No signature for our key" ?lease-error-cr
2drop true
;
@@ -266,94 +283,64 @@
over r@ - r> ( tail$ head$ )
;
-0. 2value exp-seconds \ Accumulator for parsing data/time strings
-
\ numfield is a factor used for parsing 2-digit fields from date/time strings.
-\ Radix is the number to scale the result by, i.e. one more than the maximum
-\ value of the field. Adjust is 0 for fields whose first valid value is 0
-\ (hours, minutes, seconds) or 1 for fields that start at 1 (month,day).
-
-: numfield ( exp$ adjust radix -- exp$' )
- >r >r ( exp$ r: radix adjust )
- 2 break$ $number throw ( exp$' num r: radix adjust )
- r> - ( exp$ num' r: radix )
- dup r@ u>= throw ( exp$ num r: radix )
-
- \ No need to multiply the top half because it can only become nonzero
- \ on the last call to scale-time
- exp-seconds drop r> um* ( exp$ num d.seconds )
- rot 0 d+ to exp-seconds ( exp$ )
+: numfield ( exp$ min max -- exp$' )
+ >r >r ( exp$ r: max min )
+ 2 break$ $number throw ( exp$' num r: max min )
+ dup r> < throw ( exp$ num r: max )
+ dup r> > throw ( exp$ num )
;
\ expiration-to-seconds parses an expiration date string like
\ "20070820T130401Z", converting it to (double precision) seconds
\ according to the simplified calculation described above for "get-date"
-: (expiration-to-seconds) ( expiration$ -- true | d.seconds false )
- 4 break$ $number throw ( exp$' year )
- dup d# 2999 u> throw ( exp$' year )
- 0 to exp-seconds ( exp$' )
-
- 1 d# 12 numfield ( exp$' ) \ Month
- 1 d# 31 numfield ( exp$' ) \ Day
-
- 1 break$ " T" $= 0= throw ( exp$' )
-
- 0 d# 24 numfield ( exp$' ) \ Hour
- 0 d# 60 numfield ( exp$' ) \ Minute
- 0 d# 60 numfield ( exp$' ) \ Second
-
- " Z" $= 0= throw ( )
- exp-seconds
+: (expiration-to-seconds) ( expiration$ -- d.seconds )
+ 4 break$ $number throw >r ( exp$' r: y )
+ 1 d# 12 numfield >r ( exp$' r: y m )
+ 1 d# 31 numfield >r ( exp$' r: y m d )
+ 1 break$ " T" $= 0= throw ( exp$' r: y m d )
+ 0 d# 23 numfield >r ( exp$' r: y m d h )
+ 0 d# 59 numfield >r ( exp$' r: y m d h m )
+ 0 d# 59 numfield >r ( exp$' r: y m d h m s )
+ " Z" $= 0= throw ( r: y m d h m s )
+ r> r> r> r> r> r> ( s m h m d y )
+ >unix-seconds
;
-: expiration-to-seconds ( expiration$ -- true | d.seconds false )
+: expiration-to-seconds ( expiration$ -- true | seconds false )
push-decimal
- ['] (expiration-to-seconds) catch ( x x true | d.seconds false )
+ ['] (expiration-to-seconds) catch ( x x true | seconds false )
pop-base
dup if nip nip then
;
-\ earliest is the earliest acceptable date value (in seconds).
-\ It is the date that the first test version of this code was
-\ deployed. If a laptop has any earlier date that than, that
-\ date is presumed bogus.
+0 value current-seconds
-" 20070101T000000Z" expiration-to-seconds drop 2constant earliest
+: date-bad? ( -- flag )
+ current-seconds 0= if
+ time&date >unix-seconds to current-seconds
+ then
-0. 2value current-seconds
+ \ earliest is the earliest acceptable date value (in seconds).
+ \ It is the date that the first test version of this code was
+ \ deployed. If a laptop has any earlier date that than, that
+ \ date is presumed bogus.
-\ get-date reads the date and time from the real time clock
-\ and converts it to seconds.
-
-\ The seconds conversion uses a simplified approach that ignores
-\ leap years and the like - it assumes that all months are 31 days.
-\ This is sufficient for comparison purposes so long as we use the
-\ same calculation in all cases. It is not good for doing
-\ arithmetic on dates.
-: get-date ( -- )
- time&date ( s m h d m y )
- d# 12 * swap 1- + ( s m h d m' ) \ Months start at 1
- d# 31 * swap 1- + ( s m h d' ) \ Days start at 1
- d# 24 * + ( s m h' )
- d# 60 * + ( s m' ) \ Can't overflow so far
- d# 60 um* ( s d.s' )
- swap 0 d+ to current-seconds
+ current-seconds [ " 20070101T000000Z" expiration-to-seconds drop ] literal - 0<
;
+
\ expired? determines whether or not the expiration time string is
\ earlier than this machine's current time (from the real time clock).
: expired? ( expiration$ -- bad? )
- expiration-to-seconds if true exit then ( d.seconds )
+ expiration-to-seconds if true exit then ( seconds )
- current-seconds 0. d= if ( d.seconds )
- then
-
\ If the date is bad, leases are deemed to have expired
- current-seconds earliest d< if 2drop true exit then
+ date-bad? if drop true exit then ( seconds )
- current-seconds d<
+ current-seconds - 0<
;
d# 1024 constant /sec-line-max
@@ -380,11 +367,11 @@
: get-my-sn ( -- error? )
" SN" find-tag 0= if
- " No serial number in mfg data" ?lease-debug-cr
+ " No serial number in mfg data" ?lease-error-cr
true exit
then ( adr len )
?-null dup d# 11 <> if
- " Invalid serial number" ?lease-debug-cr
+ " Invalid serial number" ?lease-error-cr
2drop true exit
then ( adr len )
machine-id-buf swap move
@@ -392,11 +379,11 @@
[char] : machine-id-buf d# 11 + c!
" U#" find-tag 0= if
- " No UUID in mfg data" ?lease-debug-cr
+ " No UUID in mfg data" ?lease-error-cr
true exit
then ( adr len )
?-null dup d# 36 <> if
- " Invalid UUID" ?lease-debug-cr
+ " Invalid UUID" ?lease-error-cr
2drop true exit
then ( adr len )
machine-id-buf d# 12 + swap move
@@ -419,12 +406,12 @@
2dup " 00000000T000000Z" $= if 0 exit then
dup d# 16 <> if ( expiration$ )
- " has bad expiration format" ?lease-debug-cr
+ " has bad expiration format" ?lease-error-cr
-1 exit
then ( expiration$ )
2dup expired? if
- " expired" ?lease-debug-cr
+ " expired" ?lease-error-cr
-1 exit
then ( expiration$ )
0
@@ -454,7 +441,10 @@
my-sn$ $= 0= if 2drop 0 exit then ( rem$ )
\ Disposition code
- bl left-parse-string 1 <> if 3drop -1 exit then ( rem$ disp-adr )
+ bl left-parse-string 1 <> if
+ " No disposition code" ?lease-error-cr
+ 3drop -1 exit
+ then ( rem$ disp-adr )
set-disposition ( rem$ )
bl left-parse-string check-expiry if 4drop -1 exit then ( sig$ exp$ )
@@ -470,7 +460,7 @@
: check-lease ( act01-lease$ -- -1|0|1 )
bl left-parse-string " act01:" $= 0= if
- " Not act01:" ?lease-debug-cr
+ " Not act01:" ?lease-error-cr
2drop -1 exit
then ( rem$ )
check-timed-signature ( -1|0|1 )
@@ -498,7 +488,7 @@
-1 of r> close-file drop " lock" show-icon false exit endof
endcase
repeat
- " No matching records" ?lease-debug-cr
+ " No matching records" ?lease-error-cr
r> close-file drop false
;
@@ -575,6 +565,7 @@
;
false value secure?
+false value in-factory?
stand-init: wp
" wp" find-tag if 2drop true to secure? then
@@ -612,7 +603,7 @@
-1 of r> close-file drop false exit endof
endcase
repeat
- " No matching records" ?lease-debug-cr
+ " No matching records" ?lease-error-cr
r> close-file drop false
;
@@ -625,13 +616,13 @@
base @ >r d# 36 base !
fw#buf 5 $number if
show-x
- visible ." Invalid firmware version number" security-failure
+ " Invalid firmware version number" .security-failure
then
pop-base
;
: firmware-up-to-date? ( img$ -- )
- /flash <> if show-x visible ." Invalid Firmware image" security-failure then ( adr )
+ /flash <> if show-x " Invalid Firmware image" .security-failure then ( adr )
(fw-version) ( file-version# )
rom-pa (fw-version) ( file-version# rom-version# )
u<=
@@ -680,7 +671,7 @@
['] ?enough-power catch ?dup if
visible
- .error
+ red-letters .error black-letters
security-failure
then
@@ -689,9 +680,7 @@
reflash \ Should power-off and reboot
show-x
- visible
- ." Reflash returned, unexpectedly" cr
- security-failure
+ " Reflash returned, unexpectedly" .security-failure
then
show-lock
then
@@ -757,7 +746,6 @@
next-xy to icon-xy ( list$ )
repeat ( list$ )
- " sad" show-icon ( list$ )
2drop false ( )
;
@@ -765,15 +753,19 @@
: all-devices$ ( -- list$ ) " disk: sd: nand:" ;
+: secure-startup ( -- )
+ in-factory? if
+ button-check button-x or button-o or button-square or button-rotate or ( mask )
+ game-key-mask = if exit then
+ then
-: secure-startup ( -- )
['] noop to ?show-device
['] noop to load-done
['] noop to load-started
set-alternate
- button-rotate game-key? if show-warnings then
+\ button-rotate game-key? if show-warnings then
show-child
?force-secure
@@ -788,18 +780,58 @@
persistent-devkey? if true to security-off? visible exit then
- get-my-sn if visible ." No serial number" cr show-sad security-failure then
+ get-my-sn if " No serial number" .security-failure then
- get-date current-seconds earliest d< if
+ date-bad? if
\ This is not fatal, because we don't want a brick if the RTC battery fails
- visible ." Invalid system date" cr show-sad
+ visible red-letters ." Invalid system date" black-letters cr show-sad
then
- load-crypto if visible ." Crytpo load failed" cr show-sad security-failure then ( )
+ load-crypto if " Crytpo load failed" .security-failure then ( )
alternate? if " \boot-alt" else " \boot" then pn-buf place
all-devices$ load-from-list if exit then \ Returns only if no images found
- visible ." Boot failed" cr show-sad security-failure
+ " Boot failed" .security-failure
;
+
+: efface-md ( -- )
+ " md" find-tag 0= if exit then ( data$ )
+ + 2 + flash-base - ( flash-offset )
+ spi-start spi-identify ( flash-offset )
+ " MD" rot write-spi-flash ( )
+ spi-reprogrammed ( )
+;
+
+: days>seconds ( n -- seconds ) [ d# 60 d# 60 * d# 24 * ] literal * ;
+: ?factory-mode ( -- )
+ date-bad? if efface-md exit then
+ " md" find-tag if ( data$ )
+ 0 left-parse-string 2nip ( time$ )
+ \ Erase the tag if it is invalid
+ expiration-to-seconds if efface-md exit then ( begin-seconds )
+ dup 3 days>seconds + ( begin-seconds end-seconds )
+ \ Erase the tag if its time is up
+ current-seconds -rot within 0= if efface-md exit then ( )
+ true to in-factory?
+ then
+;
+
+\ iso8601 date construction for activation key
+: .2digits ( .. roll# -- .. ) roll u# u# drop ;
+: >iso8601$ ( s m h d m y -- adr len )
+ push-decimal
+ <#
+ [char] Z hold 5 .2digits 4 .2digits 3 .2digits
+ [char] T hold 2 .2digits 1 .2digits u# u# u# u#
+ u#>
+ pop-base
+;
+
+: factory-mode ( -- )
+ " md" find-tag if ." md tag already exists" cr 2drop exit then
+ " MD" find-tag if ." MD tag already exists" cr 2drop exit then
+ date-bad? if ." The RTC is not set correctly" cr exit then
+ time&date >iso8601$ " md" $add-tag
+;