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