All pastes #153972 Raw Edit

Mine

public text v1 · immutable
#153972 ·published 2006-08-30 00:38 UTC
rendered paste body
source $tcl_library/tv/Inc.itcl
tvsource $tcl_library/tv/mfslib.tcl
tvsource $tcl_library/tv/setup.tcl

namespace import Inc::*

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"
catch {    eval exec cpio -i -I $sourcefile 2>/dev/null }
    set keyfiles [glob *$Inc::TS_SKEY_EXT]
    set db [dbopen]
    RetryTransaction {
        set setup [FindOrCreateObject $db Setup /State/ServiceConfig]
        set mykeys [dbobj $setup get EncryptionKeys]
    }
    dbclose $db
    set foundkey 0
    foreach key $mykeys {
        set blowfishtag [string first ",1," $key]
        if {$blowfishtag != -1} {
            set keyid [string range $key 0 [expr $blowfishtag-1]]
            set keyval [string range $key [expr $blowfishtag+3] end]
            set keymatch "$keyid$Inc::TS_SKEY_EXT"
            if {[lsearch $keyfiles $keymatch] != -1} {
                putlog "Using type-1 Blowfish key $keyid"
puts "executing $Inc::TS_DECRYPT_PROG $keyval < $keymatch"
                set sessionkey [eval exec $Inc::TS_DECRYPT_PROG $keyval < $keymatch]
puts "sessionkey: $sessionkey"
                if {[string first 0x $sessionkey] != 0} {
                    putlog "Session key did not decrypt properly!"
                } else {
                    putlog "Session key decrypted successfully"
                    set foundkey 1
                }
            }
        }
        set elgtag [string first ",2," $key]
        if {$elgtag != -1} {
            set keyid [string range $key 0 [expr $elgtag-1]]
            set keyval [string range $key [expr $elgtag+3] end]
            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 decrypted successfully"
                    set foundkey 1
                }
            }
        }
        if {$foundkey} {
            break;
        }
    }
    if {!$foundkey} {
        putlog "No key match!"
        putlog "Bundle keylist is $keyfiles"
        set havekeys "My keyring holds "
        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
}

unbundle $argv