Posted to tcl by patthoyts at Thu Jun 19 17:09:11 GMT 2008view raw
- #
- # Second, though, and this is where the real problem came in, I wrote
- # CryptLib code to read a key from my PGP public key ring and encrypt some
- # sample data in PGP format. Here's the code (error handling omitted for
- # clarity):
- # cryptKeysetOpen(&KeySet,
- # cryptUser,
- # CRYPT_KEYSET_FILE,
- # vm["keyset"].as<string>().c_str(),
- # CRYPT_KEYOPT_READONLY
- # );
- # strcpy(KeyLabel, vm["label"].as<string>().c_str());
- # cryptGetPublicKey(KeySet, &Pub_Context, CRYPT_KEYID_NAME,
- # KeyLabel);
- # cryptCreateEnvelope(&Envelope, cryptUser, CRYPT_FORMAT_PGP);
- # cryptSetAttribute(Envelope, CRYPT_ENVINFO_PUBLICKEY,
- # Pub_Context);
- # cryptSetAttribute(Envelope, CRYPT_ENVINFO_DATASIZE,
- # MessageSize);
- # cryptPushData(Envelope, Buffer, MessageSize, &Actual);
- # cryptFlushData(Envelope);
- # cryptPopData(Envelope, Buffer, sizeof(Buffer), &Actual);
- #if {[file exists cryptkit.kit]} { source cryptkit.kit}
- package require cryptkit
- crypt::Init
- # GPG encrypt data for recipient.
- proc pgpencrypt {recipient message} {
- set file [file normalize ~/.gpg/pubring.gpg]
- set ks [crypt::KeysetOpen CRYPT_KEYSET_FILE \
- $file CRYPT_KEYOPT_READONLY]
- set k [crypt::GetPublicKey $ks CRYPT_KEYID_EMAIL $recipient]
- set e [crypt::CreateEnvelope CRYPT_FORMAT_PGP]
- $e set CRYPT_ENVINFO_PUBLICKEY $k
- $k close
- $ks close
- set m [encoding convertto utf-8 $message]
- $e set CRYPT_ENVINFO_DATASIZE [string length $m]
- set dlen [$e push $m]
- $e flush
- #set data [$e pop]
- set data [crypt::PopData $e $dlen]
- $e destroy
- return $data
- }
- proc decrypt {id pass data} {
- set file [file normalize ~/.gpg/secring.gpg]
- set keyset [crypt::KeysetOpen CRYPT_KEYSET_FILE \
- $file CRYPT_KEYOPT_READONLY]
- set skey [crypt::GetPrivateKey $keyset CRYPT_KEYID_EMAIL $id $pass]
- set e [crypt::CreateEnvelope CRYPT_FORMAT_AUTO]
- $e set CRYPT_ENVINFO_KEYSET_DECRYPT $ks
- $e push $data
- $e get CRYPT_ATTRIBUTE_CURRENT
- $e set CRYPT_ENVINFO_PASSWORD $password
- $e flush
- set msg [$e pop]
- $e destroy
- return $msg
- }
- proc A {} {
- set ctx [crypt::CreateContext CRYPT_ALGO_RSA]
- crypt::GetPublicKey ctx CRYPT_KEYID_NAME "BBK"
- crypt::GetPrivateKey ctx CRYPT_KEYID_NAME "BBK"
- }
- if {!$tcl_interactive} {
- set r [catch [linsert $argv 0 Main] err]
- if {$r} {puts $::errorInfo} elseif {$err ne {}} { puts $err }
- exit
- }