Author: wmb Date: Wed Nov 3 10:40:59 2010 New Revision: 2004 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2004
Log: OLPC XO-1.75 - Added hashing support using Marvell's accelerator hardware, and made the WLAN work.
Added: cpu/arm/mmp2/hash.fth cpu/arm/olpc/1.75/sd8686.bth dev/mmc/sdhci/mv8686/loadpkg.fth ofw/wifi/hmacsha1.fth Modified: cpu/arm/marvell/utmiphy.fth cpu/arm/olpc/1.75/boardgpio.fth cpu/arm/olpc/1.75/fw-version.fth cpu/arm/olpc/1.75/fw.bth cpu/arm/olpc/1.75/olpc.bth cpu/arm/olpc/1.75/prefw.bth cpu/arm/olpc/1.75/sdhci.fth dev/mmc/sdhci/mv8686/mv8686.bth ofw/wifi/loadpkg.fth ofw/wifi/sha1.fth
Modified: cpu/arm/marvell/utmiphy.fth ============================================================================== --- cpu/arm/marvell/utmiphy.fth Wed Nov 3 10:28:30 2010 (r2003) +++ cpu/arm/marvell/utmiphy.fth Wed Nov 3 10:40:59 2010 (r2004) @@ -16,21 +16,36 @@ loop ." PLL calibrate timeout" cr ; +h# 7e03.ffff value pll-clr \ PLLCALI12, PLLVDD18, PLLVDD12, KVCO, ICP, FBDIV, REFDIV, +h# 7e01.aeeb value pll-set \ 3 3 3 3 2 ee b + +h# 00df.c000 value tx-clr \ TXVDD12, CK60_PHSEL, IMPCAL_VTH +h# 00c9.4000 value tx-set \ 3 4 5 + +h# 0001.80f0 value rx-clr \ REG_SQ_LENGTH, RX_SQ_THRESH +h# 0001.000a value rx-set \ 2 a + : init-usb-phy ( -- ) +[ifdef] notdef + ." Interacting before USB PHY init." cr + ." Change pll-set, tx-set, rx-set as desired then type 'resume'" cr + interact +[then] + \ Turn on the USB PHY power h# 1010.0000 utmi-ctrl regset \ INPKT_DELAY_SOF, PU_REF h# 2 utmi-ctrl regset \ PLL_PWR_UP h# 1 utmi-ctrl regset \ PWR_UP
\ Configure the PLLs - h# 7e03.ffff utmi-pll regclr \ PLLCALI12, PLLVDD18, PLLVDD12, KVCO, ICP, FBDIV, REFDIV, - h# 7e01.aeeb utmi-pll regset \ 3 3 3 3 2 ee b + pll-clr utmi-pll regclr \ PLLCALI12, PLLVDD18, PLLVDD12, KVCO, ICP, FBDIV, REFDIV, + pll-set utmi-pll regset \ 3 3 3 3 2 ee b
- h# 00df.c000 utmi-tx regclr \ TXVDD12, CK60_PHSEL, IMPCAL_VTH - h# 00c9.4000 utmi-tx regset \ 3 4 5 + tx-clr utmi-tx regclr \ TXVDD12, CK60_PHSEL, IMPCAL_VTH + tx-set utmi-tx regset \ 3 4 5
- h# 0001.80f0 utmi-rx regclr \ REG_SQ_LENGTH, RX_SQ_THRESH - h# 0001.000a utmi-rx regset \ 2 a + rx-clr utmi-rx regclr \ REG_SQ_LENGTH, RX_SQ_THRESH + rx-set utmi-rx regset \ 2 a
d# 10000 wait-cal
@@ -45,4 +60,5 @@ h# 0000.1000 utmi-tx regclr
d# 1000 wait-cal +\ ." UTMI calibration done" cr ;
Added: cpu/arm/mmp2/hash.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/mmp2/hash.fth Wed Nov 3 10:40:59 2010 (r2004) @@ -0,0 +1,175 @@ +\ See license at end of file +purpose: Hashes (MD5, SHA1, SHA-256) using Marvell hardware acceleration + +h# 8101 constant dval +: dma>hash ( adr len -- ) + 4 round-up 2 rshift h# d429080c l! ( adr ) + h# d4290808 l! ( ) + dval h# d4290800 l! ( ) +\ begin h# d4290814 l@ 1 and until +; +: dma-stop h# d4290800 l@ 1 invert and h# d4290800 l! ; +: swap-axi-bytes ( -- ) h# 5 h# d4290838 l! ; \ Byte swap input and output +: in-fifo-remain ( -- n ) h# d429083c l@ ; +\ : in-fifo@ ( -- n ) h# d4290880 l@ ; +\ : in-fifo! ( n -- ) h# d4290880 l! ; +\ : out-fifo@ ( -- n ) h# d4290900 l@ ; +\ : out-fifo! ( n -- ) h# d4290900 l! ; + +h# 40 value /hash-block +d# 20 value /hash-digest +/hash-block 2* buffer: (hash-buf) +: hash-buf ( -- adr ) (hash-buf) /hash-block round-up ; \ Aligned +0 value #hash-buf +0 value #hashed + +: use-sha1 ( -- ) 0 h# d4291800 l! d# 20 to /hash-digest ; +: use-sha256 ( -- ) 1 h# d4291800 l! d# 32 to /hash-digest ; +: use-sha224 ( -- ) 2 h# d4291800 l! d# 28 to /hash-digest ; +: use-md5 ( -- ) 3 h# d4291800 l! d# 16 to /hash-digest ; + +: hash-control! ( n -- ) h# d4291804 l! ; +: hash-go ( -- ) + 1 h# d4291808 l! + begin h# d429180c l@ 1 and until + 1 h# d429180c l! +; +: set-msg-size ( n -- ) + 0 h# d429181c l! \ High word of total size + h# d4291818 l! \ Low word of total size +; +: hash-init ( -- ) + 1 h# d4290c00 l! \ Select hash (0) for Accelerator A, crossing to direct DMA to it + dma-stop + 8 hash-control! \ Reset + 0 hash-control! \ Unreset + 1 hash-control! \ Init digest + hash-go + 0 to #hash-buf + 0 to #hashed +; + +: hash-update-step ( -- ) + hash-buf /hash-block dma>hash ( ) + /hash-block h# d4291810 l! ( ) + 2 hash-control! \ Update digest ( ) + hash-go ( ) + dma-stop +; +: copy-to-hashbuf ( adr thislen -- ) + tuck ( adr thislen ) + hash-buf #hash-buf + swap move ( thislen ) + #hash-buf + to #hash-buf ( ) + #hash-buf /hash-block = if ( ) + hash-update-step ( ) + 0 to #hash-buf + then +; +: hash-update ( adr len -- adr' len' ) + dup #hashed + to #hashed ( adr len ) + begin dup while ( adr len ) + 2dup /hash-block #hash-buf - min ( adr len adr this ) + tuck copy-to-hashbuf ( adr len this ) + /string ( adr' len' ) + repeat ( adr len ) + 2drop +; +: hash-final ( -- ) + #hashed set-msg-size ( ) + #hash-buf h# d4291810 l! ( ) + #hash-buf if + hash-buf #hash-buf dma>hash ( ) + then + 7 hash-control! \ Final, with hardware padding + hash-go + dma-stop + h# d4291820 /hash-digest +; +: hash1 ( adr len -- ) + hash-init ( adr len ) + hash-update ( adr' len' ) + hash-final +; +0 [if] +: hash2 ( adr1 len1 adr2 len2 -- digest$ ) + third over + >r ( adr1 len1 adr2 len2 r: total-len ) + hash-init ( adr1 len1 adr2 len2 r: total-len ) + 2swap hash-update ( adr2 len2 r: total-len ) + hash-update ( r: total-len ) + r> hash-done ( digest$ ) +; +[then] + +: md5 ( adr len -- digest$ ) use-md5 hash1 ; +\ alias $md5digest1 md5 + +\ : $md5digest2 ( adr1 len1 adr2 len2 -- digest$ ) use-md5 hash2 ; + +: sha-256 ( adr len -- digest$ ) use-sha256 hash1 ; + +: sha1 ( adr len -- digest$ ) use-sha1 hash1 ; + +\ The following interface is for the benefit of ofw/wifi/hmacsha1.fth +d# 20 constant /sha1-digest +0 value sha1-digest +: sha1-init use-sha1 hash-init ; +: sha1-update hash-update ; +: sha1-final hash-final drop to sha1-digest ; + +: ebg-set ( n -- ) h# d4292c00 l@ or h# d4292c00 l! ; +: ebg-clr ( n -- ) invert h# d4292c00 l@ and h# d4292c00 l! ; + +0 [if] +\ This is the procedure recommended by the datasheet, but it doesn't work +: init-entropy-digital ( -- ) +\ h# ffffffff ebg-clr \ All off + h# 00008000 ebg-set \ Digital entropy mode + h# 00000400 ebg-clr \ RNG reset + h# 00000200 ebg-set \ Bias power up + d# 400 us + h# 00000100 ebg-set \ Fast OSC enable + h# 00000080 ebg-set \ Slow OSC enable + h# 02000000 ebg-set \ Downsampling ratio + h# 00110000 ebg-set \ Slow OSC divider + h# 00000400 ebg-set \ RNG unreset + h# 00000040 ebg-set \ Post processor enable + h# 00001000 ebg-set +; +[else] +\ This procedure works +: init-entropy-digital ( -- ) + h# 21117c0 h# d4292c00 l! +; +[then] + +: random-short ( -- w ) + begin h# d4292c04 l@ dup 0>= while drop repeat + h# ffff and +; +: random-long ( -- l ) + random-short random-short wljoin +; + +\ LICENSE_BEGIN +\ Copyright (c) 2010 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Modified: cpu/arm/olpc/1.75/boardgpio.fth ============================================================================== --- cpu/arm/olpc/1.75/boardgpio.fth Wed Nov 3 10:28:30 2010 (r2003) +++ cpu/arm/olpc/1.75/boardgpio.fth Wed Nov 3 10:40:59 2010 (r2004) @@ -18,6 +18,7 @@ d# 33 gpio-dir-out \ EN_MSD_PWR d# 34 gpio-dir-out \ EN_WLAN_PWR d# 35 gpio-dir-out \ EN_SD_PWR + d# 57 gpio-set \ WLAN_PD# d# 57 gpio-dir-out \ WLAN_PD# d# 58 gpio-set \ WLAN_RESET# d# 58 gpio-dir-out \ WLAN_RESET#
Modified: cpu/arm/olpc/1.75/fw-version.fth ============================================================================== --- cpu/arm/olpc/1.75/fw-version.fth Wed Nov 3 10:28:30 2010 (r2003) +++ cpu/arm/olpc/1.75/fw-version.fth Wed Nov 3 10:40:59 2010 (r2004) @@ -1,3 +1,3 @@ \ The overall firmware revision macro: FW_MAJOR A -macro: FW_MINOR 01 +macro: FW_MINOR 02
Modified: cpu/arm/olpc/1.75/fw.bth ============================================================================== --- cpu/arm/olpc/1.75/fw.bth Wed Nov 3 10:28:30 2010 (r2003) +++ cpu/arm/olpc/1.75/fw.bth Wed Nov 3 10:40:59 2010 (r2004) @@ -260,6 +260,19 @@ quit ;
+: newrom + " flash! http:\10.20.0.14\new.rom" eval +\ " wifi media lab 802.11" eval +\ " flash http:\18.85.46.172\new.rom" eval +; +: urom " flash! u:\new.rom" eval ; +: erom " flash! ext:\new.rom" eval ; +: no-usb-delay " dev /usb false to delay? dend" evaluate ; +: null-fsdisk + " dev /null : write-blocks-start 3drop ; : write-blocks-finish ; dend" evaluate + " devalias fsdisk //null" evaluate +; + \ tag-file @ fclose tag-file off
.( --- Saving fw.dic ...)
Modified: cpu/arm/olpc/1.75/olpc.bth ============================================================================== --- cpu/arm/olpc/1.75/olpc.bth Wed Nov 3 10:28:30 2010 (r2003) +++ cpu/arm/olpc/1.75/olpc.bth Wed Nov 3 10:40:59 2010 (r2004) @@ -2,6 +2,7 @@
command: &builder &this in: ${BP}/cpu/arm/olpc/1.75/build/fw.img +in: sd8686.bin build-now
fload ${BP}/cpu/arm/olpc/1.75/fw-version.fth @@ -76,10 +77,8 @@ " ${BP}/dev/mmc/sdhci/mv8686/build/mv8686.fc" " mv8686" $add-deflated-dropin [then]
-0 [if] " sd8686_helper.bin" " helper_sd.bin" $add-deflated-dropin " sd8686.bin" " sd8686.bin" $add-deflated-dropin -[then]
" builton.fth" " probe-" $add-dropin
Modified: cpu/arm/olpc/1.75/prefw.bth ============================================================================== --- cpu/arm/olpc/1.75/prefw.bth Wed Nov 3 10:28:30 2010 (r2003) +++ cpu/arm/olpc/1.75/prefw.bth Wed Nov 3 10:40:59 2010 (r2004) @@ -173,18 +173,38 @@ fload ${BP}/ofw/inet/http.fth \ HTTP client end-support-package
+support-package: cifs + fload ${BP}/ofw/fs/cifs/loadpkg.fth +end-support-package +devalias smb tcp//cifs +devalias cifs tcp//cifs +: op " select smb:\test:testxxx@10.20.0.14\XTest\hello.txt" eval ; +: dsmb " dir smb:\test:testxxx@10.20.0.14\XTest" eval ; + [ifdef] notyet -fload ${BP}/cpu/x86/pc/olpc/memtest.fth +fload ${BP}/cpu/arm/olpc/1.75/memtest.fth [then]
-[ifdef] notyet +fload ${BP}/cpu/arm/mmp2/hash.fth \ Hashes - SHA1, SHA-256, MD5 + fload ${BP}/ofw/wifi/wifi-cfg.fth support-package: supplicant fload ${BP}/ofw/wifi/loadpkg.fth end-support-package
-: ofw-ssids ( -- $ ) " OFWSSID" ; -' ofw-ssids to default-ssids +: olpc-ssids ( -- $ ) " OLPCOFW" ; +' olpc-ssids to default-ssids + +[ifdef] notyet +create use-thinmac +fload ${BP}/cpu/x86/bootascall.fth +fload ${BP}/cpu/x86/pc/olpc/wifichannel.fth +fload ${BP}/cpu/x86/pc/olpc/via/nbtx.fth +fload ${BP}/cpu/x86/pc/olpc/via/nbrx.fth +fload ${BP}/cpu/x86/pc/olpc/via/blockfifo.fth +fload ${BP}/cpu/x86/pc/olpc/via/fsupdate.fth +fload ${BP}/cpu/x86/pc/olpc/via/fsverify.fth +devalias fsdisk int:0 [then]
fload ${BP}/ofw/inet/sntp.fth @@ -219,7 +239,6 @@ support-package: nfs fload ${BP}/ofw/fs/nfs/loadpkg.fth end-support-package - [then] devalias nfs net//obp-tftp:last//nfs
Added: cpu/arm/olpc/1.75/sd8686.bth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/olpc/1.75/sd8686.bth Wed Nov 3 10:40:59 2010 (r2004) @@ -0,0 +1,31 @@ +purpose: Fetch the firmware for the Marvell 8686 wireless LAN module + +command: &builder &this +build-now + +fload ${BP}/cpu/arm/olpc/1.75/wlan-version.fth + +" macro: WLAN_FILE lbtf_sdio-${WLAN_VERSION}" expand$ eval + +" ${GET_WLAN}" expand$ nip [if] + " ${GET_WLAN}" expand$ $sh +[else] +" rm -f sd8686.bin sd8686_helper.bin" expand$ $sh + +" wget -q http://dev.laptop.org/pub/firmware/libertas/thinfirm/$%7BWLAN_FILE%7D.bin" expand$ $sh +" wget -q http://dev.laptop.org/pub/firmware/libertas/thinfirm/$%7BWLAN_FILE%7D.bin.md..." expand$ $sh +" md5sum ${WLAN_FILE}.bin | cmp - ${WLAN_FILE}.bin.md5" expand$ $sh + +" mv ${WLAN_FILE}.bin sd8686.bin" expand$ $sh + +" wget -q http://dev.laptop.org/pub/firmware/libertas/sd8686_helper.bin" expand$ $sh +" wget -q http://dev.laptop.org/pub/firmware/libertas/sd8686_helper.bin.md5" expand$ $sh +" md5sum -b sd8686_helper.bin | cmp - sd8686_helper.bin.md5" expand$ $sh + +" rm ${WLAN_FILE}.bin.md5 sd8686_helper.bin.md5" expand$ $sh +[then] + +\ This forces the creation of a .log file, so we don't re-fetch +writing sd8686.version +" ${WLAN_VERSION}"n" expand$ ofd @ fputs +ofd @ fclose
Modified: cpu/arm/olpc/1.75/sdhci.fth ============================================================================== --- cpu/arm/olpc/1.75/sdhci.fth Wed Nov 3 10:28:30 2010 (r2003) +++ cpu/arm/olpc/1.75/sdhci.fth Wed Nov 3 10:40:59 2010 (r2004) @@ -24,11 +24,6 @@ : gpio-power-off ( -- ) d# 35 gpio-clr sdhci-card-power-off ; ' gpio-power-off to card-power-off
-\ new-device -\ 2 encode-int " reg" property -\ " mv8686" " $load-driver" eval drop -\ finish-device - new-device 1 encode-int " reg" property fload ${BP}/dev/mmc/sdhci/sdmmc.fth @@ -38,6 +33,36 @@
end-package
+0 0 " d4280800" " /" begin-package + + fload ${BP}/cpu/arm/olpc/1.75/sdregs.fth + fload ${BP}/dev/mmc/sdhci/sdhci.fth + + true to avoid-high-speed? + + hex + \ The new clock divisor layout is low 8 bits in [15:8] and high 2 bits in [7:6] + \ The resulting 10-bit value is multiplied by 2 to form the divisor for the + \ 200 MHz base clock. + patch 403 103 card-clock-25 \ n is 4, divisor is 8, clk is 25 MHz + patch 203 003 card-clock-50 \ n is 2, divisor is 4, clk is 50 MHz + patch 043 8003 card-clock-slow \ n is h# 100 (high 2 bits in [7:6], for divisor of 512 from 200 MHz clock + + ' true to card-inserted? + + : gpio-power-on ( -- ) sdhci-card-power-on d# 34 gpio-set ; + ' gpio-power-on to card-power-on + + : gpio-power-off ( -- ) d# 34 gpio-clr sdhci-card-power-off ; + ' gpio-power-off to card-power-off + + new-device + 1 encode-int " reg" property + fload ${BP}/dev/mmc/sdhci/mv8686/loadpkg.fth + finish-device + +end-package + 0 0 " d4281000" " /" begin-package
fload ${BP}/cpu/arm/olpc/1.75/sdregs.fth @@ -73,6 +98,7 @@
stand-init: \ SDHC clocks h# 41b h# d4282854 l! \ SD0 (external SD) clocks, plus set master clock divisor + h# 1b h# d4282858 l! \ SD1 (WLAN) clocks h# 1b h# d42828e8 l! \ SD2 (internal microSD) clocks h# 70a h# d4200104 l! \ Clock gating h# 70a h# d4201104 l! \ Clock gating
Added: dev/mmc/sdhci/mv8686/loadpkg.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ dev/mmc/sdhci/mv8686/loadpkg.fth Wed Nov 3 10:40:59 2010 (r2004) @@ -0,0 +1,7 @@ +fload ${BP}/dev/mmc/sdhci/mv8686/common.fth \ Ethernet common variables and routines +fload ${BP}/dev/mmc/sdhci/mv8686/ring.fth \ Receive ring management +fload ${BP}/dev/mmc/sdhci/mv8686/sdio.fth \ SDIO interface routines +fload ${BP}/dev/mmc/sdhci/mv8686/mv8686.fth \ SDIO I/O interface for Marvell 8686 +fload ${BP}/dev/libertas.fth \ Marvell "Libertas" common code +fload ${BP}/dev/mmc/sdhci/mv8686/fw8686.fth \ Marvell firmware download for SDIO +\ fload ${BP}/dev/mmc/sdhci/mv8686/wlan.fth \ External interface methods
Modified: dev/mmc/sdhci/mv8686/mv8686.bth ============================================================================== --- dev/mmc/sdhci/mv8686/mv8686.bth Wed Nov 3 10:28:30 2010 (r2003) +++ dev/mmc/sdhci/mv8686/mv8686.bth Wed Nov 3 10:40:59 2010 (r2004) @@ -10,13 +10,7 @@
FCode-version2
-fload ${BP}/dev/mmc/sdhci/mv8686/common.fth \ Ethernet common variables and routines -fload ${BP}/dev/mmc/sdhci/mv8686/ring.fth \ Receive ring management -fload ${BP}/dev/mmc/sdhci/mv8686/sdio.fth \ SDIO interface routines -fload ${BP}/dev/mmc/sdhci/mv8686/mv8686.fth \ SDIO I/O interface for Marvell 8686 -fload ${BP}/dev/libertas.fth \ Marvell "Libertas" common code -fload ${BP}/dev/mmc/sdhci/mv8686/fw8686.fth \ Marvell firmware download for SDIO -\ fload ${BP}/dev/mmc/sdhci/mv8686/wlan.fth \ External interface methods +fload ${BP}/dev/mmc/sdhci/mv8686/loadpkg.fth
end0
Added: ofw/wifi/hmacsha1.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ ofw/wifi/hmacsha1.fth Wed Nov 3 10:40:59 2010 (r2004) @@ -0,0 +1,139 @@ +purpose: HMAC-SHA1 used for WPA-PSK +\ See license at end of file + +\ ---------------------------------------------------------------------------- +\ HMAC-SHA1 over data vector (RFC 2104) + +d# 64 constant /keypad +/keypad buffer: keypad + +: xor-keypad ( adr c -- ) + swap /keypad bounds do i c@ over xor i c! loop drop +; +: xor-digest ( src dst -- ) + /sha1-digest bounds do ( src ) + dup c@ i c@ xor i c! 1+ ( src' ) + loop drop +; + +: key>keypad ( key$ -- ) + keypad /keypad erase + keypad swap move +; + +\ sha1-digest = SHA1 (K XOR opad, SHA1(K XOR ipad, text)) +\ where K is an n byte key +\ ipad is 64 0x36 +\ opad is 64 0x5c +\ text is the data being protected +\ +/sha1-digest buffer: sha1-idigest \ sha1-idigest = SHA1(K XOR ipad, text)) +/sha1-digest buffer: sha1-tkey +: ?sha1-reset-key ( passphrase$ -- key$ ) + dup d# 64 > if \ if len>64, key = SHA1(key) + sha1 + sha1-tkey swap move \ Save new key + sha1-tkey /sha1-digest ( key$ ) + then +; +: hmac-sha1 ( datan$..data1$ n key$ -- digest$ ) + ?sha1-reset-key ( datan$..data1$ n key$' ) + 2dup key>keypad >r >r ( datan$..data1$ n ) ( R: key$ ) + + \ sha1-idigest = SHA1(K XOR ipad, text) + keypad h# 36 xor-keypad ( datan$..data1$ n ) ( R: key$ ) + sha1-init ( datan$..data1$ n ) ( R: key$ ) + keypad /keypad sha1-update ( datan$..data1$ n ) ( R: key$ ) + 0 ?do sha1-update loop ( ) ( R: key$ ) + sha1-final ( ) ( R: key$ ) + sha1-digest sha1-idigest /sha1-digest move ( ) ( R: key$ ) + + \ sha1-digest = SHA1(K XOR opad, sha1-idigest) + r> r> key>keypad ( ) + keypad h# 5c xor-keypad + sha1-init + keypad /keypad sha1-update + sha1-idigest /sha1-digest sha1-update + sha1-final + + sha1-digest /sha1-digest ( digest$ ) +; + +\ ---------------------------------------------------------------------------- +\ SHA1-based key derivation function (PBKDF2) for IEEE 802.11i. +\ This function is used to derive PSK for WPA-PSK, described in IEEE +\ Std 802.11-2004, clause H.4. The main contruction is from PKCS#5 v 2.0. + +0 value pbkdf2-cnt +4 buffer: pbkdf2-cnt-buf +: pbkdf2-cnt++ ( -- ) + pbkdf2-cnt 1+ dup to pbkdf2-cnt + pbkdf2-cnt-buf be-l! +; + +/sha1-digest buffer: temp \ Last digest +/sha1-digest buffer: temp2 \ Current digest +: (pbkdf2-sha1) ( passphrase$ ssid$ -- ) + 2over >r >r ( passphrase$ ssid$ ) ( R: passphrase$ ) + pbkdf2-cnt-buf 4 2swap 2 r> r> hmac-sha1 ( passphrase$ digest$ ) + temp2 swap move ( passphrase$ ) + d# 4096 1 do + sha1-digest temp /sha1-digest move ( passphrase$ ) + temp /sha1-digest 1 4 pick 4 pick hmac-sha1 ( passphrase$ digest$ ) + drop temp2 xor-digest ( passphrase$ ) + loop 2drop ( ) + temp2 sha1-digest /sha1-digest move +; + +: pbkdf2-sha1 ( passphrase$ ssid$ psk$ -- ) + 0 to pbkdf2-cnt + begin dup 0> while ( passphrase$ ssid$ psk$ ) + pbkdf2-cnt++ ( passphrase$ ssid$ psk$ ) + >r >r 2over 2over (pbkdf2-sha1) ( passphrase$ ssid$ ) ( R: psk$ ) + r> r> 2dup /sha1-digest min sha1-digest -rot move ( passphrase$ ssid$ psk$ ) + /sha1-digest /string ( passphrase$ ssid$ psk$' ) + repeat 2drop 2drop 2drop ( ) +; + +create zero 0 c, +create prf-cnt 0 c, +: zero$ ( -- adr len ) zero 1 ; +: sha1-prf ( key$ label$ data$ result$ -- ) + 0 prf-cnt c! + begin dup 0> while ( key$ label$ data$ result$ ) + >r >r ( key$ label$ data$ ) ( R: result$ ) + prf-cnt 1 2over zero$ ( key$ label$ data$ cnt$ data$ zero$ ) ( R: result$ ) + 9 pick 9 pick 4 ( key$ label$ data$ cnt$ data$ zero$ label$ n ) ( R: result$ ) + d# 14 pick d# 14 pick hmac-sha1 ( key$ label$ data$ digest$ ) ( R: result$ ) + r> r> 2swap 2over rot min move ( key$ label$ data$ result$ ) + /sha1-digest /string ( key$ label$ data$ result$' ) + prf-cnt c@ 1+ prf-cnt c! ( key$ label$ data$ result$ ) + repeat 2drop 2drop 2drop 2drop ( ) + +; + + +\ LICENSE_BEGIN +\ Copyright (c) 2007 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining + +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Modified: ofw/wifi/loadpkg.fth ============================================================================== --- ofw/wifi/loadpkg.fth Wed Nov 3 10:28:30 2010 (r2003) +++ ofw/wifi/loadpkg.fth Wed Nov 3 10:40:59 2010 (r2004) @@ -4,6 +4,7 @@ [ifdef] 386-assembler fload ${BP}/ofw/wifi/sha1.fth [then] +fload ${BP}/ofw/wifi/hmacsha1.fth fload ${BP}/ofw/wifi/aes.fth fload ${BP}/ofw/wifi/md5.fth fload ${BP}/ofw/wifi/rc4.fth
Modified: ofw/wifi/sha1.fth ============================================================================== --- ofw/wifi/sha1.fth Wed Nov 3 10:28:30 2010 (r2003) +++ ofw/wifi/sha1.fth Wed Nov 3 10:40:59 2010 (r2004) @@ -309,117 +309,6 @@
init-'sha1
-\ ---------------------------------------------------------------------------- -\ HMAC-SHA1 over data vector (RFC 2104) - -d# 64 constant /keypad -/keypad buffer: keypad - -: xor-keypad ( adr c -- ) - swap /keypad bounds do i c@ over xor i c! loop drop -; -: xor-digest ( src dst -- ) - /sha1-digest bounds do ( src ) - dup c@ i c@ xor i c! 1+ ( src' ) - loop drop -; - -: key>keypad ( key$ -- ) - keypad /keypad erase - keypad swap move -; - -\ sha1-digest = SHA1 (K XOR opad, SHA1(K XOR ipad, text)) -\ where K is an n byte key -\ ipad is 64 0x36 -\ opad is 64 0x5c -\ text is the data being protected -\ -/sha1-digest buffer: sha1-idigest \ sha1-idigest = SHA1(K XOR ipad, text)) -/sha1-digest buffer: sha1-tkey -: ?sha1-reset-key ( passphrase$ -- key$ ) - dup d# 64 > if \ if len>64, key = SHA1(key) - sha1 - sha1-tkey swap move \ Save new key - sha1-tkey /sha1-digest ( key$ ) - then -; -: hmac-sha1 ( datan$..data1$ n key$ -- digest$ ) - ?sha1-reset-key ( datan$..data1$ n key$' ) - 2dup key>keypad >r >r ( datan$..data1$ n ) ( R: key$ ) - - \ sha1-idigest = SHA1(K XOR ipad, text) - keypad h# 36 xor-keypad ( datan$..data1$ n ) ( R: key$ ) - sha1-init ( datan$..data1$ n ) ( R: key$ ) - keypad /keypad sha1-update ( datan$..data1$ n ) ( R: key$ ) - 0 ?do sha1-update loop ( ) ( R: key$ ) - sha1-final ( ) ( R: key$ ) - sha1-digest sha1-idigest /sha1-digest move ( ) ( R: key$ ) - - \ sha1-digest = SHA1(K XOR opad, sha1-idigest) - r> r> key>keypad ( ) - keypad h# 5c xor-keypad - sha1-init - keypad /keypad sha1-update - sha1-idigest /sha1-digest sha1-update - sha1-final - - sha1-digest /sha1-digest ( digest$ ) -; - -\ ---------------------------------------------------------------------------- -\ SHA1-based key derivation function (PBKDF2) for IEEE 802.11i. -\ This function is used to derive PSK for WPA-PSK, described in IEEE -\ Std 802.11-2004, clause H.4. The main contruction is from PKCS#5 v 2.0. - -0 value pbkdf2-cnt -4 buffer: pbkdf2-cnt-buf -: pbkdf2-cnt++ ( -- ) - pbkdf2-cnt 1+ dup to pbkdf2-cnt - pbkdf2-cnt-buf be-l! -; - -/sha1-digest buffer: temp \ Last digest -/sha1-digest buffer: temp2 \ Current digest -: (pbkdf2-sha1) ( passphrase$ ssid$ -- ) - 2over >r >r ( passphrase$ ssid$ ) ( R: passphrase$ ) - pbkdf2-cnt-buf 4 2swap 2 r> r> hmac-sha1 ( passphrase$ digest$ ) - temp2 swap move ( passphrase$ ) - d# 4096 1 do - sha1-digest temp /sha1-digest move ( passphrase$ ) - temp /sha1-digest 1 4 pick 4 pick hmac-sha1 ( passphrase$ digest$ ) - drop temp2 xor-digest ( passphrase$ ) - loop 2drop ( ) - temp2 sha1-digest /sha1-digest move -; - -: pbkdf2-sha1 ( passphrase$ ssid$ psk$ -- ) - 0 to pbkdf2-cnt - begin dup 0> while ( passphrase$ ssid$ psk$ ) - pbkdf2-cnt++ ( passphrase$ ssid$ psk$ ) - >r >r 2over 2over (pbkdf2-sha1) ( passphrase$ ssid$ ) ( R: psk$ ) - r> r> 2dup /sha1-digest min sha1-digest -rot move ( passphrase$ ssid$ psk$ ) - /sha1-digest /string ( passphrase$ ssid$ psk$' ) - repeat 2drop 2drop 2drop ( ) -; - -create zero 0 c, -create prf-cnt 0 c, -: zero$ ( -- adr len ) zero 1 ; -: sha1-prf ( key$ label$ data$ result$ -- ) - 0 prf-cnt c! - begin dup 0> while ( key$ label$ data$ result$ ) - >r >r ( key$ label$ data$ ) ( R: result$ ) - prf-cnt 1 2over zero$ ( key$ label$ data$ cnt$ data$ zero$ ) ( R: result$ ) - 9 pick 9 pick 4 ( key$ label$ data$ cnt$ data$ zero$ label$ n ) ( R: result$ ) - d# 14 pick d# 14 pick hmac-sha1 ( key$ label$ data$ digest$ ) ( R: result$ ) - r> r> 2tuck rot min move ( key$ label$ data$ result$ ) - /sha1-digest /string ( key$ label$ data$ result$' ) - prf-cnt c@ 1+ prf-cnt c! ( key$ label$ data$ result$ ) - repeat 2drop 2drop 2drop 2drop ( ) - -; -
\ LICENSE_BEGIN \ Copyright (c) 2007 FirmWorks