2004-12-21 Timo Schulz <twoaday@g10code.com>
authorTimo Schulz <twoaday@freakmail.de>
Wed, 22 Dec 2004 10:41:04 +0000 (10:41 +0000)
committerTimo Schulz <twoaday@freakmail.de>
Wed, 22 Dec 2004 10:41:04 +0000 (10:41 +0000)
        * pinentrycontroller.c: New.
        * pinentrydialog.c: New.
        * main.c: New.

w32/main.c [new file with mode: 0644]
w32/pinentry_w32.dsp [new file with mode: 0644]
w32/pinentry_w32.dsw [new file with mode: 0644]
w32/pinentry_w32.rc [new file with mode: 0644]
w32/pinentrycontroller.c [new file with mode: 0644]
w32/pinentrycontroller.h [new file with mode: 0644]
w32/pinentrydialog.c [new file with mode: 0644]
w32/pinentrydialog.h [new file with mode: 0644]
w32/resource.h [new file with mode: 0644]

diff --git a/w32/main.c b/w32/main.c
new file mode 100644 (file)
index 0000000..7d81da4
--- /dev/null
@@ -0,0 +1,38 @@
+/* main.c - Secure W32 dialog for PIN entry.
+   Copyright (C) 2004 g10 Code GmbH
+   
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+   This program 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
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA  */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <windows.h>
+
+#include "pinentrydialog.h"
+#include "pinentrycontroller.h"
+
+
+int WINAPI
+WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd)
+{
+    struct pinentry_controller_s ctl;
+
+    pinentry_ctrl_exec (&ctl);
+    pinentry_controller_free (&ctl);
+    return TRUE;
+}
diff --git a/w32/pinentry_w32.dsp b/w32/pinentry_w32.dsp
new file mode 100644 (file)
index 0000000..24f6048
--- /dev/null
@@ -0,0 +1,121 @@
+# Microsoft Developer Studio Project File - Name="pinentry_w32" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** NICHT BEARBEITEN **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=pinentry_w32 - Win32 Debug
+!MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
+!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl
+!MESSAGE 
+!MESSAGE NMAKE /f "pinentry_w32.mak".
+!MESSAGE 
+!MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben
+!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
+!MESSAGE 
+!MESSAGE NMAKE /f "pinentry_w32.mak" CFG="pinentry_w32 - Win32 Debug"
+!MESSAGE 
+!MESSAGE Für die Konfiguration stehen zur Auswahl:
+!MESSAGE 
+!MESSAGE "pinentry_w32 - Win32 Release" (basierend auf  "Win32 (x86) Application")
+!MESSAGE "pinentry_w32 - Win32 Debug" (basierend auf  "Win32 (x86) Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "pinentry_w32 - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x407 /d "NDEBUG"
+# ADD RSC /l 0x407 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
+
+!ELSEIF  "$(CFG)" == "pinentry_w32 - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x407 /d "_DEBUG"
+# ADD RSC /l 0x407 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "pinentry_w32 - Win32 Release"
+# Name "pinentry_w32 - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\main.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\pinentry_w32.rc
+# End Source File
+# Begin Source File
+
+SOURCE=.\pinentrycontroller.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\pinentrycontroller.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\pinentrydialog.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\pinentrydialog.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\resource.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\unistd.h
+# End Source File
+# End Target
+# End Project
diff --git a/w32/pinentry_w32.dsw b/w32/pinentry_w32.dsw
new file mode 100644 (file)
index 0000000..928f9b1
--- /dev/null
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN!
+
+###############################################################################
+
+Project: "pinentry_w32"=.\pinentry_w32.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/w32/pinentry_w32.rc b/w32/pinentry_w32.rc
new file mode 100644 (file)
index 0000000..2529082
--- /dev/null
@@ -0,0 +1,102 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Deutsch (Deutschland) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_PINENT DIALOG DISCARDABLE  0, 0, 186, 95
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Pinentry W32"
+FONT 8, "MS Sans Serif"
+BEGIN
+    LTEXT           "Description",IDC_PINENT_DESC,6,6,152,19
+    EDITTEXT        IDC_PINENT_TEXT,71,36,107,12,ES_PASSWORD | 
+                    ES_AUTOHSCROLL
+    DEFPUSHBUTTON   "OK",IDOK,77,76,50,14
+    PUSHBUTTON      "&Cancel",IDCANCEL,132,76,50,14
+    LTEXT           "Error",IDC_PINENT_ERR,2,62,180,9
+    LTEXT           "Prompt",IDC_PINENT_PROMPT,2,37,64,12
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE 
+BEGIN
+    IDD_PINENT, DIALOG
+    BEGIN
+        LEFTMARGIN, 2
+        RIGHTMARGIN, 182
+        TOPMARGIN, 1
+        BOTTOMMARGIN, 91
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+#endif    // Deutsch (Deutschland) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
diff --git a/w32/pinentrycontroller.c b/w32/pinentrycontroller.c
new file mode 100644 (file)
index 0000000..068f013
--- /dev/null
@@ -0,0 +1,320 @@
+/* pinentrycontroller.c - A W32 dialog for PIN entry.
+   Copyright (C) 2004 g10 Code GmbH
+   
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+   This program 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
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA  */
+
+#include <windows.h>
+#include <stdlib.h>
+
+#include "pinentrycontroller.h"
+#include "pinentrydialog.h"
+
+
+#define xtoi_1(p)   (*(p) <= '9'? (*(p)- '0'): \
+                     *(p) <= 'F'? (*(p)-'A'+10):(*(p)-'a'+10))
+#define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))
+
+static void 
+strcpy_escaped (char *d, const char *s)
+{
+    while (*s) {
+       if (*s == '%' && s[1] && s[2]) {
+           s++;
+           *d++ = xtoi_2 (s);
+           s += 2;
+       }
+       else        
+           *d++ = *s++;
+    }
+    *d = 0;
+}
+
+
+int
+pinentry_controller_new (struct pinentry_controller_s ** ctx)
+{
+    struct pinentry_controller_s * c;
+    int rc;
+    int fds[2];
+
+    c = calloc (1, sizeof *c);
+    if (!c)
+       exit (1);
+    fds[0] = 0;
+    fds[1] = 1;
+    
+    assuan_set_malloc_hooks (malloc, realloc, free);
+    rc = assuan_init_pipe_server (&c->_ctx, fds);
+    if (rc)
+       exit(-1);
+    rc = pinentry_ctl_registcmds (c);
+    assuan_set_pointer (c->_ctx, c);
+    *ctx = c;
+    return 0;
+}
+
+
+
+void
+pinentry_controller_free (struct pinentry_controller_s * c)
+{
+    if (c->_desc)
+       free (c->_desc);
+    if (c->_error)
+       free (c->_error);
+    if (c->_desc)
+       free (c->_desc);
+    if (c->_prompt)
+       free (c->_prompt);
+    if (c->_ok)
+       free (c->_ok);
+    if (c->_cancel)
+       free (c->_cancel);
+    assuan_deinit_server (c->_ctx);
+}
+
+
+void 
+pinentry_ctrl_exec (struct pinentry_controller_s * c)
+{  
+    while (1) {
+       assuan_error_t rc = assuan_accept (c->_ctx);
+       if (rc == -1) {
+           fprintf (stderr, "Assuan terminated");
+           break;
+       } else if (rc) {
+           fprintf (stderr, "Assuan accept problem: %s", assuan_strerror (rc));
+           break;
+       }
+       rc = assuan_process (c->_ctx);
+       if (rc) {
+           fprintf (stderr, "Assuan processing failed: %s", assuan_strerror (rc));
+           continue;
+       }
+    }
+}
+
+
+int 
+pinentry_ctl_desc (ASSUAN_CONTEXT ctx, char* line)
+{
+    struct pinentry_controller_s * c;
+    char* newl;
+
+    c = (struct pinentry_controller_s*)assuan_get_pointer(ctx);
+    fprintf (stderr, "ctl_desc %s\n", line);
+
+    newl = malloc (strlen (line) + 1);
+    strcpy_escaped (newl, line);
+
+    c->_desc = strdup (newl); /*UTF8*/
+    c->_error = NULL;
+
+    free (newl);
+    return 0;
+}
+
+
+int pinentry_ctl_prompt (ASSUAN_CONTEXT ctx, char* line)
+{
+    struct pinentry_controller_s * c;
+    char* newl;
+
+    c = (struct pinentry_controller_s*)assuan_get_pointer (ctx);
+
+    fprintf (stderr, "ctl_prompt %s\n", line);
+
+    newl = malloc (strlen (line) + 1);
+    strcpy_escaped (newl, line);
+
+    c->_prompt = strdup (newl); /*UTF8*/
+    c->_error = NULL;
+
+    free (newl);
+    return 0;
+}
+
+
+int pinentry_ctl_error (ASSUAN_CONTEXT ctx, char* line)
+{
+    struct pinentry_controller_s * c;
+    char* newl;
+
+    c = (struct pinentry_controller_s*)assuan_get_pointer(ctx);
+
+    fprintf (stderr, "error %s", line);    
+
+    newl = malloc (strlen (line) + 1);
+    strcpy_escaped (newl, line);
+
+    c->_error = strdup (newl); /* UTF8*/
+
+    free (newl);
+    return 0;
+}
+
+int pinentry_ctl_ok ( ASSUAN_CONTEXT ctx, char* line )
+{
+    struct pinentry_controller_s * c;
+    char* newl;
+
+    c = (struct pinentry_controller_s*)assuan_get_pointer(ctx);
+
+    fprintf (stderr, "OK %s\n", line);    
+
+    newl = malloc (strlen (line) + 1);
+    strcpy_escaped (newl, line);
+
+    c->_ok = strdup (line);
+
+    free (newl);
+    return 0;
+}
+
+int pinentry_ctl_cancel( ASSUAN_CONTEXT ctx, char* line )
+{
+    struct pinentry_controller_s * c;
+    char* newl;
+
+    c = (struct pinentry_controller_s*)assuan_get_pointer(ctx);
+
+    fprintf (stderr, "cancel %s\n", line);
+
+    newl = malloc (strlen (line) + 1);
+    strcpy_escaped (newl, line);
+
+    c->_cancel = strdup (line);
+
+    free (newl);
+    return 0;
+}
+
+
+int 
+_pinentry_ctl_getpin (struct pinentry_controller_s * c, char* line ) 
+{
+    int ret;
+    FILE* fp;
+
+    if (c->_pinentry == NULL)
+        c->_pinentry = pinentry_new (NULL);
+    
+    pinentry_set_prompt (c->_pinentry, c->_prompt);
+    pinentry_set_description (c->_pinentry, c->_desc);
+    pinentry_set_text (c->_pinentry, NULL);
+    if (c->_ok) 
+       pinentry_set_ok_text (c->_pinentry, c->_ok);
+    if (c->_cancel)
+       pinentry_set_cancel_text (c->_pinentry, c->_cancel);
+    if (c->_error)
+       pinentry_set_error (c->_pinentry, c->_error);
+    
+    ret = pinentry_exec (c->_pinentry);
+    fp = assuan_get_data_fp (c->_ctx);
+    if (ret) {
+       char * p;
+       p = (char*)pinentry_text (c->_pinentry);
+       fputs (p /*UTF8*/, fp);
+       return 0;
+    } else {
+       assuan_set_error (c->_ctx, ASSUAN_Canceled, "Dialog cancelled by user");
+       return ASSUAN_Canceled;
+    }
+}
+
+
+int pinentry_ctl_getpin( ASSUAN_CONTEXT ctx, char* line )
+{
+    struct pinentry_controller_s * c;
+
+    c = (struct pinentry_controller_s*)assuan_get_pointer(ctx);
+
+    fprintf (stderr, "getpin %s\n", line); 
+    return _pinentry_ctl_getpin (c, line); 
+}
+
+
+int _pinentry_ctl_confirm (struct pinentry_controller_s *c, char* line)
+{
+    int ret;
+    FILE* fp;
+
+    if (c->_error)
+       ret = MessageBox (NULL, c->_error, "Error", MB_YESNO|MB_ICONERROR);
+    else
+       ret = MessageBox (NULL, c->_desc, "Information", MB_YESNO|MB_ICONINFORMATION);  
+    fp = assuan_get_data_fp (c->_ctx);
+    if (ret == IDYES) {
+       //fputs( "YES", fp );    
+       return ASSUAN_No_Error;
+    } else {
+       //fputs( "NO", fp );
+       return ASSUAN_Not_Confirmed;
+    }
+}
+
+
+int pinentry_ctl_confirm (ASSUAN_CONTEXT ctx, char* line)
+{
+    struct pinentry_controller_s * c;
+
+    c = (struct pinentry_controller_s*)assuan_get_pointer (ctx);
+
+    fprintf (stderr, "confirm %s\n", line);
+    
+    return _pinentry_ctl_confirm (c, line);
+}
+
+
+
+int
+pinentry_ctl_opthandler (ASSUAN_CONTEXT ctx, const char* key, const char* value)
+{
+    struct pinentry_controller_s * c;
+    
+    c = (struct pinentry_controller_s*)assuan_get_pointer(ctx);
+
+    /* FIXME: For now we simply ignore all options.  This module should
+        be converted to make use of the pinentry framework. */
+    return 0;
+}
+
+int 
+pinentry_ctl_registcmds (struct pinentry_controller_s * c)
+{
+    static struct {
+       const char *name;
+       int (*handler)(ASSUAN_CONTEXT, char *line);
+    } table[] = {
+       {"SETDESC",      pinentry_ctl_desc},
+       {"SETPROMPT",    pinentry_ctl_prompt},
+       {"SETERROR",     pinentry_ctl_error},
+       {"SETOK",        pinentry_ctl_ok},
+       {"SETCANCEL",    pinentry_ctl_cancel},
+       {"GETPIN",       pinentry_ctl_getpin},
+       {"CONFIRM",      pinentry_ctl_confirm},
+       {0,0 }
+    };
+    int i, rc;
+  
+    for (i=0; table[i].name; i++) {
+       rc = assuan_register_command (c->_ctx, table[i].name, table[i].handler);
+       if (rc) 
+           return rc;
+    }
+    assuan_register_option_handler (c->_ctx, pinentry_ctl_opthandler);
+    return 0;
+}
diff --git a/w32/pinentrycontroller.h b/w32/pinentrycontroller.h
new file mode 100644 (file)
index 0000000..ab40dbd
--- /dev/null
@@ -0,0 +1,42 @@
+/* pinentrycontroller.h - A secure KDE dialog for PIN entry.
+   Copyright (C) 2002 Klarälvdalens Datakonsult AB
+   Written by Steffen Hansen <steffen@klaralvdalens-datakonsult.se>.
+   
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+   This program 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
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA  */
+
+#ifndef __PINENTRYCONTROLLER_H__
+#define __PINENTRYCONTROLLER_H__
+
+
+#include <assuan.h>
+
+
+struct pinentry_controller_s {
+    ASSUAN_CONTEXT _ctx;
+    char * _desc;
+    char * _error;
+    char * _prompt;
+    char * _ok;
+    char * _cancel;
+    struct w32_pinentry_s *_pinentry;
+};
+
+
+int  pinentry_ctl_registcmds (struct pinentry_controller_s * c);
+void pinentry_controller_free (struct pinentry_controller_s * c);
+void pinentry_ctrl_exec (struct pinentry_controller_s * c);
+
+#endif // __PINENTRYCONTROLLER_H__
diff --git a/w32/pinentrydialog.c b/w32/pinentrydialog.c
new file mode 100644 (file)
index 0000000..bc8a140
--- /dev/null
@@ -0,0 +1,168 @@
+/* pinentrydialog.c - A W32 dialog for PIN entry.
+   Copyright (C) 2004 g10 Code GmbH
+   
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+   This program 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
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA  */
+
+#include <windows.h>
+#include "resource.h"
+
+#include "pinentrydialog.h"
+
+BOOL CALLBACK
+pinentry_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+    static struct w32_pinentry_s * ctx;
+
+    switch (msg) {
+    case WM_INITDIALOG:
+       ctx = (struct w32_pinentry_s *)lparam;
+       ctx->dlg = dlg;
+       SetForegroundWindow (dlg);
+       break;
+
+    case WM_COMMAND:
+       switch (LOWORD (wparam)) {
+       case IDOK:
+           EndDialog (dlg, TRUE);
+           break;
+
+       case IDCANCEL:
+           EndDialog (dlg, FALSE);
+           break;
+       }
+       break;
+    }
+    return FALSE;
+}
+
+
+struct w32_pinentry_s *
+pinentry_new (HINSTANCE h)
+{
+    struct w32_pinentry_s *c;
+
+    c = calloc (1, sizeof *c);
+    if (!c)
+       return NULL;
+    DialogBoxParam (h, (LPCTSTR)IDD_PINENT, GetDesktopWindow (),
+                   pinentry_dlg_proc, (LONG)c);
+    return c;
+}
+
+
+int
+pinentry_exec (struct w32_pinentry_s * c)
+{
+    ShowWindow (c->dlg, TRUE);
+    return TRUE;
+}
+
+
+void
+pinentry_set_description (struct w32_pinentry_s *ctx, const char * s)
+{ 
+    if (!s)
+       SetDlgItemText (ctx->dlg, IDC_PINENT_DESC, "");
+    else
+       SetDlgItemText (ctx->dlg, IDC_PINENT_DESC, s);
+    SetDlgItemText (ctx->dlg, IDC_PINENT_ERR, "");
+}
+
+
+const char *
+pinentry_description (struct w32_pinentry_s *ctx)
+{
+    static char buf[256];
+    GetDlgItemText (ctx->dlg, IDC_PINENT_DESC, buf, 256);
+    return buf;
+}
+
+
+void
+pinentry_set_error (struct w32_pinentry_s *ctx, const char * s)
+{
+    if (!s)
+       SetDlgItemText (ctx->dlg, IDC_PINENT_ERR, "");
+    else
+       SetDlgItemText (ctx->dlg, IDC_PINENT_ERR, s);
+}
+
+
+const char *
+pinentry_error (struct w32_pinentry_s * ctx)
+{
+    static char buf[256];
+    GetDlgItemText (ctx->dlg, IDC_PINENT_ERR, buf, 256);
+    return buf;
+}
+
+
+void
+pinentry_set_text (struct w32_pinentry_s * ctx, const char * s)
+{
+    if (!s)
+       SetDlgItemText (ctx->dlg, IDC_PINENT_TEXT, "");
+    else
+       SetDlgItemText (ctx->dlg, IDC_PINENT_TEXT, s);
+}
+
+
+const char *
+pinentry_text (struct w32_pinentry_s * ctx)
+{
+    static char buf[256];
+    GetDlgItemText (ctx->dlg, IDC_PINENT_TEXT, buf, 256);
+    return buf;
+}
+
+
+void
+pinentry_set_prompt (struct w32_pinentry_s * ctx, const char * s)
+{
+    if (!s)
+       SetDlgItemText (ctx->dlg, IDC_PINENT_PROMPT, "");
+    else
+       SetDlgItemText (ctx->dlg, IDC_PINENT_PROMPT, s);
+}
+
+
+
+const char *
+pinentry_prompt (struct w32_pinentry_s * ctx)
+{
+    static char buf[256];
+    GetDlgItemText (ctx->dlg, IDC_PINENT_PROMPT, buf, 256);
+    return buf;
+}
+
+
+void 
+pinentry_set_ok_text (struct w32_pinentry_s * ctx, const char * s)
+{
+    if (!s)
+       SetDlgItemText (ctx->dlg, IDOK, "OK");
+    else
+       SetDlgItemText (ctx->dlg, IDOK, s);
+}
+
+void 
+pinentry_set_cancel_text (struct w32_pinentry_s * ctx, const char * s)
+{
+    if (!s)
+       SetDlgItemText (ctx->dlg, IDCANCEL, "Cancel");
+    else
+       SetDlgItemText (ctx->dlg, IDCANCEL, s);
+}
diff --git a/w32/pinentrydialog.h b/w32/pinentrydialog.h
new file mode 100644 (file)
index 0000000..2b159cc
--- /dev/null
@@ -0,0 +1,41 @@
+/* pinentrydialog.cpp - A W32 dialog for PIN entry.
+   Copyright (C) 2004 g10 Code GmbH
+   
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+   This program 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
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA  */
+
+#ifndef __PINENTRYDIALOG_H__
+#define __PINENTRYDIALOG_H__
+
+struct w32_pinentry_s {
+    HWND   dlg;
+};
+
+
+BOOL CALLBACK  pinentry_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam);
+struct w32_pinentry_s * pinentry_new (HINSTANCE h);
+int pinentry_exec (struct w32_pinentry_s * c);
+void pinentry_set_description (struct w32_pinentry_s *ctx, const char * s);
+const char * pinentry_description (struct w32_pinentry_s *ctx);
+void pinentry_set_error (struct w32_pinentry_s *ctx, const char * s);
+const char * pinentry_error (struct w32_pinentry_s * ctx);
+void pinentry_set_text (struct w32_pinentry_s * ctx, const char * s);
+const char * pinentry_text (struct w32_pinentry_s * ctx);
+void pinentry_set_prompt (struct w32_pinentry_s * ctx, const char * s);
+const char * pinentry_prompt (struct w32_pinentry_s * ctx);
+void  pinentry_set_ok_text (struct w32_pinentry_s * ctx, const char * s);
+void  pinentry_set_cancel_text (struct w32_pinentry_s * ctx, const char * s);
+
+#endif // __PINENTRYDIALOG_H__
diff --git a/w32/resource.h b/w32/resource.h
new file mode 100644 (file)
index 0000000..86c9585
--- /dev/null
@@ -0,0 +1,20 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by pinentry_w32.rc
+//
+#define IDD_PINENT                      101
+#define IDC_PINENT_TEXT                 292
+#define IDC_PINENT_DESC                 1000
+#define IDC_PINENT_ERR                  1001
+#define IDC_PINENT_PROMPT               1002
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        102
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1003
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif