wok rev 17496

syslinux/iso2exe: check ISO md5 (again)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Jan 05 12:38:18 2015 +0100 (2015-01-05)
parents d8c3590387b5
children c8d571ac0076
files syslinux/stuff/iso2exe/README syslinux/stuff/iso2exe/bootiso.S syslinux/stuff/iso2exe/init syslinux/stuff/iso2exe/iso2exe.sh
line diff
     1.1 --- a/syslinux/stuff/iso2exe/README	Sun Jan 04 11:37:00 2015 +0000
     1.2 +++ b/syslinux/stuff/iso2exe/README	Mon Jan 05 12:38:18 2015 +0100
     1.3 @@ -55,6 +55,8 @@
     1.4      +-----------------+
     1.5      |    untouched    | ISO9660 files including /boot/bzImage and /boot/rootfs*
     1.6  32K +-----------------+
     1.7 +    |       | iso md5 | ISO9660 image (except first 32K) md5 hash
     1.8 +    |       +---------+
     1.9      |  DOS .EXE stub  | Start DOS .COM loader
    1.10      +-----------------+
    1.11      |  ISO initramfs  | Live loader and UMSDOS like install script
     2.1 --- a/syslinux/stuff/iso2exe/bootiso.S	Sun Jan 04 11:37:00 2015 +0000
     2.2 +++ b/syslinux/stuff/iso2exe/bootiso.S	Mon Jan 05 12:38:18 2015 +0100
     2.3 @@ -26,24 +26,23 @@
     2.4  	.word	0			// File address of relocation table
     2.5  id:
     2.6  	.word	0			// Overlay number
     2.7 -fdcnt:
     2.8 +fdcnt:					// File address of relocation table
     2.9  	.byte	0			// Bootstrap floppy sector count
    2.10  
    2.11  /////////////////////// Master Boot Record code //////////////////////////////
    2.12  
    2.13 -start0:					// File address of relocation table
    2.14 -	pushw	%dx			// restore SP
    2.15 +start0:
    2.16 +	pushw	%dx			// restore %sp
    2.17  	incw	%bp			// restore %bp
    2.18 -	pushw	$0
    2.19 -	popw	%ds
    2.20 -	movw	$0x7C00, %bx
    2.21 -	pushfw
    2.22 -	pushw	%ds
    2.23 -	pushw	%bx
    2.24 +	xorw	%bx, %bx
    2.25 +	movw	%bx, %ds
    2.26 +	movb	$0x7C, %bh
    2.27 +	pushw	%bx			// return address
    2.28  	pushaw
    2.29  	movw	%sp, %bp
    2.30 -	pushw	%es
    2.31 +	pushw	%es			// save %es:%di
    2.32  	cld
    2.33 +	sti
    2.34  	pushw	%ds
    2.35  	popw	%es
    2.36  	call	setreg
    2.37 @@ -60,9 +59,11 @@
    2.38  comstart:
    2.39  	.word	0
    2.40  	
    2.41 -readsectorX:
    2.42 -	movb	$0, %cl
    2.43 +	.org	68
    2.44 +readsectorX:				// read isolinux boot sector
    2.45 +	movb	$0xA5, %cl		// patched by installer
    2.46  readsector1:
    2.47 +	andb	$0x83, %dl		// disk and floppy disk
    2.48  	movw	%cx, (%bx)
    2.49  	incw	%cx
    2.50  	movw	$0x201, %ax
    2.51 @@ -73,52 +74,52 @@
    2.52  	movw	$0x0100, %cx
    2.53  return:
    2.54  	ret
    2.55 +dxloop:
    2.56  start2:
    2.57 -dxloop:
    2.58 -	call	readsector1
    2.59 +	call	readsector1		// look for the boot device
    2.60  	repe
    2.61  	cmpsw
    2.62  	je	dxfound
    2.63 -next:
    2.64 -	xorw	%cx, %cx
    2.65 -	xchgw	%ax, %dx
    2.66 -	addb	$0x7D, %al		// try every hard disk
    2.67 -	andb	$0x83, %al		//   and floppy disk
    2.68 -	cmpb	$0x80, %al
    2.69 -	xchgw	%ax, %dx
    2.70 -	jnz	dxloop
    2.71 +	movb	$0, %cl			// ch = 0
    2.72 +	addb	$0x7D, %dl		// try every hard disk
    2.73 +	jno	dxloop
    2.74  dxfound:
    2.75 +	call	readsectorX		// read isolinux boot sector
    2.76  	movw	%dx, 10(%bp)
    2.77  	call	checkboot
    2.78 -	.ascii	"No isolinux mbr."
    2.79 +	.asciz	"No isolinux bs"
    2.80  
    2.81  	.org	0x0080
    2.82  ////////////////////////////// EXE/PE header //////////////////////////////////
    2.83  
    2.84  	.org	0x01A0
    2.85  checkboot:
    2.86 -	call	readsectorX
    2.87 -	lodsw
    2.88 +	cmpw	%cx, (%bx)
    2.89  	popw	%si
    2.90 -	shrw	$1, %ax
    2.91 -	jz	error			// read fail or not isohydrid
    2.92 +	jc	error			// read fail or no isohydrid boot sector
    2.93  	popw	%es
    2.94  	popa
    2.95 -	iret
    2.96 -
    2.97 -error:
    2.98 -	lodsb
    2.99 +putsret:
   2.100 +	ret
   2.101 +putstrlp:
   2.102  	movw	$7, %bx
   2.103  	movb	$0xE, %ah
   2.104  	int	$0x10
   2.105 -	cmp	$'.', %al
   2.106 -	jne	error
   2.107 +error:
   2.108 +	lodsb
   2.109 +	cmp	$1, %al
   2.110 +	jg	putstrlp
   2.111 +	jz	putsret
   2.112 +putstr:
   2.113 +	movb	$0x80, %ah
   2.114 +	xchgw	%ax, %si
   2.115 +	jnc	error
   2.116  halt:
   2.117  	hlt
   2.118  	jmp	halt
   2.119  	.org	0x01BE
   2.120  
   2.121 -	.org	0x7EE0
   2.122 +	.org	0x7F10
   2.123  ////////////////////////////// DOS EXE code ///////////////////////////////////
   2.124  
   2.125  exestart:
   2.126 @@ -137,10 +138,6 @@
   2.127  	cmpb	$3, %al
   2.128  	movb	$EXESTR(noDOS3), %al
   2.129  	jb	abort
   2.130 -#if 1
   2.131 -	cmpw	(%si), %dx	// checksum not set
   2.132 -	je	chked
   2.133 -#endif
   2.134  	movw	$(EXELOC(0x8000))/2, %cx
   2.135  chklp:
   2.136  	lodsw
   2.137 @@ -151,17 +148,8 @@
   2.138  	je	tst386		// dx == 0 ?
   2.139  abort:
   2.140  puts:
   2.141 -	movb	$0x80, %ah
   2.142 -	xchgw	%ax, %si
   2.143 -putslp:
   2.144 -	lodsb
   2.145 -	orb	%al, %al
   2.146 -	jz	moveret
   2.147 -	js	puts
   2.148 -	movw	$7, %bx
   2.149 -	movb	$0xE, %ah
   2.150 -	int	$0x10
   2.151 -	jmp	putslp
   2.152 +	clc
   2.153 +	jmp	putstr
   2.154  
   2.155  tst386:
   2.156  	pushfw			// save flags
   2.157 @@ -200,13 +188,12 @@
   2.158  	movb	$0x7C/2, %ch	// 31K-31.5K, > com length
   2.159  	rep
   2.160  	movsw
   2.161 -moveret:
   2.162  	ret
   2.163  
   2.164  VersionVCPI:
   2.165  	cmpb	$0x40, %dl		// >= 4.0 ?
   2.166  	jb	NoVCPI
   2.167 -	movb	$EXESTR(vm86modemsg), %al
   2.168 +	xchgw	%ax, %si		// movb	$EXESTR(vm86modemsg), %al
   2.169  	jmp	realmode
   2.170  tstvcpi:
   2.171  	pushw	%ds
   2.172 @@ -238,48 +225,42 @@
   2.173  	.byte	0x46			// version
   2.174  	.byte	0
   2.175  
   2.176 +vm86modemsg:
   2.177  // --------------- Must be in 7F40 7FFF range ------------------------
   2.178 -//noloader:
   2.179 -//	.ascii	"No isol"		// No isolinux boot loader
   2.180 -//	.byte	EXESTR(iloader)
   2.181 -no386:
   2.182 -	.ascii	"No 386"		// No 386+
   2.183 -	.byte	EXESTR(plus)
   2.184 +	.ascii	"vm"			// vm86
   2.185 +	.byte	EXESTR(_86)
   2.186  ERRvcpi:
   2.187 -	.ascii	"No EMM386/VCPI 4"	// No EMM386/VCPI 4.0+
   2.188 -	.byte	EXESTR(dot0)
   2.189 +	.ascii	"No VCPI-4.0/EMM"	// No VCPI-4.0/EMM386
   2.190 +	.byte	EXESTR(_386)
   2.191 +noDOS3:
   2.192 +	.ascii	"No DOS 3"		// No DOS 3
   2.193 +	.byte	EXESTR(eol)
   2.194  chkerr:
   2.195 -	.ascii	"Broken ISO9660 fil"	// Broken ISO9660 file.
   2.196 -	.byte	EXESTR(eeol)
   2.197 -vm86modemsg:
   2.198 -	.ascii	"vm86"			// vm86 mode.
   2.199 -	.byte	EXESTR(mode)
   2.200 +	.ascii	"Broken c"		// Broken code
   2.201 +	.byte	EXESTR(ode)
   2.202  rmPaging:
   2.203 -	.ascii	"Invalid: paging + "	// Invalid: paging + real mode.
   2.204 +	.ascii	"Un"			// Unreal mode
   2.205  realmodemsg:
   2.206 -	.ascii	"real"			// real mode.
   2.207 +	.ascii	"real m"		// real mode
   2.208  // --------------- Must be in 7FC0 7FFF range ------------------------
   2.209 -mode:
   2.210 -	.ascii	" mod"
   2.211 +ode:
   2.212 +	.ascii	"od"
   2.213  eeol:
   2.214  	.ascii  "e"
   2.215  	.byte	EXESTR(eol)
   2.216 -noDOS3:
   2.217 -	.ascii	"No DOS 3"		// No DOS 3.0+
   2.218 -dot0:
   2.219 -	.ascii	".0"
   2.220 -plus:
   2.221 -	.ascii	"+"
   2.222 -	.byte	EXESTR(eol2)
   2.223 +no386:
   2.224 +	.ascii	"No "			// No 386
   2.225 +_386:
   2.226 +	.ascii	"3"
   2.227 +_86:
   2.228 +	.ascii	"86"
   2.229 +	.byte	EXESTR(eol)
   2.230  help:
   2.231 -	.ascii	"SliTaz GNU/L"		// SliTaz GNU/Linux boot loader
   2.232 -iloader:
   2.233 -	.ascii	"inux boot loader"
   2.234 +	.ascii	"SliTaz boot loader"	// SliTaz boot loader
   2.235  eol:
   2.236 -	.ascii	"."
   2.237 -eol2:
   2.238 -	.asciz	"\r\n"
   2.239 +	.ascii	"\r\n"
   2.240 +	.byte	1
   2.241  
   2.242 +	.space	16,0			// ISO md5
   2.243  	.org	0x8000
   2.244  ////////////////////////// ISO9660 header /////////////////////////////////////
   2.245 -
     3.1 --- a/syslinux/stuff/iso2exe/init	Sun Jan 04 11:37:00 2015 +0000
     3.2 +++ b/syslinux/stuff/iso2exe/init	Mon Jan 05 12:38:18 2015 +0100
     3.3 @@ -1,7 +1,6 @@
     3.4  #!/bin/sh
     3.5  
     3.6  DIALOG=dialog
     3.7 -ISOMD5=
     3.8  
     3.9  ddq()
    3.10  {
    3.11 @@ -10,8 +9,8 @@
    3.12  
    3.13  get()
    3.14  {
    3.15 -	od -j $1 -N ${4:-${3:-2}} -t u${3:-2} -An $2 2> /dev/null ||
    3.16 -	hexdump -v -s $1 -n ${4:-${3:-2}} -e "\"\" 1/${3:-2} \" %d\"" $2
    3.17 +	od -v -j $1 -N ${4:-${3:-2}} -t u${3:-2} -w${3:-2} -An $2 2>/dev/null ||
    3.18 +	hexdump -v -s $1 -n ${4:-${3:-2}} -e "\"\" 1/${3:-2} \" %d\n\"" $2
    3.19  }
    3.20  
    3.21  getarg()
    3.22 @@ -638,17 +637,23 @@
    3.23  
    3.24  gotisomd5()
    3.25  {
    3.26 -	[ "$(which md5sum 2> /dev/null)" ] && [ "$ISOMD5" ] &&
    3.27 -	echo -en "\"$1\"	\"$2\""
    3.28 +	[ $(get 18 /dev/loop0) -ne 0 ] && echo -en "\"$1\"	\"$2\""
    3.29  }
    3.30  
    3.31  isomd5()
    3.32  {
    3.33  	dotwait "Checking iso image"
    3.34 -	[ "$(ddq if=/dev/loop0 bs=32k skip=1 | md5sum)" == "$ISOMD5  -" ] &&
    3.35 +	[ "$(ddq if=/dev/loop0 bs=32k skip=1 | md5sum)" == \
    3.36 +	  "$(ddq if=/dev/loop0 bs=16 count=1 skip=2047 | od -N 16 -t x1 -An | \
    3.37 +	     sed 's/ //g')  -" ] && echo "OK" || echo "ERROR"
    3.38 +	echo -n "Checking iso hybrid boot"
    3.39 +	n=$(($(get 2 /dev/loop0)-1+($(get 4 /dev/loop0)-1)*512))
    3.40 +	s=$(get 0 /dev/loop0 2 $n | awk '{ i+= $0 } END { print i }')
    3.41 +	[ $(((1+$s+$(get $(($n+1)) /dev/loop0 1)) % 65536)) -eq 0 ] &&
    3.42  	echo "OK" || echo "ERROR"
    3.43  	rm -f /tmp/wait
    3.44 -	sleep 5
    3.45 +	echo "Press RETURN to continue."
    3.46 +	read n
    3.47  }
    3.48  
    3.49  fdbootstrap()
    3.50 @@ -729,7 +734,7 @@
    3.51  	done ) > $device
    3.52  
    3.53  	# partition + fat32 format for the remining space
    3.54 -	get 446 $device 2 12 | { read dx cx ol oh ll lh 
    3.55 +	get 446 $device 2 12 | xargs echo | { read dx cx ol oh ll lh 
    3.56  	if [ $dx -eq $((0x3F17)) ]; then
    3.57  		cx=$(($cx & 0xFF00))
    3.58  		ofs=$(($ll+($lh<<16)))
     4.1 --- a/syslinux/stuff/iso2exe/iso2exe.sh	Sun Jan 04 11:37:00 2015 +0000
     4.2 +++ b/syslinux/stuff/iso2exe/iso2exe.sh	Mon Jan 05 12:38:18 2015 +0100
     4.3 @@ -37,11 +37,6 @@
     4.4  	mkdir -p $TMP/bin $TMP/dev
     4.5  	cp -a /dev/?d?* /dev/tty /dev/tty0 $TMP/dev
     4.6  	$0 --get init > $TMP/init.exe
     4.7 -	if [ $(stat -c %s $1) -gt 32768 ]; then
     4.8 -		echo "Compute ISO image md5 ..."
     4.9 -		sed -i "s/^ISOMD5.*/ISOMD5=$(ddq if=$1 bs=32k skip=1 | \
    4.10 -			md5sum | cut -c-32)/" $TMP/init.exe
    4.11 -	fi
    4.12  #	mount -o loop,ro $1 $TMP
    4.13  #	oldslitaz="$(ls $TMP/boot/isolinux/splash.lss 2> /dev/null)"
    4.14  #	umount -d $TMP
    4.15 @@ -242,9 +237,21 @@
    4.16  	add_fdbootstrap $1
    4.17  	printf "%d free bytes in %04X..%04X\n" $(($OFS-$HOLE)) $HOLE $OFS
    4.18  	store 26 ${RANDOM:-0} $1
    4.19 -	echo -n "Adding checksum..."
    4.20 +	if [ $(stat -c %s $1) -gt 32768 ]; then
    4.21 +		echo "Adding ISO image md5 ..."
    4.22 +		echo -en "$(ddq if=$1 bs=32k skip=1 | md5sum | cut -c-32 | sed \
    4.23 +		  's/\(..\)/\\x\1/g')" | ddq bs=16 seek=2047 conv=notrunc of=$1
    4.24 +	fi
    4.25 +	echo -n "Adding boot checksum..."
    4.26  	store 64 $(od -v -j 66 -N 32702 -t u2 -w2 -An $1 | \
    4.27  		   awk '{ i+= $0 } END { print -(i % 65536) }') $1
    4.28 +	if [ $(stat -c %s $1) -gt 32768 ]; then
    4.29 +		n=$(($(get 2 $1) - 1 + ($(get 4 $1) - 1)*512))
    4.30 +		n=$(($(od -v -N $n -t u2 -w2 -An $1 | \
    4.31 +		       awk '{ i+= $0 } END { print (i % 65536) }') \
    4.32 +		     + $(get $(($n+1)) $1 1)))
    4.33 +		store 18 $(( (-$n -1) % 65536 )) $1
    4.34 +	fi
    4.35  	echo " done."
    4.36  }
    4.37