1 /*************************************************************************** 2 begin : Thu Aug 01 2019 3 copyright : (C) 2019 by Martin Preuss 4 email : martin@libchipcard.de 5 6 *************************************************************************** 7 * This file is part of the project "AqBanking". * 8 * Please see toplevel file COPYING of that project for license details. * 9 ***************************************************************************/ 10 11 #ifndef AQFINTS_SESSION_H 12 #define AQFINTS_SESSION_H 13 14 15 #include "libaqfints/aqfints.h" 16 #include "msg/message.h" 17 #include "msg/keydescr.h" 18 #include "parser/parser.h" 19 #include "transport/transport.h" 20 #include "service/upd/userdata.h" 21 #include "service/bpd/bpd.h" 22 #include "session/cryptparams.h" 23 24 #include <aqbanking/error.h> 25 26 #include <gwenhywfar/buffer.h> 27 #include <gwenhywfar/types.h> 28 #include <gwenhywfar/inherit.h> 29 #include <gwenhywfar/cryptkey.h> 30 #include <gwenhywfar/paddalgo.h> 31 32 #include <ctype.h> 33 34 35 typedef struct AQFINTS_SESSION AQFINTS_SESSION; 36 GWEN_INHERIT_FUNCTION_DEFS(AQFINTS_SESSION) 37 38 39 enum { 40 AQFINTS_SESSION_CRYPTOP_UNKNOWN=-1, 41 AQFINTS_SESSION_CRYPTOP_NONE, 42 AQFINTS_SESSION_CRYPTOP_SIGN, 43 AQFINTS_SESSION_CRYPTOP_ENCRYPT, 44 AQFINTS_SESSION_CRYPTOP_AUTH, 45 }; 46 47 48 49 /** @name Definitions for virtual functions 50 * 51 */ 52 /*@{*/ 53 54 55 /* definitions for virtual functions (post) */ 56 typedef AQFINTS_MESSAGE *GWENHYWFAR_CB(*AQFINTS_SESSION_EXCHANGEMESSAGES_FN)(AQFINTS_SESSION *sess, 57 AQFINTS_MESSAGE *messageOut); 58 59 typedef int GWENHYWFAR_CB(*AQFINTS_SESSION_FILLOUT_KEYDESCR_FN)(AQFINTS_SESSION *sess, AQFINTS_KEYDESCR *keyDescr, 60 int mode); 61 62 63 typedef int GWENHYWFAR_CB(*AQFINTS_SESSION_DECRYPT_SKEY_FN)(AQFINTS_SESSION *sess, 64 const AQFINTS_KEYDESCR *keyDescr, 65 const AQFINTS_CRYPTPARAMS *cryptParams, 66 const uint8_t *pInData, 67 uint32_t inLen, 68 uint8_t *pOutData, 69 uint32_t *pOutLen); 70 71 typedef int GWENHYWFAR_CB(*AQFINTS_SESSION_ENCRYPT_SKEY_FN)(AQFINTS_SESSION *sess, 72 const AQFINTS_KEYDESCR *keyDescr, 73 const AQFINTS_CRYPTPARAMS *cryptParams, 74 const uint8_t *pInData, 75 uint32_t inLen, 76 uint8_t *pOutData, 77 uint32_t *pOutLen); 78 79 typedef int GWENHYWFAR_CB(*AQFINTS_SESSION_SIGN_FN)(AQFINTS_SESSION *sess, 80 const AQFINTS_KEYDESCR *keyDescr, 81 const AQFINTS_CRYPTPARAMS *cryptParams, 82 const uint8_t *pInData, 83 uint32_t inLen, 84 uint8_t *pSignatureData, 85 uint32_t *pSignatureLen); 86 87 88 /** 89 * GWEN_ERROR_TRY_AGAIN: retry after handling the message 90 */ 91 typedef int GWENHYWFAR_CB(*AQFINTS_SESSION_VERIFY_FN)(AQFINTS_SESSION *sess, 92 const AQFINTS_KEYDESCR *keyDescr, 93 const AQFINTS_CRYPTPARAMS *cryptParams, 94 const uint8_t *pInData, 95 uint32_t inLen, 96 const uint8_t *pSignatureData, 97 uint32_t signatureLen, 98 uint32_t seqCounter); 99 100 101 102 typedef int GWENHYWFAR_CB(*AQFINTS_SESSION_VERIFYPIN_FN)(AQFINTS_SESSION *sess, const AQFINTS_KEYDESCR *keyDescr, 103 const char *pin); 104 105 /*@}*/ 106 107 108 109 110 /** @name Constructor, destructor 111 * 112 */ 113 /*@{*/ 114 AQFINTS_SESSION *AQFINTS_Session_new(AQFINTS_PARSER *parser, AQFINTS_TRANSPORT *trans); 115 void AQFINTS_Session_free(AQFINTS_SESSION *sess); 116 117 void AQFINTS_Session_Attach(AQFINTS_SESSION *sess); 118 /*@}*/ 119 120 121 122 123 /** @name Variables to set before working with sessions 124 * 125 */ 126 /*@{*/ 127 int AQFINTS_Session_GetHbciVersion(const AQFINTS_SESSION *sess); 128 void AQFINTS_Session_SetHbciVersion(AQFINTS_SESSION *sess, int v); 129 130 int AQFINTS_Session_GetIsServer(const AQFINTS_SESSION *sess); 131 void AQFINTS_Session_SetIsServer(AQFINTS_SESSION *sess, int v); 132 133 134 /*@}*/ 135 136 137 138 139 /** @name Variables set when parsing received messages 140 * 141 */ 142 /*@{*/ 143 144 const char *AQFINTS_Session_GetDialogId(const AQFINTS_SESSION *sess); 145 void AQFINTS_Session_SetDialogId(AQFINTS_SESSION *sess, const char *s); 146 147 /*@}*/ 148 149 150 151 152 /** @name Internal functions to be used by the various session submodules 153 * 154 */ 155 /*@{*/ 156 157 AQFINTS_PARSER *AQFINTS_Session_GetParser(const AQFINTS_SESSION *sess); 158 159 160 161 int AQFINTS_Session_GetLastMessageNumSent(const AQFINTS_SESSION *sess); 162 void AQFINTS_Session_SetLastMessageNumSent(AQFINTS_SESSION *sess, int p_src); 163 164 int AQFINTS_Session_GetLastMessageNumReceived(const AQFINTS_SESSION *sess); 165 void AQFINTS_Session_SetLastMessageNumReceived(AQFINTS_SESSION *sess, int p_src); 166 167 /*@}*/ 168 169 170 171 /** @name Sending, Receiving 172 * 173 */ 174 /*@{*/ 175 176 int AQFINTS_Session_Connect(AQFINTS_SESSION *sess); 177 178 int AQFINTS_Session_Disconnect(AQFINTS_SESSION *sess); 179 180 /** 181 * @return message received (or NULL on error) 182 * @param sess session pointer 183 * @param messageOut Pointer to a message to be sent 184 */ 185 AQFINTS_MESSAGE *AQFINTS_Session_ExchangeMessages(AQFINTS_SESSION *sess, AQFINTS_MESSAGE *messageOut); 186 187 AQFINTS_MESSAGE *AQFINTS_Session_DirectlyExchangeMessages(AQFINTS_SESSION *sess, AQFINTS_MESSAGE *messageOut); 188 189 int AQFINTS_Session_SendMessage(AQFINTS_SESSION *sess, const char *ptrBuffer, int lenBuffer); 190 191 int AQFINTS_Session_ReceiveMessage(AQFINTS_SESSION *sess, GWEN_BUFFER *buffer); 192 193 /*@}*/ 194 195 196 197 /** @name Cryptographic Functions 198 * 199 */ 200 /*@{*/ 201 202 int AQFINTS_Session_FilloutKeyname(AQFINTS_SESSION *sess, AQFINTS_KEYDESCR *keyDescr, int mode); 203 204 int AQFINTS_Session_DecryptSessionKey(AQFINTS_SESSION *sess, 205 const AQFINTS_KEYDESCR *keyDescr, 206 const AQFINTS_CRYPTPARAMS *cryptParams, 207 const uint8_t *pInData, 208 uint32_t inLen, 209 uint8_t *pOutData, 210 uint32_t *pOutLen); 211 212 int AQFINTS_Session_EncryptSessionKey(AQFINTS_SESSION *sess, 213 const AQFINTS_KEYDESCR *keyDescr, 214 const AQFINTS_CRYPTPARAMS *cryptParams, 215 const uint8_t *pInData, 216 uint32_t inLen, 217 uint8_t *pOutData, 218 uint32_t *pOutLen); 219 220 int AQFINTS_Session_VerifyPin(AQFINTS_SESSION *sess, const AQFINTS_KEYDESCR *keyDescr, const char *pin); 221 222 223 int AQFINTS_Session_Sign(AQFINTS_SESSION *sess, 224 const AQFINTS_KEYDESCR *keyDescr, 225 const AQFINTS_CRYPTPARAMS *cryptParams, 226 const uint8_t *pInData, 227 uint32_t inLen, 228 uint8_t *pSignatureData, 229 uint32_t *pSignatureLen); 230 231 /** 232 * 233 * @return GWEN_ERROR_TRY_AGAIN if the sign key is not yet available, 0 if okay, error code otherwise 234 */ 235 int AQFINTS_Session_Verify(AQFINTS_SESSION *sess, 236 const AQFINTS_KEYDESCR *keyDescr, 237 const AQFINTS_CRYPTPARAMS *cryptParams, 238 const uint8_t *pInData, 239 uint32_t inLen, 240 const uint8_t *pSignatureData, 241 uint32_t signatureLen, 242 uint32_t seqCounter); 243 244 /*@}*/ 245 246 247 248 /** @name Setters for virtual functions 249 * 250 */ 251 /*@{*/ 252 253 AQFINTS_SESSION_EXCHANGEMESSAGES_FN AQFINTS_Session_SetExchangeMessagesFn(AQFINTS_SESSION *sess, 254 AQFINTS_SESSION_EXCHANGEMESSAGES_FN fn); 255 256 AQFINTS_SESSION_DECRYPT_SKEY_FN AQFINTS_Session_SetDecryptSessionKeyFn(AQFINTS_SESSION *sess, 257 AQFINTS_SESSION_DECRYPT_SKEY_FN fn); 258 259 AQFINTS_SESSION_ENCRYPT_SKEY_FN AQFINTS_Session_SetEncryptSessionKeyFn(AQFINTS_SESSION *sess, 260 AQFINTS_SESSION_ENCRYPT_SKEY_FN fn); 261 262 AQFINTS_SESSION_VERIFYPIN_FN AQFINTS_Session_SetVerifyPinFn(AQFINTS_SESSION *sess, 263 AQFINTS_SESSION_VERIFYPIN_FN fn); 264 265 266 AQFINTS_SESSION_FILLOUT_KEYDESCR_FN AQFINTS_Session_SetFilloutKeynameFn(AQFINTS_SESSION *sess, 267 AQFINTS_SESSION_FILLOUT_KEYDESCR_FN fn); 268 269 AQFINTS_SESSION_SIGN_FN AQFINTS_Session_SetSignFn(AQFINTS_SESSION *sess, AQFINTS_SESSION_SIGN_FN fn); 270 271 AQFINTS_SESSION_VERIFY_FN AQFINTS_Session_SetVerifyFn(AQFINTS_SESSION *sess, AQFINTS_SESSION_VERIFY_FN fn); 272 273 274 /*@}*/ 275 276 277 278 /** @name Internal functions 279 * 280 */ 281 /*@{*/ 282 283 284 int AQFINTS_Session_WriteSegmentList(AQFINTS_SESSION *sess, AQFINTS_SEGMENT_LIST *segmentList); 285 286 int AQFINTS_Session_WriteSegment(AQFINTS_SESSION *sess, AQFINTS_SEGMENT *segment); 287 288 289 AQFINTS_BPD *AQFINTS_Session_ExtractBpdFromSegmentList(AQFINTS_SESSION *sess, AQFINTS_SEGMENT_LIST *segmentList); 290 AQFINTS_USERDATA_LIST *AQFINTS_Session_ExtractUpdFromSegmentList(AQFINTS_SESSION *sess, 291 AQFINTS_SEGMENT_LIST *segmentList); 292 293 /** 294 * Returns the number of TAN methods added. 295 */ 296 int AQFINTS_Session_SampleAllowedTanMethods(int *ptrIntArray, int sizeIntArray, AQFINTS_SEGMENT_LIST *segmentList); 297 298 299 int AQFINTS_Session_SampleDataToHash(AQFINTS_SEGMENT *segSigHead, 300 AQFINTS_SEGMENT *segFirstToSign, 301 AQFINTS_SEGMENT *segLastToSign, 302 GWEN_BUFFER *destBuf); 303 304 305 void AQFINTS_Session_LogMessage(AQFINTS_SESSION *sess, 306 const uint8_t *ptrLogData, 307 uint32_t lenLogData, 308 int rec, 309 int crypt); 310 311 312 int AQFINTS_Session_GetAnonBpd(AQFINTS_SESSION *sess, const char *bankCode, AQFINTS_BPD **pBpd); 313 314 315 const char *AQFINTS_Session_GetLogFile(const AQFINTS_SESSION *sess); 316 void AQFINTS_Session_SetLogFile(AQFINTS_SESSION *sess, const char *s); 317 318 const char *AQFINTS_Session_GetAppRegKey(const AQFINTS_SESSION *sess); 319 void AQFINTS_Session_SetAppRegKey(AQFINTS_SESSION *sess, const char *s); 320 321 const char *AQFINTS_Session_GetAppVersion(const AQFINTS_SESSION *sess); 322 void AQFINTS_Session_SetAppVersion(AQFINTS_SESSION *sess, const char *s); 323 324 325 326 /*@}*/ 327 328 329 #endif 330 331