1 /***************************************************************************
2     begin       : Mon Mar 01 2004
3     copyright   : (C) 2004-2010 by Martin Preuss
4     email       : martin@libchipcard.de
5 
6  ***************************************************************************
7  *          Please see toplevel file COPYING for license details           *
8  ***************************************************************************/
9 
10 
11 
12 #ifndef AH_MEDIUM_OHBCI_P_H
13 #define AH_MEDIUM_OHBCI_P_H
14 
15 
16 #define GWEN_CRYPT_TOKEN_OHBCI_NAME         "OHBCI"
17 #define GWEN_CRYPT_TOKEN_OHBCI_VMAJOR       1
18 #define GWEN_CRYPT_TOKEN_OHBCI_VMINOR       8
19 
20 #define GWEN_CRYPT_TOKEN_OHBCI_PINMINLENGTH 4 /* temporary, should be 5 or more */
21 
22 #define GWEN_CRYPT_TOKEN_OHBCI_MAX_PIN_TRY 10
23 
24 #define GWEN_CRYPT_TOKEN_OHBCI_TRESOR_PWD_ITERATIONS   1469
25 #define GWEN_CRYPT_TOKEN_OHBCI_TRESOR_CRYPT_ITERATIONS  365
26 
27 
28 /* new in 1.6 */
29 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_MEDIUM1            (unsigned char)0xc1
30 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_MEDIUM2            (unsigned char)0xc2
31 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_MEDIUM3            (unsigned char)0xc3
32 
33 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_CRYPT_OLD          GWEN_CRYPT_TOKEN_OHBCI_TAG_MEDIUM1
34 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_CRYPT              GWEN_CRYPT_TOKEN_OHBCI_TAG_MEDIUM2
35 /* new in 1.6 */
36 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_CRYPT_BF           GWEN_CRYPT_TOKEN_OHBCI_TAG_MEDIUM3
37 /* new in 1.8 */
38 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_CRYPT_TRESOR       (unsigned char)0xc4
39 
40 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_VERSION_MAJOR      (unsigned char)0x02
41 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_VERSION_MINOR      (unsigned char)0x03
42 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_SEQ                (unsigned char)0x04
43 
44 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_USER_PUBSIGNKEY    (unsigned char)0xc5
45 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_USER_PRIVSIGNKEY   (unsigned char)0xc6
46 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_USER_PUBCRYPTKEY   (unsigned char)0xc7
47 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_USER_PRIVCRYPTKEY  (unsigned char)0xc8
48 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_USER_ID            (unsigned char)0x09
49 
50 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_INST_PUBSIGNKEY    (unsigned char)0xca
51 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_INST_PUBCRYPTKEY   (unsigned char)0xcb
52 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_INST_COUNTRY       (unsigned char)0x0c
53 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_INST_CODE          (unsigned char)0x0d
54 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_INST_SYSTEMID      (unsigned char)0x0e
55 
56 /* temporary keys (reintroduced in version 1.8) */
57 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_TEMP_PUBSIGNKEY    (unsigned char)0xcf
58 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_TEMP_PRIVSIGNKEY   (unsigned char)0xd0
59 /* temporary keys (new in version 1.1, ignored in later versions) */
60 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_TEMP_PUBCRYPTKEY   (unsigned char)0xd1
61 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_TEMP_PRIVCRYPTKEY  (unsigned char)0xd2
62 
63 /* new in version 1.4 */
64 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_SERVER_ADDR        (unsigned char)0xd3
65 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_SERVER_PORT        (unsigned char)0xd4
66 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_REMOTE_SEQ         (unsigned char)0xd5
67 
68 /* new in version 1.6 */
69 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_HEADER             (unsigned char)0x16
70 
71 /* new in version 1.7 */
72 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_USER_PRIVAUTHKEY   (unsigned char)0xd6
73 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_INST_PUBAUTHKEY    (unsigned char)0xd7
74 
75 
76 /* keydata */
77 /* ignored */
78 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_ISPUBLIC      (unsigned char) 0x01
79 /* ignored since 1.8 */
80 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_ISCRYPT       (unsigned char) 0x02
81 /* fixed in 1.5: fixes a bug in old OpenHBCI which included escape chars */
82 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_OWNER         (unsigned char) 0x03
83 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_VERSION       (unsigned char) 0x04
84 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_NUMBER        (unsigned char) 0x05
85 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_MODULUS       (unsigned char) 0x06
86 /* ignored */
87 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_EXP_OLD       (unsigned char) 0x07
88 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_N             (unsigned char) 0x08
89 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_P             (unsigned char) 0x09
90 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_Q             (unsigned char) 0x0a
91 
92 /* ignored since 1.8 */
93 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_DMP1          (unsigned char) 0x0b
94 /* ignored since 1.8 */
95 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_DMQ1          (unsigned char) 0x0c
96 /* ignored since 1.8 */
97 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_IQMP          (unsigned char) 0x0d
98 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_D             (unsigned char) 0x0e
99 /* new in version 1.3 */
100 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_EXP           (unsigned char) 0x0f
101 
102 /* new in version 1.7 */
103 #define GWEN_CRYPT_TOKEN_OHBCI_TAG_KEY_LEN           (unsigned char) 0x10
104 
105 
106 
107 #include "ohbci_l.h"
108 #include <time.h>
109 #include <sys/types.h>
110 #include <sys/stat.h>
111 
112 #include <gwenhywfar/fslock.h>
113 #include <gwenhywfar/cryptkey.h>
114 #include <gwenhywfar/ct_be.h>
115 #include <gwenhywfar/tag16.h>
116 
117 
118 GWENHYWFAR_EXPORT
119 GWEN_PLUGIN *ct_ohbci_factory(GWEN_PLUGIN_MANAGER *pm,
120                               const char *modName,
121                               const char *fileName);
122 
123 GWEN_PLUGIN *GWEN_Crypt_TokenOHBCI_Plugin_new(GWEN_PLUGIN_MANAGER *pm,
124                                               const char *modName,
125                                               const char *fileName);
126 GWEN_CRYPT_TOKEN *GWENHYWFAR_CB
127 GWEN_Crypt_TokenOHBCI_Plugin_CreateToken(GWEN_PLUGIN *pl, const char *name);
128 
129 int GWENHYWFAR_CB
130 GWEN_Crypt_TokenOHBCI_Plugin_CheckToken(GWEN_PLUGIN *pl,
131                                         GWEN_BUFFER *name);
132 
133 
134 typedef struct GWEN_CRYPT_TOKEN_OHBCI GWEN_CRYPT_TOKEN_OHBCI;
135 struct GWEN_CRYPT_TOKEN_OHBCI {
136   GWEN_CRYPT_TOKEN_OPEN_FN openFn;
137   GWEN_CRYPT_TOKEN_CREATE_FN createFn;
138   GWEN_CRYPT_TOKEN_CLOSE_FN closeFn;
139 
140   unsigned int mediumTag;
141   unsigned int cryptoTag;
142   unsigned int vminor;
143 
144   char password[64];
145   int passWordIsSet;
146 
147   int justCreated;
148 };
149 
150 
151 void GWENHYWFAR_CB GWEN_Crypt_TokenOHBCI_FreeData(void *bp, void *p);
152 
153 
154 int GWEN_Crypt_TokenOHBCI__DecryptFile(GWEN_CRYPT_TOKEN *ct,
155                                        GWEN_BUFFER *fbuf,
156                                        int trynum,
157                                        uint32_t gid);
158 int GWEN_Crypt_TokenOHBCI__DecryptFile16(GWEN_CRYPT_TOKEN *ct,
159                                          GWEN_BUFFER *fbuf,
160                                          int trynum,
161                                          uint32_t gid);
162 
163 int GWEN_Crypt_TokenOHBCI__DecryptTresor(GWEN_CRYPT_TOKEN *ct,
164                                          GWEN_BUFFER *fbuf,
165                                          int trynum,
166                                          uint32_t gid);
167 
168 void GWEN_Crypt_TokenOHBCI__DecodeKey(GWEN_CRYPT_TOKEN *ct,
169                                       GWEN_TAG16 *keyTlv,
170                                       GWEN_DB_NODE *dbKeys,
171                                       const char *keyName);
172 int GWEN_Crypt_TokenOHBCI__Decode(GWEN_CRYPT_TOKEN *ct, GWEN_BUFFER *dbuf);
173 
174 
175 
176 int GWEN_Crypt_TokenOHBCI__EncodeKey(const GWEN_CRYPT_KEY *key,
177                                      GWEN_CRYPT_TOKEN_CONTEXT *fct,
178                                      unsigned int tagType,
179                                      int wantPublic,
180                                      int isCrypt,
181                                      GWEN_BUFFER *dbuf);
182 int GWEN_Crypt_TokenOHBCI_Encode(GWEN_CRYPT_TOKEN *ct, GWEN_BUFFER *dbuf);
183 
184 
185 int GWEN_Crypt_TokenOHBCI__EnsurePassword(GWEN_CRYPT_TOKEN *ct,
186                                           int trynum,
187                                           int twice,
188                                           uint32_t gid);
189 
190 
191 
192 int GWENHYWFAR_CB
193 GWEN_Crypt_TokenOHBCI_Create(GWEN_CRYPT_TOKEN *ct, uint32_t gid);
194 int GWENHYWFAR_CB
195 GWEN_Crypt_TokenOHBCI_Open(GWEN_CRYPT_TOKEN *ct, int manage, uint32_t gid);
196 int GWENHYWFAR_CB
197 GWEN_Crypt_TokenOHBCI_Close(GWEN_CRYPT_TOKEN *ct, int abandon, uint32_t gid);
198 
199 int GWENHYWFAR_CB
200 GWEN_Crypt_TokenOHBCI_Write(GWEN_CRYPT_TOKEN *ct, int fd, int cre, uint32_t gid);
201 int GWENHYWFAR_CB
202 GWEN_Crypt_TokenOHBCI_Read(GWEN_CRYPT_TOKEN *ct, int fd, uint32_t gid);
203 
204 
205 int GWENHYWFAR_CB
206 GWEN_Crypt_TokenOHBCI_ChangePin(GWEN_CRYPT_TOKEN *ct,
207                                 int admin,
208                                 uint32_t gid);
209 
210 
211 
212 
213 #endif /* GWEN_CRYPT_TOKEN_OHBCI_P_H */
214 
215 
216 
217