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