All pastes #2092350 Raw Edit

Something

public text v1 · immutable
#2092350 ·published 2011-10-21 22:55 UTC
rendered paste body
#!/tvbin/tivosh
######################################################################
# 
# File: debundle
# 
# Description: Create a few fake keys for each head-end, for use
#              during testing - modified to search /State/Keyring
#	           for encryption keys and to be callable from shell
# 
# Copyright (c) 2001 TiVo Inc.
# 
######################################################################

source $tcl_library/tv/Inc.itcl 
tvsource $tcl_library/tv/mfslib.tcl
tvsource $tcl_library/tv/setup.tcl

namespace import Inc::*

########
#
# UnBundle
#
########

proc unbundle { sourcefile } {
    if ![file exists /tmp/unbundle] {
	file mkdir /tmp/unbundle
    }
    catch {
	foreach i [glob /tmp/unbundle/*] {
	    file delete -force $i
	}
    }
    set srcSize [file size $sourcefile]
    if {$srcSize == 0} {
	return
    }
    set currentdir [pwd]
    if {[string first "/" $sourcefile] == -1} {
	set targetdir $currentdir
	set sourcefile "$currentdir/$sourcefile"
    } else {
	set targetdir [file dirname $sourcefile]
    }
    set namebase [file tail $sourcefile]
    cd /tmp/unbundle
    putlog "Unbundling $sourcefile"
    eval exec cpio -i -I $sourcefile 2>/dev/null
    set keyfiles [glob *$Inc::TS_SKEY_EXT]
    set mykeys ""
    set db [dbopen]
    set foundkey 0
    ForeachMfsFile fsid name type "/State/Keyring/" "" {
#		set mykeys "$mykeys $name"
		RetryTransaction {
			set key [db $db openidconstruction $fsid]
			try {set keytype [dbobj $key get Type]} catch errCode { set keytype "" }
			if {$keytype == "1"} {
				set keyid [dbobj $key get Name]
				set keyval [dbobj $key get Value]
				set keymatch "$keyid$Inc::TS_SKEY_EXT"
				if {[lsearch $keyfiles $keymatch] != -1} {
				putlog "Using type-1 Blowfish key $keyid"
				set sessionkey [eval exec $Inc::TS_DECRYPT_PROG $keyval < $keymatch]
				if {[string first 0x $sessionkey] != 0} {
					putlog "Session key did not decrypt properly!"
				} else {
					putlog "Session key decrypted successfully"
					set foundkey 1
				}
				}
			}
			if {$keytype == "2"} {
				set keyid [dbobj $key get Name]
				set keyval [dbobj $key get Value]
				set keymatch "$keyid$Inc::TS_SKEY_EXT"
				if {[lsearch $keyfiles $keymatch] != -1} {
				putlog "Using type-2 ElGamal master key $keyid"
				if {[catch {set sessionkey [eval exec $Inc::TS_KEY_PROG -x -ddm $keyval $keymatch]} oops]} {
					putlog "Session key did not decrypt: $oops"
				} else {
					putlog "Session key $sessionkey decrypted successfully"
					set foundkey 1
				}
				}
			}
			if {$foundkey} {
			break;
			}
        }
    } 
    if {!$foundkey} {
        putlog "No key match!"
		putlog "Bundle keylist is $keyfiles"
		set havekeys "My keyring holds "
		
		ForeachMfsFile fsid name type "/State/Keyring/" "" {
		set havekeys "$havekeys\n$name"
		}
#       foreach key $mykeys {
#  	    	set comma [string first "," $key]
#	    	if {$comma != 1} {
#	        	set keyid [string range $key 0 [expr $comma-1]]
#	        	set havekeys "$havekeys $keyid"
#	    	}
#		}
        putlog $havekeys
		cd $currentdir
		error "Can't find a suitable key for this bundle"
    }
    putlog "Session unlocked"
    foreach file [glob *$Inc::TS_CRYPT_EXT] {
	set basefile [file rootname $file]
	putlog "Decrypting $file to $basefile"
	eval exec $Inc::TS_DECRYPT_PROG $sessionkey < $file > $basefile
	file delete $file
    }
    foreach file [glob -nocomplain *$Inc::TS_BZIP_EXT] {
	set basefile [file rootname $file]
	set basepath "$targetdir/$basefile"
	putlog "Decompressing $file to $basepath"
	eval exec $Inc::TS_BUZIP_PROG < $file > $basepath
	file delete $file
    }
    foreach file [glob -nocomplain *$Inc::TS_ZIP_EXT] {
	set basefile [file rootname $file]
	set basepath "$targetdir/$basefile"
	putlog "Decompressing $file to $basepath"
	eval exec $Inc::TS_UZIP_PROG < $file > $basepath
	file delete $file
    }
    foreach file [glob -nocomplain *$Inc::TS_SIG_EXT] {
	set basefile [file rootname $file]
	set basepath "$targetdir/$basefile"
	putlog "Moving $file to $basepath"
	file copy $file $basepath
	file delete $file
    }
    cd $currentdir
    dbclose $db
}


if [llength $argv] {set bnd [lindex $argv 0]}
if {![info exists bnd] || $bnd==""} {
    puts stderr "Please specify a file to unbundle"
    exit 1
}

unbundle $bnd