Batch symmetric ciphering?
Paolo Casagranda
p.casagranda@rai.it
Fri, 12 Jan 2001 08:46:31 +0100
Thank you VERY MUCH for your suggestions. I succeeded in automating
symmetric ciphering under Windows NT (I've heard that under W2000 it's the
same).
I send the lines of code I used, maybe they could be useful to someone.
Automating gpg through pipe WinNT:
SECURITY_ATTRIBUTES saAttr;
BOOL fSuccess;
HANDLE hChildStdinRd, hChildStdinWr;
HANDLE hSaveStdin, hChildStdinWrDup;
DWORD dwProcessId;
// Set the bInheritHandle flag so pipe handles are inherited.
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
// The steps for redirecting child process's STDIN:
// 1. Save current STDIN, to be restored later.
// 2. Create anonymous pipe to be STDIN for child process.
// 3. Set STDIN of the parent to be the read handle to the
// pipe, so it is inherited by the child process.
// 4. Create a noninheritable duplicate of the write handle,
// and close the inheritable write handle.
// Save the handle to the current STDIN.
hSaveStdin = GetStdHandle(STD_INPUT_HANDLE);
// Create a pipe for the child process's STDIN.
if( !CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0) )
{
TRACE0( _T("Stdin pipe creation failed\n") );
return FALSE;
}
// Set a read handle to the pipe to be STDIN.
if( !SetStdHandle(STD_INPUT_HANDLE, hChildStdinRd) )
{
TRACE0( _T("Redirecting Stdin failed\n") );
return FALSE;
}
// Duplicate the write handle to the pipe so it is not inherited.
fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdinWr,
GetCurrentProcess(), &hChildStdinWrDup,
0, FALSE, // not inherited
DUPLICATE_SAME_ACCESS );
if( !fSuccess )
{
TRACE0( _T("DuplicateHandle failed\n") );
return FALSE;
}
CloseHandle(hChildStdinWr);
// Now create the child process.
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
// Set up members of STARTUPINFO structure.
ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.dwFlags = STARTF_USESTDHANDLES;
siStartInfo.hStdInput = hChildStdinRd;
///////////////////////////////////////////////////
// Create the child process.
BOOL ret = CreateProcess( NULL,
"d:\\exe\\gpg.exe --yes --batch --passphrase-fd 0 --output
d:\\prove\\encrypted.cfr --symmetric d:\\prove\\d24_final.doc", //
applicatin name
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
DETACHED_PROCESS, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
if( ret )
dwProcessId = piProcInfo.dwProcessId;
HANDLE hProcessHandle = piProcInfo.hProcess;
// After process creation, restore the saved STDIN and STDOUT.
if( !SetStdHandle(STD_INPUT_HANDLE, hSaveStdin) )
{
TRACE0( _T("Re-redirecting Stdin failed\n") );
return FALSE;
}
// After process creation, restore the saved STDIN and STDOUT.
if( !SetStdHandle(STD_INPUT_HANDLE, hSaveStdin) )
{
TRACE0( _T("Re-redirecting Stdin failed\n") );
return FALSE;
}
// Passphrase...
char *lpBuffer = "zuzzurro\n";
DWORD dwwt;
BOOL b =WriteFile(
hChildStdinWrDup, // handle to file
lpBuffer, // data buffer
9, // number of bytes to write
&dwwt, // number of bytes written
NULL
);
if(b) MessageBox("OK");
else
{
DWORD dwErr = GetLastError();
CString str;
str.Format("Error %lu", dwErr);
MessageBox(str);
}
::WaitForSingleObject(hProcessHandle, INFINITE); // Wait for process to end
----- Original Message -----
From: "Werner Koch" <wk@gnupg.org>
To: "Paolo Casagranda" <p.casagranda@rai.it>
Cc: <gnupg-users@gnupg.org>
Sent: giovedì 11 gennaio 2001 9.54
Subject: Re: Batch symmetric ciphering?
> On Thu, 11 Jan 2001, Paolo Casagranda wrote:
>
> > I re-post my question (second and last time, I promise).
> > My question is: How can I cipher with SYMMETRIC keys in batch mode? (To
> > automate the task, under MS Windows)
>
> You have to use --passphrase-fd n and pipe the passphrase to file
> descriptor n. The default command shell of Windows 95 does not
> allow to do this. IIRC, it is possible under NT.
>
> TYou may want to write a small wrapper program. Have a look at the
> API: CreateProcess and CreatePipe
>
> Werner
>
> --
> Werner Koch <wk@gnupg.org>
> GNU Privacy Guard (http://www.gnupg.org)
> Free Software Foundation Europe (http://www.fsfeurope.org)
> [Please see X-* mail header for OpenPGP key info]
>
--
Archive is at http://lists.gnupg.org - Unsubscribe by sending mail
with a subject of "unsubscribe" to gnupg-users-request@gnupg.org