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 #ifdef HAVE_CONFIG_H
12 # include <config.h>
13 #endif
14 
15 #include "./session_p.h"
16 #include "session/s_encode.h"
17 #include "session/s_decode.h"
18 #include "parser/parser.h"
19 #include "parser/parser_dump.h"
20 #include "service/upd/upd_read.h"
21 #include "service/bpd/bpd_read.h"
22 
23 
24 #include <gwenhywfar/misc.h>
25 #include <gwenhywfar/debug.h>
26 #include <gwenhywfar/text.h>
27 
28 
29 
30 /* ------------------------------------------------------------------------------------------------
31  * forward declarations
32  * ------------------------------------------------------------------------------------------------
33  */
34 
35 
36 static AQFINTS_MESSAGE *GWENHYWFAR_CB _exchangeMessagesInternal(AQFINTS_SESSION *sess, AQFINTS_MESSAGE *messageOut);
37 
38 
39 
40 /* ------------------------------------------------------------------------------------------------
41  * implementations
42  * ------------------------------------------------------------------------------------------------
43  */
44 
45 
46 
47 
GWEN_INHERIT_FUNCTIONS(AQFINTS_SESSION)48 GWEN_INHERIT_FUNCTIONS(AQFINTS_SESSION)
49 
50 
51 
52 AQFINTS_SESSION *AQFINTS_Session_new(AQFINTS_PARSER *parser, AQFINTS_TRANSPORT *trans)
53 {
54   AQFINTS_SESSION *sess;
55 
56   GWEN_NEW_OBJECT(AQFINTS_SESSION, sess);
57   sess->_refCount=1;
58   GWEN_INHERIT_INIT(AQFINTS_SESSION, sess);
59   sess->lastMessageNumSent=0;
60   sess->lastMessageNumReceived=0;
61   sess->hbciVersion=300;
62 
63   sess->parser=parser;
64   sess->transport=trans;
65 
66   sess->exchangeMessagesFn=_exchangeMessagesInternal;
67 
68   return sess;
69 }
70 
71 
72 
AQFINTS_Session_free(AQFINTS_SESSION * sess)73 void AQFINTS_Session_free(AQFINTS_SESSION *sess)
74 {
75   if (sess) {
76     assert(sess->_refCount);
77     if (sess->_refCount==1) {
78       GWEN_INHERIT_FINI(AQFINTS_SESSION, sess)
79       sess->_refCount=0;
80 
81       free(sess->logFile);
82       free(sess->appRegKey);
83       free(sess->appVersion);
84       free(sess->dialogId);
85 
86       if (sess->transport)
87         AQFINTS_Transport_free(sess->transport);
88 
89       GWEN_FREE_OBJECT(sess);
90     }
91     else
92       sess->_refCount--;
93   }
94 }
95 
96 
97 
AQFINTS_Session_Attach(AQFINTS_SESSION * sess)98 void AQFINTS_Session_Attach(AQFINTS_SESSION *sess)
99 {
100   assert(sess);
101   assert(sess->_refCount);
102   sess->_refCount++;
103 }
104 
105 
106 
AQFINTS_Session_GetHbciVersion(const AQFINTS_SESSION * sess)107 int AQFINTS_Session_GetHbciVersion(const AQFINTS_SESSION *sess)
108 {
109   assert(sess);
110   return sess->hbciVersion;
111 }
112 
113 
114 
AQFINTS_Session_SetHbciVersion(AQFINTS_SESSION * sess,int v)115 void AQFINTS_Session_SetHbciVersion(AQFINTS_SESSION *sess, int v)
116 {
117   assert(sess);
118   sess->hbciVersion=v;
119 }
120 
121 
122 
AQFINTS_Session_GetIsServer(const AQFINTS_SESSION * sess)123 int AQFINTS_Session_GetIsServer(const AQFINTS_SESSION *sess)
124 {
125   assert(sess);
126   return sess->isServer;
127 }
128 
129 
130 
AQFINTS_Session_SetIsServer(AQFINTS_SESSION * sess,int v)131 void AQFINTS_Session_SetIsServer(AQFINTS_SESSION *sess, int v)
132 {
133   assert(sess);
134   sess->isServer=v?1:0;
135 }
136 
137 
138 
AQFINTS_Session_GetDialogId(const AQFINTS_SESSION * sess)139 const char *AQFINTS_Session_GetDialogId(const AQFINTS_SESSION *sess)
140 {
141   assert(sess);
142   return sess->dialogId;
143 }
144 
145 
146 
AQFINTS_Session_SetDialogId(AQFINTS_SESSION * sess,const char * s)147 void AQFINTS_Session_SetDialogId(AQFINTS_SESSION *sess, const char *s)
148 {
149   assert(sess);
150   if (sess->dialogId)
151     free(sess->dialogId);
152   if (s)
153     sess->dialogId=strdup(s);
154   else
155     sess->dialogId=NULL;
156 }
157 
158 
159 
AQFINTS_Session_GetLastMessageNumSent(const AQFINTS_SESSION * sess)160 int AQFINTS_Session_GetLastMessageNumSent(const AQFINTS_SESSION *sess)
161 {
162   assert(sess);
163   return sess->lastMessageNumSent;
164 }
165 
166 
167 
AQFINTS_Session_SetLastMessageNumSent(AQFINTS_SESSION * sess,int p_src)168 void AQFINTS_Session_SetLastMessageNumSent(AQFINTS_SESSION *sess, int p_src)
169 {
170   assert(sess);
171   sess->lastMessageNumSent=p_src;
172 }
173 
174 
175 
AQFINTS_Session_GetLastMessageNumReceived(const AQFINTS_SESSION * sess)176 int AQFINTS_Session_GetLastMessageNumReceived(const AQFINTS_SESSION *sess)
177 {
178   assert(sess);
179   return sess->lastMessageNumReceived;
180 }
181 
182 
183 
AQFINTS_Session_SetLastMessageNumReceived(AQFINTS_SESSION * sess,int p_src)184 void AQFINTS_Session_SetLastMessageNumReceived(AQFINTS_SESSION *sess, int p_src)
185 {
186   assert(sess);
187   sess->lastMessageNumReceived=p_src;
188 }
189 
190 
191 
AQFINTS_Session_GetParser(const AQFINTS_SESSION * sess)192 AQFINTS_PARSER *AQFINTS_Session_GetParser(const AQFINTS_SESSION *sess)
193 {
194   assert(sess);
195   return sess->parser;
196 }
197 
198 
AQFINTS_Session_GetLogFile(const AQFINTS_SESSION * sess)199 const char *AQFINTS_Session_GetLogFile(const AQFINTS_SESSION *sess)
200 {
201   assert(sess);
202   return sess->logFile;
203 }
204 
205 
206 
AQFINTS_Session_SetLogFile(AQFINTS_SESSION * sess,const char * s)207 void AQFINTS_Session_SetLogFile(AQFINTS_SESSION *sess, const char *s)
208 {
209   assert(sess);
210   if (sess->logFile)
211     free(sess->logFile);
212   if (s)
213     sess->logFile=strdup(s);
214   else
215     sess->logFile=NULL;
216 }
217 
218 
219 
AQFINTS_Session_GetAppRegKey(const AQFINTS_SESSION * sess)220 const char *AQFINTS_Session_GetAppRegKey(const AQFINTS_SESSION *sess)
221 {
222   assert(sess);
223   return sess->appRegKey;
224 }
225 
226 
227 
AQFINTS_Session_SetAppRegKey(AQFINTS_SESSION * sess,const char * s)228 void AQFINTS_Session_SetAppRegKey(AQFINTS_SESSION *sess, const char *s)
229 {
230   assert(sess);
231   if (sess->appRegKey)
232     free(sess->appRegKey);
233   if (s)
234     sess->appRegKey=strdup(s);
235   else
236     sess->appRegKey=NULL;
237 }
238 
239 
240 
AQFINTS_Session_GetAppVersion(const AQFINTS_SESSION * sess)241 const char *AQFINTS_Session_GetAppVersion(const AQFINTS_SESSION *sess)
242 {
243   assert(sess);
244   return sess->appVersion;
245 }
246 
247 
248 
AQFINTS_Session_SetAppVersion(AQFINTS_SESSION * sess,const char * s)249 void AQFINTS_Session_SetAppVersion(AQFINTS_SESSION *sess, const char *s)
250 {
251   assert(sess);
252   if (sess->appVersion)
253     free(sess->appVersion);
254   if (s)
255     sess->appVersion=strdup(s);
256   else
257     sess->appVersion=NULL;
258 }
259 
260 
261 
262 
263 
264 
265 
266 
267 
268 
269 
AQFINTS_Session_ExchangeMessages(AQFINTS_SESSION * sess,AQFINTS_MESSAGE * messageOut)270 AQFINTS_MESSAGE *AQFINTS_Session_ExchangeMessages(AQFINTS_SESSION *sess, AQFINTS_MESSAGE *messageOut)
271 {
272   assert(sess);
273   if (sess->exchangeMessagesFn)
274     return sess->exchangeMessagesFn(sess, messageOut);
275   else
276     return NULL;
277 }
278 
279 
280 
_exchangeMessagesInternal(AQFINTS_SESSION * sess,AQFINTS_MESSAGE * messageOut)281 AQFINTS_MESSAGE *_exchangeMessagesInternal(AQFINTS_SESSION *sess, AQFINTS_MESSAGE *messageOut)
282 {
283   return AQFINTS_Session_DirectlyExchangeMessages(sess, messageOut);
284 }
285 
286 
287 
AQFINTS_Session_FilloutKeyname(AQFINTS_SESSION * sess,AQFINTS_KEYDESCR * keyDescr,int mode)288 int AQFINTS_Session_FilloutKeyname(AQFINTS_SESSION *sess, AQFINTS_KEYDESCR *keyDescr, int mode)
289 {
290   assert(sess);
291   if (sess->filloutKeynameFn)
292     return sess->filloutKeynameFn(sess, keyDescr, mode);
293   else
294     return GWEN_ERROR_NOT_IMPLEMENTED;
295 }
296 
297 
298 
AQFINTS_Session_DecryptSessionKey(AQFINTS_SESSION * sess,const AQFINTS_KEYDESCR * keyDescr,const AQFINTS_CRYPTPARAMS * cryptParams,const uint8_t * pInData,uint32_t inLen,uint8_t * pOutData,uint32_t * pOutLen)299 int AQFINTS_Session_DecryptSessionKey(AQFINTS_SESSION *sess,
300                                       const AQFINTS_KEYDESCR *keyDescr,
301                                       const AQFINTS_CRYPTPARAMS *cryptParams,
302                                       const uint8_t *pInData,
303                                       uint32_t inLen,
304                                       uint8_t *pOutData,
305                                       uint32_t *pOutLen)
306 {
307   assert(sess);
308   if (sess->decryptSessionKeyFn)
309     return sess->decryptSessionKeyFn(sess, keyDescr, cryptParams, pInData, inLen, pOutData, pOutLen);
310   else
311     return GWEN_ERROR_NOT_IMPLEMENTED;
312 }
313 
314 
315 
AQFINTS_Session_EncryptSessionKey(AQFINTS_SESSION * sess,const AQFINTS_KEYDESCR * keyDescr,const AQFINTS_CRYPTPARAMS * cryptParams,const uint8_t * pInData,uint32_t inLen,uint8_t * pOutData,uint32_t * pOutLen)316 int AQFINTS_Session_EncryptSessionKey(AQFINTS_SESSION *sess,
317                                       const AQFINTS_KEYDESCR *keyDescr,
318                                       const AQFINTS_CRYPTPARAMS *cryptParams,
319                                       const uint8_t *pInData,
320                                       uint32_t inLen,
321                                       uint8_t *pOutData,
322                                       uint32_t *pOutLen)
323 {
324   assert(sess);
325   if (sess->encryptSessionKeyFn)
326     return sess->encryptSessionKeyFn(sess, keyDescr, cryptParams, pInData, inLen, pOutData, pOutLen);
327   else
328     return GWEN_ERROR_NOT_IMPLEMENTED;
329 }
330 
331 
332 
AQFINTS_Session_VerifyPin(AQFINTS_SESSION * sess,const AQFINTS_KEYDESCR * keyDescr,const char * pin)333 int AQFINTS_Session_VerifyPin(AQFINTS_SESSION *sess, const AQFINTS_KEYDESCR *keyDescr, const char *pin)
334 {
335   assert(sess);
336   if (sess->verifyPinFn)
337     return sess->verifyPinFn(sess, keyDescr, pin);
338   else
339     return GWEN_ERROR_NOT_IMPLEMENTED;
340 }
341 
342 
343 
AQFINTS_Session_Sign(AQFINTS_SESSION * sess,const AQFINTS_KEYDESCR * keyDescr,const AQFINTS_CRYPTPARAMS * cryptParams,const uint8_t * pInData,uint32_t inLen,uint8_t * pSignatureData,uint32_t * pSignatureLen)344 int AQFINTS_Session_Sign(AQFINTS_SESSION *sess,
345                          const AQFINTS_KEYDESCR *keyDescr,
346                          const AQFINTS_CRYPTPARAMS *cryptParams,
347                          const uint8_t *pInData,
348                          uint32_t inLen,
349                          uint8_t *pSignatureData,
350                          uint32_t *pSignatureLen)
351 {
352   assert(sess);
353   if (sess->signFn)
354     return sess->signFn(sess, keyDescr, cryptParams, pInData, inLen, pSignatureData, pSignatureLen);
355   else
356     return GWEN_ERROR_NOT_IMPLEMENTED;
357 }
358 
359 
360 
AQFINTS_Session_Verify(AQFINTS_SESSION * sess,const AQFINTS_KEYDESCR * keyDescr,const AQFINTS_CRYPTPARAMS * cryptParams,const uint8_t * pInData,uint32_t inLen,const uint8_t * pSignatureData,uint32_t signatureLen,uint32_t seqCounter)361 int AQFINTS_Session_Verify(AQFINTS_SESSION *sess,
362                            const AQFINTS_KEYDESCR *keyDescr,
363                            const AQFINTS_CRYPTPARAMS *cryptParams,
364                            const uint8_t *pInData,
365                            uint32_t inLen,
366                            const uint8_t *pSignatureData,
367                            uint32_t signatureLen,
368                            uint32_t seqCounter)
369 {
370   assert(sess);
371   if (sess->verifyFn)
372     return sess->verifyFn(sess, keyDescr, cryptParams, pInData, inLen, pSignatureData, signatureLen, seqCounter);
373   else
374     return GWEN_ERROR_NOT_IMPLEMENTED;
375 }
376 
377 
378 
379 
380 
381 
382 
383 
384 
AQFINTS_Session_SetExchangeMessagesFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_EXCHANGEMESSAGES_FN fn)385 AQFINTS_SESSION_EXCHANGEMESSAGES_FN AQFINTS_Session_SetExchangeMessagesFn(AQFINTS_SESSION *sess,
386                                                                           AQFINTS_SESSION_EXCHANGEMESSAGES_FN fn)
387 {
388   AQFINTS_SESSION_EXCHANGEMESSAGES_FN oldFn;
389 
390   assert(sess);
391   oldFn=sess->exchangeMessagesFn;
392   sess->exchangeMessagesFn=fn;
393   return oldFn;
394 }
395 
396 
397 
AQFINTS_Session_SetFilloutKeynameFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_FILLOUT_KEYDESCR_FN fn)398 AQFINTS_SESSION_FILLOUT_KEYDESCR_FN AQFINTS_Session_SetFilloutKeynameFn(AQFINTS_SESSION *sess,
399                                                                         AQFINTS_SESSION_FILLOUT_KEYDESCR_FN fn)
400 {
401   AQFINTS_SESSION_FILLOUT_KEYDESCR_FN oldFn;
402 
403   assert(sess);
404   oldFn=sess->filloutKeynameFn;
405   sess->filloutKeynameFn=fn;
406   return oldFn;
407 }
408 
409 
410 
AQFINTS_Session_SetSignFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_SIGN_FN fn)411 AQFINTS_SESSION_SIGN_FN AQFINTS_Session_SetSignFn(AQFINTS_SESSION *sess, AQFINTS_SESSION_SIGN_FN fn)
412 {
413   AQFINTS_SESSION_SIGN_FN oldFn;
414 
415   assert(sess);
416   oldFn=sess->signFn;
417   sess->signFn=fn;
418   return oldFn;
419 }
420 
421 
422 
AQFINTS_Session_SetVerifyFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_VERIFY_FN fn)423 AQFINTS_SESSION_VERIFY_FN AQFINTS_Session_SetVerifyFn(AQFINTS_SESSION *sess, AQFINTS_SESSION_VERIFY_FN fn)
424 {
425   AQFINTS_SESSION_VERIFY_FN oldFn;
426 
427   assert(sess);
428   oldFn=sess->verifyFn;
429   sess->verifyFn=fn;
430   return oldFn;
431 }
432 
433 
434 
AQFINTS_Session_SetDecryptSessionKeyFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_DECRYPT_SKEY_FN fn)435 AQFINTS_SESSION_DECRYPT_SKEY_FN AQFINTS_Session_SetDecryptSessionKeyFn(AQFINTS_SESSION *sess,
436                                                                        AQFINTS_SESSION_DECRYPT_SKEY_FN fn)
437 {
438   AQFINTS_SESSION_DECRYPT_SKEY_FN oldFn;
439 
440   assert(sess);
441   oldFn=sess->decryptSessionKeyFn;
442   sess->decryptSessionKeyFn=fn;
443   return oldFn;
444 }
445 
446 
447 
AQFINTS_Session_SetEncryptSessionKeyFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_ENCRYPT_SKEY_FN fn)448 AQFINTS_SESSION_ENCRYPT_SKEY_FN AQFINTS_Session_SetEncryptSessionKeyFn(AQFINTS_SESSION *sess,
449                                                                        AQFINTS_SESSION_ENCRYPT_SKEY_FN fn)
450 {
451   AQFINTS_SESSION_ENCRYPT_SKEY_FN oldFn;
452 
453   assert(sess);
454   oldFn=sess->encryptSessionKeyFn;
455   sess->encryptSessionKeyFn=fn;
456   return oldFn;
457 }
458 
459 
460 
AQFINTS_Session_SetVerifyPinFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_VERIFYPIN_FN fn)461 AQFINTS_SESSION_VERIFYPIN_FN AQFINTS_Session_SetVerifyPinFn(AQFINTS_SESSION *sess,
462                                                             AQFINTS_SESSION_VERIFYPIN_FN fn)
463 {
464   AQFINTS_SESSION_VERIFYPIN_FN oldFn;
465 
466   assert(sess);
467   oldFn=sess->verifyPinFn;
468   sess->verifyPinFn=fn;
469   return oldFn;
470 }
471 
472 
473 
474 
475 
476 
477 
AQFINTS_Session_WriteSegmentList(AQFINTS_SESSION * sess,AQFINTS_SEGMENT_LIST * segmentList)478 int AQFINTS_Session_WriteSegmentList(AQFINTS_SESSION *sess, AQFINTS_SEGMENT_LIST *segmentList)
479 {
480   AQFINTS_SEGMENT *segment;
481 
482   segment=AQFINTS_Segment_List_First(segmentList);
483   while (segment) {
484     int rv;
485 
486     rv=AQFINTS_Session_WriteSegment(sess, segment);
487     if (rv<0) {
488       DBG_INFO(AQFINTS_LOGDOMAIN, "here (%d)", rv);
489       return rv;
490     }
491     segment=AQFINTS_Segment_List_Next(segment);
492   }
493 
494   return 0;
495 }
496 
497 
498 
AQFINTS_Session_WriteSegment(AQFINTS_SESSION * sess,AQFINTS_SEGMENT * segment)499 int AQFINTS_Session_WriteSegment(AQFINTS_SESSION *sess, AQFINTS_SEGMENT *segment)
500 {
501   GWEN_DB_NODE *db;
502   GWEN_DB_NODE *dbHead;
503   const char *sCode;
504   int segVersion;
505   int segNum;
506   int refSegNum;
507   int rv;
508 
509   sCode=AQFINTS_Segment_GetCode(segment);
510   segVersion=AQFINTS_Segment_GetSegmentVersion(segment);
511   segNum=AQFINTS_Segment_GetSegmentNumber(segment);
512   refSegNum=AQFINTS_Segment_GetRefSegmentNumber(segment);
513 
514   db=AQFINTS_Segment_GetDbData(segment);
515   if (db==NULL) {
516     DBG_ERROR(AQFINTS_LOGDOMAIN, "Segment has no DB data");
517     return GWEN_ERROR_INTERNAL;
518   }
519 
520   /* prepare segment head */
521   dbHead=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "head");
522   assert(dbHead);
523   GWEN_DB_SetCharValue(dbHead, GWEN_DB_FLAGS_OVERWRITE_VARS, "code", sCode);
524   GWEN_DB_SetIntValue(dbHead, GWEN_DB_FLAGS_OVERWRITE_VARS, "seq", segNum);
525   GWEN_DB_SetIntValue(dbHead, GWEN_DB_FLAGS_OVERWRITE_VARS, "version", segVersion);
526   if (refSegNum)
527     GWEN_DB_SetIntValue(dbHead, GWEN_DB_FLAGS_OVERWRITE_VARS, "ref", refSegNum);
528 
529   rv=AQFINTS_Parser_WriteSegment(sess->parser, segment);
530   if (rv<0) {
531     DBG_INFO(AQFINTS_LOGDOMAIN, "Error writing segment [%s] (%d)", AQFINTS_Segment_GetCode(segment), rv);
532     AQFINTS_Parser_DumpSegment(segment, 2);
533     return rv;
534   }
535 
536   return 0;
537 }
538 
539 
540 
AQFINTS_Session_SampleAllowedTanMethods(int * ptrIntArray,int sizeIntArray,AQFINTS_SEGMENT_LIST * segmentList)541 int AQFINTS_Session_SampleAllowedTanMethods(int *ptrIntArray, int sizeIntArray, AQFINTS_SEGMENT_LIST *segmentList)
542 {
543   AQFINTS_SEGMENT *segment;
544   int numMethodsAdded=0;
545 
546   segment=AQFINTS_Segment_List_First(segmentList);
547   while (segment) {
548     AQFINTS_SEGMENT *nextSegment;
549     const char *sCode;
550 
551     nextSegment=AQFINTS_Segment_List_Next(segment);
552 
553     sCode=AQFINTS_Segment_GetCode(segment);
554     if (sCode && *sCode && strcasecmp(sCode, "HIRMS")==0) { /* check result */
555       GWEN_DB_NODE *db;
556 
557       db=AQFINTS_Segment_GetDbData(segment);
558       if (db) {
559         GWEN_DB_NODE *dbResult;
560 
561         dbResult=GWEN_DB_FindFirstGroup(db, "result");
562         while (dbResult) {
563           int resultCode;
564           const char *resultText;
565 
566           resultCode=GWEN_DB_GetIntValue(dbResult, "resultcode", 0, 0);
567           resultText=GWEN_DB_GetCharValue(dbResult, "text", 0, 0);
568           DBG_NOTICE(0, "Segment result: %d (%s)", resultCode, resultText?resultText:"<none>");
569           if (resultCode==3920) {
570             int i;
571 
572             /* reset array */
573             for (i=0; i<sizeIntArray; i++)
574               ptrIntArray[i]=0;
575 
576             for (i=0; i<sizeIntArray; i++) {
577               int j;
578 
579               j=GWEN_DB_GetIntValue(dbResult, "param", i, 0);
580               if (j==0)
581                 break;
582               DBG_NOTICE(0, "Adding allowed TAN method %d", j);
583               ptrIntArray[i]=j;
584               numMethodsAdded++;
585             } /* for */
586           }
587           dbResult=GWEN_DB_FindNextGroup(dbResult, "result");
588         } /* while dbResult */
589       } /* if db */
590     }
591 
592     segment=nextSegment;
593   } /* while segment */
594   if (numMethodsAdded<1) {
595     /* add single step if empty list */
596     DBG_INFO(AQFINTS_LOGDOMAIN, "No allowed TAN method reported, assuming 999");
597     ptrIntArray[0]=999;
598     numMethodsAdded=1;
599   }
600 
601   return numMethodsAdded;
602 }
603 
604 
605 
606 
607 
608 
AQFINTS_Session_Connect(AQFINTS_SESSION * sess)609 int AQFINTS_Session_Connect(AQFINTS_SESSION *sess)
610 {
611   assert(sess);
612   return AQFINTS_Transport_Connect(sess->transport);
613 }
614 
615 
616 
AQFINTS_Session_Disconnect(AQFINTS_SESSION * sess)617 int AQFINTS_Session_Disconnect(AQFINTS_SESSION *sess)
618 {
619   assert(sess);
620   return AQFINTS_Transport_Disconnect(sess->transport);
621 }
622 
623 
624 
AQFINTS_Session_SendMessage(AQFINTS_SESSION * sess,const char * ptrBuffer,int lenBuffer)625 int AQFINTS_Session_SendMessage(AQFINTS_SESSION *sess, const char *ptrBuffer, int lenBuffer)
626 {
627   int rv;
628 
629   assert(sess);
630   rv=AQFINTS_Transport_SendMessage(sess->transport, ptrBuffer, lenBuffer);
631   sess->lastMessageNumSent++;
632   if (rv<0) {
633     DBG_INFO(AQFINTS_LOGDOMAIN, "here (%d)", rv);
634     return rv;
635   }
636 
637   return rv;
638 }
639 
640 
641 
AQFINTS_Session_ReceiveMessage(AQFINTS_SESSION * sess,GWEN_BUFFER * buffer)642 int AQFINTS_Session_ReceiveMessage(AQFINTS_SESSION *sess, GWEN_BUFFER *buffer)
643 {
644   int rv;
645 
646   /* TODO: add logging mechanism */
647   rv=AQFINTS_Transport_ReceiveMessage(sess->transport, buffer);
648   if (rv<0) {
649     DBG_ERROR(AQFINTS_LOGDOMAIN, "here (%d)", rv);
650     return rv;
651   }
652 
653   sess->lastMessageNumReceived++;
654   return rv;
655 }
656 
657 
658 
659 
AQFINTS_Session_ExtractBpdFromSegmentList(AQFINTS_SESSION * sess,AQFINTS_SEGMENT_LIST * segmentList)660 AQFINTS_BPD *AQFINTS_Session_ExtractBpdFromSegmentList(AQFINTS_SESSION *sess, AQFINTS_SEGMENT_LIST *segmentList)
661 {
662   AQFINTS_BPD *bpd;
663 
664   bpd=AQFINTS_Bpd_SampleBpdFromSegmentList(sess->parser, segmentList, 1);
665   if (bpd==NULL) {
666     DBG_ERROR(AQFINTS_LOGDOMAIN, "Empty BPD");
667     return NULL;
668   }
669 
670   return bpd;
671 }
672 
673 
674 
AQFINTS_Session_ExtractUpdFromSegmentList(AQFINTS_SESSION * sess,AQFINTS_SEGMENT_LIST * segmentList)675 AQFINTS_USERDATA_LIST *AQFINTS_Session_ExtractUpdFromSegmentList(AQFINTS_SESSION *sess,
676                                                                  AQFINTS_SEGMENT_LIST *segmentList)
677 {
678   AQFINTS_USERDATA_LIST *userDataList;
679 
680   userDataList=AQFINTS_Upd_SampleUpdFromSegmentList(segmentList, 1);
681   if (userDataList==NULL) {
682     DBG_ERROR(AQFINTS_LOGDOMAIN, "Empty userDataList");
683     return NULL;
684   }
685 
686   return userDataList;
687 }
688 
689 
690 
691 
692 
AQFINTS_Session_DirectlyExchangeMessages(AQFINTS_SESSION * sess,AQFINTS_MESSAGE * messageOut)693 AQFINTS_MESSAGE *AQFINTS_Session_DirectlyExchangeMessages(AQFINTS_SESSION *sess, AQFINTS_MESSAGE *messageOut)
694 {
695   GWEN_BUFFER *msgBuffer;
696   AQFINTS_MESSAGE *message;
697   int rv;
698 
699 
700   msgBuffer=AQFINTS_Session_EncodeMessage(sess, messageOut);
701   if (msgBuffer==NULL) {
702     DBG_INFO(AQFINTS_LOGDOMAIN, "here");
703     return NULL;
704   }
705 
706   rv=AQFINTS_Session_SendMessage(sess, GWEN_Buffer_GetStart(msgBuffer), GWEN_Buffer_GetUsedBytes(msgBuffer));
707   if (rv<0) {
708     DBG_INFO(AQFINTS_LOGDOMAIN, "here");
709     GWEN_Buffer_free(msgBuffer);
710     return NULL;
711   }
712   GWEN_Buffer_Reset(msgBuffer);
713 
714   rv=AQFINTS_Session_ReceiveMessage(sess, msgBuffer);
715   if (rv<0) {
716     DBG_INFO(AQFINTS_LOGDOMAIN, "here");
717     GWEN_Buffer_free(msgBuffer);
718     return NULL;
719   }
720 
721   message=AQFINTS_Session_DecodeMessage(sess, (const uint8_t *) GWEN_Buffer_GetStart(msgBuffer),
722                                         GWEN_Buffer_GetUsedBytes(msgBuffer));
723   if (message==NULL) {
724     DBG_ERROR(AQFINTS_LOGDOMAIN, "Could not decode this message:");
725     GWEN_Buffer_Dump(msgBuffer, 2);
726     GWEN_Buffer_free(msgBuffer);
727     return NULL;
728   }
729   GWEN_Buffer_free(msgBuffer);
730 
731   return message;
732 }
733 
734 
735 
AQFINTS_Session_SampleDataToHash(AQFINTS_SEGMENT * segSigHead,AQFINTS_SEGMENT * segFirstToSign,AQFINTS_SEGMENT * segLastToSign,GWEN_BUFFER * destBuf)736 int AQFINTS_Session_SampleDataToHash(AQFINTS_SEGMENT *segSigHead,
737                                      AQFINTS_SEGMENT *segFirstToSign,
738                                      AQFINTS_SEGMENT *segLastToSign,
739                                      GWEN_BUFFER *destBuf)
740 {
741 
742   AQFINTS_SEGMENT *segment;
743   int rv;
744 
745   /* add signature head */
746   rv=GWEN_Buffer_AppendBytes(destBuf,
747                              (const char *) AQFINTS_Segment_GetDataPointer(segSigHead),
748                              AQFINTS_Segment_GetDataLength(segSigHead));
749   if (rv<0) {
750     DBG_INFO(AQFINTS_LOGDOMAIN, "here (%d)", rv);
751     return rv;
752   }
753   /* hash data segments */
754   segment=segFirstToSign;
755   while (segment) {
756     rv=GWEN_Buffer_AppendBytes(destBuf,
757                                (const char *) AQFINTS_Segment_GetDataPointer(segment),
758                                AQFINTS_Segment_GetDataLength(segment));
759     if (rv<0) {
760       DBG_INFO(AQFINTS_LOGDOMAIN, "here (%d)", rv);
761       return rv;
762     }
763 
764     if (segment==segLastToSign)
765       break;
766     segment=AQFINTS_Segment_List_Next(segment);
767   }
768 
769   return 0;
770 }
771 
772 
773 
774 
775