aboutsummaryrefslogtreecommitdiffstats
path: root/src/gpgcemgr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpgcemgr.c')
-rw-r--r--src/gpgcemgr.c608
1 files changed, 0 insertions, 608 deletions
diff --git a/src/gpgcemgr.c b/src/gpgcemgr.c
deleted file mode 100644
index 5b4f56e..0000000
--- a/src/gpgcemgr.c
+++ /dev/null
@@ -1,608 +0,0 @@
-/* gpgcempr.c - Manager for GPG CE devices
- * Copyright (C) 2010 Free Software Foundation, Inc.
- *
- * This file is part of Assuan.
- *
- * Assuan is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 3 of
- * the License, or (at your option) any later version.
- *
- * Assuan is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- * SPDX-License-Identifier: LGPL-3.0+
- */
-
-#define _WIN32_WCE 0x0500
-
-#include <stdio.h>
-#include <windows.h>
-
-#define PGM "gpgcemgr"
-
-#define GPGCEDEV_KEY_NAME L"Drivers\\GnuPG_Device"
-#define GPGCEDEV_KEY_NAME2 L"Drivers\\GnuPG_Log"
-#define GPGCEDEV_DLL_NAME L"gpgcedev.dll"
-#define GPGCEDEV_PREFIX L"GPG"
-
-
-static char *
-wchar_to_utf8 (const wchar_t *string)
-{
- int n;
- size_t length = wcslen (string);
- char *result;
-
- n = WideCharToMultiByte (CP_UTF8, 0, string, length, NULL, 0, NULL, NULL);
- if (n < 0 || (n+1) <= 0)
- abort ();
-
- result = malloc (n+1);
- if (!result)
- abort ();
- n = WideCharToMultiByte (CP_ACP, 0, string, length, result, n, NULL, NULL);
- if (n < 0)
- abort ();
-
- result[n] = 0;
- return result;
-}
-
-
-static wchar_t *
-utf8_to_wchar (const char *string)
-{
- int n;
- size_t nbytes;
- wchar_t *result;
-
- if (!string)
- abort ();
-
- n = MultiByteToWideChar (CP_UTF8, 0, string, -1, NULL, 0);
- if (n < 0)
- abort ();
- nbytes = (size_t)(n+1) * sizeof(*result);
- if (nbytes / sizeof(*result) != (n+1))
- abort ();
- result = malloc (nbytes);
- if (!result)
- abort ();
-
- n = MultiByteToWideChar (CP_UTF8, 0, string, -1, result, n);
- if (n < 0)
- abort ();
- return result;
-}
-
-
-static int
-install (void)
-{
- HKEY handle;
- DWORD disp, dw;
- int rc;
-
- if ((rc=RegCreateKeyEx (HKEY_LOCAL_MACHINE, GPGCEDEV_KEY_NAME, 0, NULL, 0,
- KEY_WRITE, NULL, &handle, &disp)))
- {
- fprintf (stderr, PGM": error creating registry key 1: rc=%d\n", rc);
- return 1;
- }
-
- RegSetValueEx (handle, L"dll", 0, REG_SZ,
- (void*)GPGCEDEV_DLL_NAME, sizeof (GPGCEDEV_DLL_NAME));
- RegSetValueEx (handle, L"prefix", 0, REG_SZ,
- (void*)GPGCEDEV_PREFIX, sizeof (GPGCEDEV_PREFIX));
-
- dw = 1;
- RegSetValueEx (handle, L"Index", 0, REG_DWORD, (void*)&dw, sizeof dw);
-
- RegCloseKey (handle);
-
- fprintf (stderr, PGM": registry key 1 created\n");
-
- if ((rc=RegCreateKeyEx (HKEY_LOCAL_MACHINE, GPGCEDEV_KEY_NAME2, 0, NULL, 0,
- KEY_WRITE, NULL, &handle, &disp)))
- {
- fprintf (stderr, PGM": error creating registry key 2: rc=%d\n", rc);
- return 1;
- }
-
- RegSetValueEx (handle, L"dll", 0, REG_SZ,
- (void*)GPGCEDEV_DLL_NAME, sizeof (GPGCEDEV_DLL_NAME));
- RegSetValueEx (handle, L"prefix", 0, REG_SZ,
- (void*)GPGCEDEV_PREFIX, sizeof (GPGCEDEV_PREFIX));
-
- dw = 2;
- RegSetValueEx (handle, L"Index", 0, REG_DWORD, (void*)&dw, sizeof dw);
-
- RegCloseKey (handle);
-
- fprintf (stderr, PGM": registry key 2 created\n");
-
-
- return 0;
-}
-
-
-static int
-deinstall (wchar_t *name)
-{
- int result = 0;
- HANDLE shd;
- DEVMGR_DEVICE_INFORMATION dinfo;
-
- memset (&dinfo, 0, sizeof dinfo);
- dinfo.dwSize = sizeof dinfo;
- shd = FindFirstDevice (DeviceSearchByLegacyName, name, &dinfo);
- if (shd == INVALID_HANDLE_VALUE)
- {
- if (GetLastError () == 18)
- fprintf (stderr, PGM": device not found\n");
- else
- {
- fprintf (stderr, PGM": FindFirstDevice failed: rc=%d\n",
- (int)GetLastError ());
- result = 1;
- }
- }
- else
- {
- fprintf (stderr, PGM": ActivateDevice handle is %p\n", dinfo.hDevice);
- if (dinfo.hDevice && dinfo.hDevice != INVALID_HANDLE_VALUE)
- {
- if (!DeactivateDevice (dinfo.hDevice))
- {
- fprintf (stderr, PGM": DeactivateDevice failed: rc=%d\n",
- (int)GetLastError ());
- result = 1;
- }
- else
- fprintf (stderr, PGM": DeactivateDevice succeeded\n");
- }
- FindClose (shd);
- }
-
- return result;
-}
-
-
-static int
-enable_debug (int yes)
-{
- HKEY handle;
- DWORD disp;
- int rc;
-
- if ((rc=RegCreateKeyEx (HKEY_LOCAL_MACHINE, GPGCEDEV_KEY_NAME, 0, NULL, 0,
- KEY_WRITE, NULL, &handle, &disp)))
- {
- fprintf (stderr, PGM": error creating debug registry key: rc=%d\n", rc);
- return 1;
- }
-
- RegSetValueEx (handle, L"debugDriver", 0, REG_SZ,
- (void*)(yes? L"1":L"0"), sizeof L"0");
- RegCloseKey (handle);
- return 0;
-}
-
-
-static int
-enable_log (int yes)
-{
- HKEY handle;
- DWORD disp;
- int rc;
-
- if ((rc=RegCreateKeyEx (HKEY_LOCAL_MACHINE, GPGCEDEV_KEY_NAME2, 0, NULL, 0,
- KEY_WRITE, NULL, &handle, &disp)))
- {
- fprintf (stderr, PGM": error creating debug registry key: rc=%d\n", rc);
- return 1;
- }
-
- RegSetValueEx (handle, L"enableLog", 0, REG_SZ,
- (void*)(yes? L"1":L"0"), sizeof L"0");
- RegCloseKey (handle);
- return 0;
-}
-
-
-
-/* Kudos to Scott Seligman <[email protected]> for his work
- on the reverse engineering. */
-struct htc_sensor_s
-{
- SHORT tilt_x; // From -1000 to 1000 (about), 0 is flat
- SHORT tilt_y; // From -1000 to 1000 (about), 0 is flat
- SHORT tilt_z; // From -1000 to 1000 (about)
- DWORD angle_x; // 0 .. 359
- DWORD angle_y; // From 0 to 359
- DWORD orientation; // 0.. 5?
- DWORD unknown; // Handle?
-};
-typedef struct htc_sensor_s *htc_sensor_t;
-
-static HANDLE (WINAPI *HTCSensorOpen) (DWORD);
-static void (WINAPI *HTCSensorClose) (HANDLE);
-static DWORD (WINAPI *HTCSensorGetDataOutput) (HANDLE, htc_sensor_t);
-
-static int
-load_sensor_api (void)
-{
- static HMODULE dll_hd;
-
- if (dll_hd)
- return 0;
-
- dll_hd = LoadLibrary (L"HTCSensorSDK.dll");
- if (!dll_hd)
- {
- fprintf (stderr, PGM": error loading sensor DLL: rc=%d\n",
- (int)GetLastError ());
- return 1;
- }
-
- HTCSensorOpen = (void*)GetProcAddress (dll_hd, L"HTCSensorOpen");
- if (HTCSensorOpen)
- HTCSensorClose = (void*)GetProcAddress (dll_hd, L"HTCSensorClose");
- if (HTCSensorClose)
- HTCSensorGetDataOutput = (void*)
- GetProcAddress (dll_hd, L"HTCSensorGetDataOutput");
- if (!HTCSensorGetDataOutput)
- {
- fprintf (stderr, PGM": error loading function from sensor DLL: rc=%d\n",
- (int)GetLastError ());
- CloseHandle (dll_hd);
- return 1;
- }
- return 0;
-}
-
-
-static int
-gravity (void)
-{
- int rc;
- HANDLE sensor;
- struct htc_sensor_s lastdata;
- struct htc_sensor_s data;
-
- rc = load_sensor_api ();
- if (rc)
- return rc;
-
- sensor = HTCSensorOpen (1 /* tilt sensor */);
- if (!sensor || sensor == INVALID_HANDLE_VALUE)
- {
- fprintf (stderr, PGM": error opening gravity sensor: rc=%d\n",
- (int)GetLastError ());
- HTCSensorClose (sensor);
- return 1;
- }
-
- memset (&lastdata, 0, sizeof lastdata);
- while (HTCSensorGetDataOutput (sensor, &data))
- {
- if (lastdata.tilt_x/10 != data.tilt_x/10
- || lastdata.tilt_y/10 != data.tilt_y/10
- || lastdata.tilt_z/10 != data.tilt_z/10
- || lastdata.angle_x/5 != data.angle_x/5
- || lastdata.angle_y/5 != data.angle_y/5
- || lastdata.orientation != data.orientation)
- {
- lastdata = data;
- printf ("tilt: x=%-5d y=%-5d z=%-5d "
- "angle: x=%-3d y=%-3d "
- "ori: %d\n",
- (int)data.tilt_x, (int)data.tilt_y, (int)data.tilt_z,
- (int)data.angle_x, (int)data.angle_y,
- (int)data.orientation);
- }
- Sleep (200);
- }
- fprintf (stderr, PGM": reading sensor data failed: rc=%d\n",
- (int)GetLastError ());
- HTCSensorClose (sensor);
- return 0;
-}
-
-
-
-/* No GPD1 device on the HTC Touch Pro 2. */
-# if 0
-static int
-gps_raw (void)
-{
- HANDLE hd;
- char buffer[1000];
- unsigned long nread;
- int count;
-
- hd = CreateFile (L"GPD1:", GENERIC_READ, FILE_SHARE_READ,
- NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if (hd == INVALID_HANDLE_VALUE)
- {
- fprintf (stderr, PGM": can't open `GPD1': rc=%d\n",
- (int)GetLastError ());
- return 1;
- }
- fprintf (stderr, PGM": GPS device successfully opened\n");
-
- for (count=0; count < 100; count++)
- {
- if (!ReadFile (hd, buffer, sizeof buffer-1, &nread, NULL))
- {
- fprintf (stderr, PGM": error reading `GPD1': rc=%d\n",
- (int)GetLastError ());
- CloseHandle (hd);
- return 1;
- }
- buffer[nread-1] = 0;
- fputs (buffer, stdout);
- }
-
- CloseHandle (hd);
- return 0;
-}
-#endif
-
-/* Untested samples for CE6. */
-#if 0
-static int
-gps (void)
-{
- HANDLE hd;
- GPS_POSITION pos;
-
- hd = GPSOpenDevice (NULL, NULL, NULL, 0);
- if (hd == INVALID_HANDLE_VALUE)
- {
- fprintf (stderr, PGM": GPSOpenDevice failed: rc=%d\n",
- (int)GetLastError ());
- return 1;
- }
- fprintf (stderr, PGM": GPS device successfully opened\n");
-
- if (GPSGetPosition (hd, &pos, 2000, 0))
- {
- fprintf (stderr, PGM": GPSGetPosition failed: rc=%d\n",
- (int)GetLastError ());
- GPSCloseDevice (hd);
- return 1;
- }
-
-
- GPSCloseDevice (hd);
- return 0;
-}
-#endif
-
-
-static void
-set_show_registry (const wchar_t *key, const wchar_t *name, const char *value)
-{
- HKEY handle;
- DWORD disp, nbytes, n1, type;
- int rc;
-
- if ((rc=RegCreateKeyEx (HKEY_LOCAL_MACHINE, key, 0, NULL, 0,
- KEY_WRITE, NULL, &handle, &disp)))
- {
- fprintf (stderr, PGM": error creating registry key: rc=%d\n", rc);
- return;
- }
-
- if (value && !stricmp (value, "none"))
- {
- if ((rc=RegDeleteValue (handle, name)))
- fprintf (stderr, PGM": error deleting registry value: rc=%d\n", rc);
- }
- else if (value)
- {
- wchar_t *tmp = utf8_to_wchar (value);
- if ((rc=RegSetValueEx (handle, name, 0, REG_SZ,
- (void*)tmp, wcslen (tmp)*sizeof(wchar_t))))
- fprintf (stderr, PGM": error setting registry value: rc=%d\n", rc);
- free (tmp);
- }
- else
- {
- nbytes = 2;
- if ((rc=RegQueryValueEx (handle, name, 0, NULL, NULL, &nbytes)))
- {
- if (rc == ERROR_FILE_NOT_FOUND)
- fprintf (stderr, PGM": registry value not set\n");
- else
- fprintf (stderr, PGM": error reading registry value: rc=%d\n", rc);
- }
- else
- {
- char *result = malloc ((n1=nbytes+2));
- if (!result)
- fprintf (stderr, PGM": malloc failed: rc=%d\n",
- (int)GetLastError ());
- else if ((rc=RegQueryValueEx (handle, name, 0, &type,
- (void*)result, &n1)))
- {
- fprintf (stderr, PGM": error reading registry value (2): "
- "rc=%d\n", rc);
- free (result);
- }
- else
- {
- result[nbytes] = 0; /* Make sure it is a string. */
- result[nbytes+1] = 0;
- if (type == REG_SZ)
- {
- wchar_t *tmp = (void*)result;
- result = wchar_to_utf8 (tmp);
- free (tmp);
- printf ("%s\n", result);
- }
- else
- fprintf (stderr, PGM": registry value is not a string\n");
- free (result);
- }
- }
- }
-
- RegCloseKey (handle);
-}
-
-
-
-int
-main (int argc, char **argv)
-{
- int result = 0;
-
- if (argc > 1 && !strcmp (argv[1], "--register"))
- result = install ();
- else if (argc > 1 && !strcmp (argv[1], "--deactivate"))
- {
- if (deinstall (L"GPG1:"))
- result = 1;
- if (deinstall (L"GPG2:"))
- result = 1;
- }
- else if (argc > 1 && !strcmp (argv[1], "--activate"))
- {
- HANDLE hd;
-
- /* This is mainly for testing. The activation is usually done
- right before the device is opened. */
- if (ActivateDevice (GPGCEDEV_KEY_NAME, 0) == INVALID_HANDLE_VALUE)
- {
- fprintf (stderr, PGM": ActivateDevice 1 failed: rc=%d\n",
- (int)GetLastError ());
- result = 1;
- }
- else if (ActivateDevice (GPGCEDEV_KEY_NAME2, 0) == INVALID_HANDLE_VALUE)
- {
- fprintf (stderr, PGM": ActivateDevice 2 failed: rc=%d\n",
- (int)GetLastError ());
- result = 1;
- }
- else
- {
- fprintf (stderr, PGM": devices activated\n");
- hd = CreateFile (L"GPG1:", GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if (hd == INVALID_HANDLE_VALUE)
- {
- fprintf (stderr, PGM": opening `GPG1:' failed: rc=%d\n",
- (int)GetLastError ());
- result = 1;
- }
- else
- {
- fprintf (stderr, PGM": device `GPG1:' seems to work\n");
- CloseHandle (hd);
- }
-
- hd = CreateFile (L"GPG2:", GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if (hd == INVALID_HANDLE_VALUE)
- {
- fprintf (stderr, PGM": opening `GPG2:' failed: rc=%d\n",
- (int)GetLastError ());
- result = 1;
- }
- else
- {
- fprintf (stderr, PGM": device `GPG2:' seems to work\n");
- CloseHandle (hd);
- }
-
- }
- }
- else if (argc > 1 && !strcmp (argv[1], "--gravity"))
- result = gravity ();
- /* else if (argc > 1 && !strcmp (argv[1], "--gps")) */
- /* result = gps (); */
- else if (argc > 1 && !strcmp (argv[1], "--log"))
- {
- HANDLE hd;
-
- hd = CreateFile (L"GPG2:", GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if (hd == INVALID_HANDLE_VALUE)
- {
- fprintf (stderr, PGM": opening `GPG2:' failed: rc=%d\n",
- (int)GetLastError ());
- result = 1;
- }
- else
- {
- char marktwain[] = "I have never let my schooling interfere"
- " with my education.\n";
- DWORD nwritten;
- int i;
-
- for (i=0; i < 3; i++)
- {
- if (!WriteFile (hd, marktwain, strlen (marktwain),
- &nwritten, NULL))
- {
- fprintf (stderr, PGM": writing `GPG2:' failed: rc=%d\n",
- (int)GetLastError ());
- result = 1;
- }
- Sleep (200);
- }
- CloseHandle (hd);
- }
- }
- else if (argc > 1 && !strcmp (argv[1], "--enable-debug"))
- result = enable_debug (1);
- else if (argc > 1 && !strcmp (argv[1], "--disable-debug"))
- result = enable_debug (0);
- else if (argc > 1 && !strcmp (argv[1], "--enable-log"))
- result = enable_log (1);
- else if (argc > 1 && !strcmp (argv[1], "--disable-log"))
- result = enable_log (0);
- else if (argc > 1 && !strcmp (argv[1], "--gpgme-log"))
- set_show_registry (L"Software\\GNU\\gpgme", L"debug",
- argc > 2? argv[2] : NULL);
- else if (argc > 1 && !strcmp (argv[1], "--gnupg-log"))
- set_show_registry (L"Software\\GNU\\GnuPG", L"DefaultLogFile",
- argc > 2? argv[2] : NULL);
- else
- {
- fprintf (stderr,
- "usage: " PGM " COMMAND\n"
- "Commands are:\n"
- " --register Register the GPGCEDEV device\n"
- " --deactivate Deactivate the GPGCEDEV device\n"
- " --activate Activate the GPGCEDEV devive\n"
- " --enable-debug Enable debugging of GPGCEDEV device\n"
- " --disable-debug Disable debugging of GPGCEDEV device\n"
- " --gravity Show output of the gravity sensor\n"
- " --enable-log Enable logging via \"GPG2:\"\n"
- " --disable-log Disable logging via \"GPG2:\"\n"
- " --log Write a test string to \"GPG2:\"\n"
- " --gpgme-log [ARG] Show or set GPGME log output\n"
- " --gnupg-log [ARG] Show or set GnuPG default log file\n"
- " (No ARG shows, \"none\" disables)\n"
- );
- result = 1;
- }
-
- fflush (stdout);
- fflush (stderr);
- Sleep (1000);
- return result;
-}
-
-