root/middleware-offline/trunk/_src/eidmw/applayer/APLCardPteid.cpp @ 82

Revision 82, 63.9 KB (checked in by vsilva, 9 years ago)

Implement Multi-sign with no PIN request

Line 
1/* ****************************************************************************
2
3 * eID Middleware Project.
4 * Copyright (C) 2008-2009 FedICT.
5 *
6 * This is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License version
8 * 3.0 as published by the Free Software Foundation.
9 *
10 * This software is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this software; if not, see
17 * http://www.gnu.org/licenses/.
18
19**************************************************************************** */
20#include "APLCardPteid.h"
21#include "CardPteid.h"
22#include "TLVBuffer.h"
23#include "APLCertif.h"
24#include "cryptoFwkPteid.h"
25#include "CardPteidDef.h"
26#include "eidErrors.h"
27#include "Util.h"
28#include "MWException.h"
29#include "CardLayer.h"
30#include "MiscUtil.h"
31#include "StringOps.h"
32#include "APLConfig.h"
33
34
35using namespace std;
36
37namespace eIDMW
38{
39
40/*****************************************************************************************
41---------------------------------------- APL_EIDCard -----------------------------------------
42*****************************************************************************************/
43APL_AccessWarningLevel APL_EIDCard::m_lWarningLevel=APL_ACCESSWARNINGLEVEL_TO_ASK;
44
45APL_EIDCard::APL_EIDCard(APL_ReaderContext *reader, APL_CardType cardType):APL_SmartCard(reader)
46{
47        m_cardType = cardType;
48        m_CCcustomDoc=NULL;
49        m_docid=NULL;
50        m_personal=NULL;
51        m_address=NULL;
52        m_sod=NULL;
53        m_docinfo=NULL;
54
55        m_FileTrace=NULL;
56        m_FileID=NULL;
57        m_FileIDSign=NULL;
58        m_FileAddress=NULL;
59        m_FileAddressSign=NULL;
60        m_FileSod=NULL;
61        m_FilePersoData=NULL;
62        m_FileTokenInfo=NULL;
63
64        m_cardinfosign=NULL;
65
66        m_fileCertAuthentication=NULL;
67        m_fileCertSignature=NULL;
68        m_fileCertRootSign=NULL;
69        m_fileCertRoot=NULL;
70        m_fileCertRootAuth=NULL;
71
72        m_sodCheck = false;
73        m_tokenLabel = NULL;
74        m_tokenSerial = NULL;
75}
76
77APL_EIDCard::~APL_EIDCard()
78{
79        if(m_CCcustomDoc)
80        {
81                delete m_CCcustomDoc;
82                m_CCcustomDoc=NULL;
83        }
84        if(m_docid)
85        {
86                delete m_docid;
87                m_docid=NULL;
88        }
89        if(m_personal)
90        {
91                delete m_personal;
92                m_personal=NULL;
93        }
94        if(m_address)
95        {
96                delete m_address;
97                m_address=NULL;
98        }
99        if(m_sod)
100        {
101                delete m_sod;
102                m_sod=NULL;
103        }
104
105        if(m_docinfo)
106        {
107                delete m_docinfo;
108                m_docinfo=NULL;
109        }
110
111        if(m_FileTrace)
112        {
113                delete m_FileTrace;
114                m_FileTrace=NULL;
115        }
116
117        if(m_FileID)
118        {
119                delete m_FileID;
120                m_FileID=NULL;
121        }
122
123        if(m_FileIDSign)
124        {
125                delete m_FileIDSign;
126                m_FileIDSign=NULL;
127        }
128
129        if(m_FileAddress)
130        {
131                delete m_FileAddress;
132                m_FileAddress=NULL;
133        }
134
135        if(m_FileAddressSign)
136        {
137                delete m_FileAddressSign;
138                m_FileAddressSign=NULL;
139        }
140
141        if(m_FileSod)
142        {
143                delete m_FileSod;
144                m_FileSod=NULL;
145        }
146
147        if(m_FilePersoData)
148        {
149                delete m_FilePersoData;
150                m_FilePersoData=NULL;
151        }
152
153        if(m_FileTokenInfo)
154        {
155                delete m_FileTokenInfo;
156                m_FileTokenInfo=NULL;
157        }
158
159        if(m_cardinfosign)
160        {
161                delete m_cardinfosign;
162                m_cardinfosign=NULL;
163        }
164
165        if(m_fileCertAuthentication)
166        {
167                delete m_fileCertAuthentication;
168                m_fileCertAuthentication=NULL;
169        }
170
171        if(m_fileCertSignature)
172        {
173                delete m_fileCertSignature;
174                m_fileCertSignature=NULL;
175        }
176
177        if(m_fileCertRootAuth)
178        {
179                delete m_fileCertRootAuth;
180                m_fileCertRootAuth=NULL;
181        }
182
183        if(m_fileCertRootSign)
184        {
185                delete m_fileCertRootSign;
186                m_fileCertRootSign=NULL;
187        }
188
189        if(m_fileCertRoot)
190        {
191                delete m_fileCertRoot;
192                m_fileCertRoot=NULL;
193        }
194
195        if(m_tokenLabel)
196        {
197                delete m_tokenLabel;
198                m_tokenLabel=NULL;
199        }
200
201        if (m_tokenSerial)
202        {
203                delete m_tokenSerial;
204                m_tokenSerial=NULL;
205        }
206
207}
208
209bool APL_EIDCard::isCardForbidden()
210{
211        if(isTestCard() && !m_allowTestParam)
212                return true;
213
214        return false;
215}
216
217bool APL_EIDCard::initVirtualReader()
218{
219        bool bRet = true;
220
221        m_reader->getSuperParser()->initReadFunction(&readVirtualFileRAW,&readVirtualFileTLV,&readVirtualFileCSV,&readVirtualFileXML);
222
223        //If it is a new version file, we launch the certificates for the validation
224        char *stop;
225        CByteArray baCert;
226        CByteArray baCertP15;
227        CByteArray baCount;
228        m_reader->getSuperParser()->readData(PTEID_FILE_CERTS_COUNT,baCount);
229        unsigned long ulCountCerts=strtoul((char*)baCount.GetBytes(),&stop,10);
230
231        //If it is a old version file, we launch the root for the validation
232        if(ulCountCerts>0)
233        {
234                for(unsigned long i=0;i<ulCountCerts;i++)
235                {
236                        m_reader->getSuperParser()->readData(PTEID_FILE_CERTS,baCert,i);
237                        m_reader->getSuperParser()->readData(PTEID_FILE_CERTS_P15,baCertP15,i);
238                        getCertificates()->addCert(NULL,APL_CERTIF_TYPE_UNKNOWN,false,false,i,&baCert,&baCertP15);
239                }
240        }
241       
242        getCertificates()->resetFlags();
243
244        //PINS
245        CByteArray baPin;
246        m_reader->getSuperParser()->readData(PTEID_FILE_PINS_COUNT,baCount);
247        unsigned long ulCountPins=strtoul((char*)baCount.GetBytes(),&stop,10);
248
249        //If it is a old version file, we launch the root for the validation
250        for(unsigned long i=0;i<ulCountPins;i++)
251        {
252                m_reader->getSuperParser()->readData(PTEID_FILE_PINS_P15,baPin,i);
253                getPins()->addPin(i,&baPin);
254        }
255
256        bool oldAllowTestAsked = m_allowTestAsked;
257        bool oldAllowTestAnswer = m_allowTestAnswer;
258
259        m_allowTestAsked=true;
260        m_allowTestAnswer=true;
261
262        try
263        {
264                if(bRet && getFileTrace()->getStatus(true)!=CARDFILESTATUS_OK)
265                        bRet=false;
266                if(bRet && getFileID()->getStatus(true)!=CARDFILESTATUS_OK)
267                        bRet=false;
268                if(bRet && getFileIDSign()->getStatus(true)!=CARDFILESTATUS_OK)
269                        bRet=false;
270                if(bRet && getFileAddress()->getStatus(true)!=CARDFILESTATUS_OK)
271                        bRet=false;
272                if(bRet && getFileAddressSign()->getStatus(true)!=CARDFILESTATUS_OK)
273                        bRet=false;
274                if(bRet && getFileSod()->getStatus(true)!=CARDFILESTATUS_OK)
275                        bRet=false;
276                if(bRet && getFileTokenInfo()->getStatus(true)!=CARDFILESTATUS_OK)
277                        bRet=false;
278                if(bRet && getFileInfo()->getStatus(true)!=CARDFILESTATUS_OK)
279                        bRet=false;
280
281                if(bRet && getChallenge().Size()!=20)
282                        bRet=false;
283                if(bRet && getChallengeResponse().Size()==0)
284                        bRet=false;
285        }
286        catch(CMWException &e)
287        {
288                e.GetError();           //Avoid warning
289                bRet=false;
290        }
291
292        m_allowTestAsked=oldAllowTestAsked;
293        m_allowTestAnswer=oldAllowTestAnswer;
294
295        return bRet;
296}
297
298unsigned long APL_EIDCard::readVirtualFileRAW(APL_SuperParser *parser, const char *fileID, CByteArray &in,unsigned long idx)
299{
300        CByteArray b64;
301        bool bDecode=false;
302
303        if(strcmp(fileID,PTEID_FILE_ID)==0)
304        {
305                in=parser->getRawDataEid()->idData;
306        }
307        else if(strcmp(fileID,PTEID_FILE_ID_SIGN)==0)
308        {
309                in=parser->getRawDataEid()->idSigData;
310        }
311        else if(strcmp(fileID,PTEID_FILE_TRACE)==0)
312        {
313                in=parser->getRawDataEid()->traceData;
314        }
315        else if(strcmp(fileID,PTEID_FILE_ADDRESS)==0)
316        {
317                in=parser->getRawDataEid()->addrData;
318        }
319        else if(strcmp(fileID,PTEID_FILE_ADDRESS_SIGN)==0)
320        {
321                in=parser->getRawDataEid()->addrSigData;
322        }
323        else if(strcmp(fileID,PTEID_FILE_SOD)==0)
324        {
325                in=parser->getRawDataEid()->sodData;
326        }
327        else if(strcmp(fileID,PTEID_FILE_PERSODATA)==0)
328        {
329                in=parser->getRawDataEid()->persodata;
330        }
331        else if(strcmp(fileID,PTEID_FILE_CARDINFO)==0)
332        {
333                in=parser->getRawDataEid()->cardData;
334        }
335        else if(strcmp(fileID,PTEID_FILE_TOKENINFO)==0)
336        {
337                in=parser->getRawDataEid()->tokenInfo;
338        }
339        else if(strcmp(fileID,PTEID_FILE_CHALLENGE)==0)
340        {
341                in=parser->getRawDataEid()->challenge;
342        }
343        else if(strcmp(fileID,PTEID_FILE_CHALLENGE_RESPONSE)==0)
344        {
345                in=parser->getRawDataEid()->response;
346        }
347        else if(strcmp(fileID,PTEID_FILE_CERTS_COUNT)==0)
348        {
349                if(parser->getRawDataEid()->version==1)
350                {
351                        in.ClearContents();
352                        in+="0";                        //Not supported => 0 certificates
353                }
354                else
355                {
356                        throw CMWEXCEPTION(EIDMW_ERR_FILE_NOT_FOUND); //Not supported
357                }
358        }
359        else if(strcmp(fileID,PTEID_FILE_CERTS)==0)
360        {
361                throw CMWEXCEPTION(EIDMW_ERR_FILE_NOT_FOUND); //Not supported
362        }
363        else if(strcmp(fileID,PTEID_FILE_CERTS_P15)==0)
364        {
365                throw CMWEXCEPTION(EIDMW_ERR_FILE_NOT_FOUND); //Not supported
366        }
367        else if(strcmp(fileID,PTEID_FILE_PINS_COUNT)==0)
368        {
369                if(parser->getRawDataEid()->version==1)
370                {
371                        in.ClearContents();
372                        in+="0";                        //Not supported => 0 pins
373                }
374                else
375                {
376                        throw CMWEXCEPTION(EIDMW_ERR_FILE_NOT_FOUND); //Not supported
377                }
378        }
379        else if(strcmp(fileID,PTEID_FILE_PINS_P15)==0)
380        {
381                throw CMWEXCEPTION(EIDMW_ERR_FILE_NOT_FOUND); //Not supported
382        }
383        else
384        {
385                throw CMWEXCEPTION(EIDMW_ERR_FILE_NOT_FOUND);
386        }
387
388        if(bDecode)
389                m_cryptoFwk->b64Decode(b64,in);
390
391        return in.Size();
392}
393
394unsigned long APL_EIDCard::readVirtualFileTLV(APL_SuperParser *parser, const char *fileID, CByteArray &in,unsigned long idx)
395{
396        CByteArray b64;
397        bool bDecode=false;
398
399        if(strcmp(fileID,PTEID_FILE_ID)==0)
400        {
401                parser->readDataTlv(in,PTEID_TLV_TAG_FILE_ID);
402        }
403        else if(strcmp(fileID,PTEID_FILE_ID_SIGN)==0)
404        {
405                parser->readDataTlv(in,PTEID_TLV_TAG_FILE_IDSIGN);
406        }
407        else if(strcmp(fileID,PTEID_FILE_ADDRESS)==0)
408        {
409                parser->readDataTlv(in,PTEID_TLV_TAG_FILE_ADDR);
410        }
411        else if(strcmp(fileID,PTEID_FILE_ADDRESS_SIGN)==0)
412        {
413                parser->readDataTlv(in,PTEID_TLV_TAG_FILE_ADDRSIGN);
414        }
415        else if(strcmp(fileID,PTEID_FILE_SOD)==0)
416        {
417                parser->readDataTlv(in,PTEID_TLV_TAG_FILE_SOD);
418        }
419        else if(strcmp(fileID,PTEID_FILE_CARDINFO)==0)
420        {
421                parser->readDataTlv(in,PTEID_TLV_TAG_FILE_CARDINFO);
422        }
423        else if(strcmp(fileID,PTEID_FILE_TOKENINFO)==0)
424        {
425                parser->readDataTlv(in,PTEID_TLV_TAG_FILE_TOKENINFO);
426        }
427        else if(strcmp(fileID,PTEID_FILE_CHALLENGE)==0)
428        {
429                parser->readDataTlv(in,PTEID_TLV_TAG_FILE_CHALLENGE);
430        }
431        else if(strcmp(fileID,PTEID_FILE_CHALLENGE_RESPONSE)==0)
432        {
433                parser->readDataTlv(in,PTEID_TLV_TAG_FILE_CHALLENGE_RESPONSE);
434        }
435        else if(strcmp(fileID,PTEID_FILE_CERTS_COUNT)==0)
436        {
437                parser->readDataTlv(in,PTEID_TLV_TAG_FILE_CERTS,0);
438                unsigned long ulCount=0;
439                try
440                {
441                        ulCount=in.GetLong(0);
442                }
443                catch(CMWException &e)
444                {
445                                if(e.GetError()!=(long)EIDMW_ERR_PARAM_RANGE)
446                                throw e;
447                }
448                char buffer[10];
449                sprintf_s(buffer,sizeof(buffer),"%ld",ulCount);
450                in.ClearContents();
451                in+=buffer;
452        }
453        else if(strcmp(fileID,PTEID_FILE_CERTS)==0)
454        {
455                CByteArray ba;
456
457                parser->readDataTlv(ba,PTEID_TLV_TAG_FILE_CERTS,(unsigned char)(idx+1));
458
459                CTLVBuffer certTlv=CTLVBuffer();
460                certTlv.ParseFileTLV(ba.GetBytes(),ba.Size());
461
462                CByteArray cert;
463
464                CTLV *field=certTlv.GetTagData(0x00);
465                if(field!=NULL)
466                        cert.Append(field->GetData(),field->GetLength());
467                else
468                        cert=ba;
469
470                in=cert;
471        }
472        else if(strcmp(fileID,PTEID_FILE_CERTS_P15)==0)
473        {
474                CByteArray ba;
475
476                parser->readDataTlv(ba,PTEID_TLV_TAG_FILE_CERTS,(unsigned char)(idx+1));
477
478                CTLVBuffer certTlv=CTLVBuffer();
479                certTlv.ParseFileTLV(ba.GetBytes(),ba.Size());
480
481                CByteArray cert;
482
483                CTLV *field=certTlv.GetTagData(0x01);
484                if(field!=NULL)
485                        cert.Append(field->GetData(),field->GetLength());
486                else
487                        cert=ba;
488
489                in=cert;
490        }
491        else if(strcmp(fileID,PTEID_FILE_PINS_COUNT)==0)
492        {
493                parser->readDataTlv(in,PTEID_TLV_TAG_FILE_PINS,0);
494                unsigned long ulCount=0;
495                try
496                {
497                        ulCount=in.GetLong(0);
498                }
499                catch(CMWException &e)
500                {
501                                if(e.GetError()!=(long)EIDMW_ERR_PARAM_RANGE)
502                                throw e;
503                }
504                char buffer[10];
505                sprintf_s(buffer,sizeof(buffer),"%ld",ulCount);
506                in.ClearContents();
507                in+=buffer;
508        }
509        else if(strcmp(fileID,PTEID_FILE_PINS_P15)==0)
510        {
511                CByteArray ba;
512
513                parser->readDataTlv(ba,PTEID_TLV_TAG_FILE_PINS,(unsigned char)(idx+1));
514
515                CTLVBuffer pinTlv=CTLVBuffer();
516                pinTlv.ParseFileTLV(ba.GetBytes(),ba.Size());
517
518                CByteArray pin;
519
520                CTLV *field=pinTlv.GetTagData(0x00);
521                if(field!=NULL)
522                        pin.Append(field->GetData(),field->GetLength());
523                else
524                        pin=ba;
525
526                in=pin;
527        }
528        else
529        {
530                throw CMWEXCEPTION(EIDMW_ERR_FILE_NOT_FOUND);
531        }
532
533        if(bDecode)
534                m_cryptoFwk->b64Decode(b64,in);
535
536        return in.Size();
537}
538
539unsigned long APL_EIDCard::readVirtualFileCSV(APL_SuperParser *parser, const char *fileID, CByteArray &in,unsigned long idx)
540{
541        CByteArray b64;
542        bool bDecode=false;
543
544        if(strcmp(fileID,PTEID_FILE_ID)==0)
545        {
546                parser->readDataCsv(b64,PTEID_CSV_TAG_FILE_ID);
547                bDecode=true;
548        }
549        else if(strcmp(fileID,PTEID_FILE_ID_SIGN)==0)
550        {
551                parser->readDataCsv(b64,PTEID_CSV_TAG_FILE_IDSIGN);
552                bDecode=true;
553        }
554        else if(strcmp(fileID,PTEID_FILE_ADDRESS)==0)
555        {
556                parser->readDataCsv(b64,PTEID_CSV_TAG_FILE_ADDR);
557                bDecode=true;
558        }
559        else if(strcmp(fileID,PTEID_FILE_ADDRESS_SIGN)==0)
560        {
561                parser->readDataCsv(b64,PTEID_CSV_TAG_FILE_ADDRSIGN);
562                bDecode=true;
563        }
564        else if(strcmp(fileID,PTEID_FILE_SOD)==0)
565        {
566                parser->readDataCsv(b64,PTEID_CSV_TAG_FILE_PHOTO);
567                bDecode=true;
568        }
569        else if(strcmp(fileID,PTEID_FILE_CARDINFO)==0)
570        {
571                parser->readDataCsv(b64,PTEID_CSV_TAG_FILE_CARDINFO);
572                bDecode=true;
573        }
574        else if(strcmp(fileID,PTEID_FILE_TOKENINFO)==0)
575        {
576                parser->readDataCsv(b64,PTEID_CSV_TAG_FILE_TOKENINFO);
577                bDecode=true;
578        }
579        else if(strcmp(fileID,PTEID_FILE_CHALLENGE)==0)
580        {
581                parser->readDataCsv(b64,PTEID_CSV_TAG_FILE_CHALLENGE);
582                bDecode=true;
583        }
584        else if(strcmp(fileID,PTEID_FILE_CHALLENGE_RESPONSE)==0)
585        {
586                parser->readDataCsv(b64,PTEID_CSV_TAG_FILE_CHALLENGE_RESPONSE);
587                bDecode=true;
588        }
589        else if(strcmp(fileID,PTEID_FILE_CERTS_COUNT)==0)
590        {
591                parser->readDataCsv(in,PTEID_CSV_TAG_FILE_CERTS_COUNT);
592        }
593        else if(strcmp(fileID,PTEID_FILE_CERTS)==0)
594        {
595                parser->readDataCsv(b64,PTEID_CSV_TAG_FILE_CERTS_COUNT,PTEID_CSV_TAG_FILE_CERTS_FIRST,PTEID_CSV_TAG_FILE_CERTS_STEP,idx);
596                bDecode=true;
597        }
598        else if(strcmp(fileID,PTEID_FILE_CERTS_P15)==0)
599        {
600                parser->readDataCsv(b64,PTEID_CSV_TAG_FILE_CERTS_COUNT,PTEID_CSV_TAG_FILE_CERTS_P15_FIRST,PTEID_CSV_TAG_FILE_CERTS_STEP,idx);
601                bDecode=true;
602        }
603        else if(strcmp(fileID,PTEID_FILE_PINS_COUNT)==0)
604        {
605                char *stop;
606                CByteArray baTmp;
607                parser->readDataCsv(baTmp,PTEID_CSV_TAG_FILE_CERTS_COUNT);
608                unsigned long ulCount=strtoul((char*)baTmp.GetBytes(),&stop,10);
609                unsigned long ulPos= PTEID_CSV_TAG_FILE_CERTS_COUNT + 1 + ulCount * PTEID_CSV_TAG_FILE_CERTS_STEP;
610                parser->readDataCsv(in,ulPos);
611        }
612        else if(strcmp(fileID,PTEID_FILE_PINS_P15)==0)
613        {
614                char *stop;
615                CByteArray baTmp;
616                parser->readDataCsv(baTmp,PTEID_CSV_TAG_FILE_CERTS_COUNT);
617                unsigned long ulCount=strtoul((char*)baTmp.GetBytes(),&stop,10);
618                unsigned long ulPos= PTEID_CSV_TAG_FILE_CERTS_COUNT + 1 + ulCount * PTEID_CSV_TAG_FILE_CERTS_STEP;
619
620                parser->readDataCsv(b64,ulPos,ulPos+PTEID_CSV_TAG_FILE_PINS_STEP,PTEID_CSV_TAG_FILE_PINS_STEP,idx);
621                bDecode=true;
622        }
623        else
624        {
625                throw CMWEXCEPTION(EIDMW_ERR_FILE_NOT_FOUND);
626        }
627
628        if(bDecode)
629                m_cryptoFwk->b64Decode(b64,in);
630
631        return in.Size();
632}
633
634unsigned long APL_EIDCard::readVirtualFileXML(APL_SuperParser *parser, const char *fileID, CByteArray &in,unsigned long idx)
635{
636        CByteArray b64;
637        bool bDecode=false;
638
639        if(strcmp(fileID,PTEID_FILE_ID)==0)
640        {
641                parser->readDataXml(b64,PTEID_XML_PATH_FILE_ID);
642                bDecode=true;
643        }
644        else if(strcmp(fileID,PTEID_FILE_ID_SIGN)==0)
645        {
646                parser->readDataXml(b64,PTEID_XML_PATH_FILE_IDSIGN);
647                bDecode=true;
648        }
649        else if(strcmp(fileID,PTEID_FILE_ADDRESS)==0)
650        {
651                parser->readDataXml(b64,PTEID_XML_PATH_FILE_ADDR);
652                bDecode=true;
653        }
654        else if(strcmp(fileID,PTEID_FILE_ADDRESS_SIGN)==0)
655        {
656                parser->readDataXml(b64,PTEID_XML_PATH_FILE_ADDRSIGN);
657                bDecode=true;
658        }
659        else if(strcmp(fileID,PTEID_FILE_SOD)==0)
660        {
661                parser->readDataXml(b64,PTEID_XML_PATH_FILE_PHOTO);
662                bDecode=true;
663        }
664        else if(strcmp(fileID,PTEID_FILE_CARDINFO)==0)
665        {
666                parser->readDataXml(b64,PTEID_XML_PATH_FILE_CARDINFO);
667                bDecode=true;
668        }
669        else if(strcmp(fileID,PTEID_FILE_TOKENINFO)==0)
670        {
671                parser->readDataXml(b64,PTEID_XML_PATH_FILE_TOKENINFO);
672                bDecode=true;
673        }
674        else if(strcmp(fileID,PTEID_FILE_CHALLENGE)==0)
675        {
676                parser->readDataXml(b64,PTEID_XML_PATH_FILE_CHALLENGE);
677                bDecode=true;
678        }
679        else if(strcmp(fileID,PTEID_FILE_CHALLENGE_RESPONSE)==0)
680        {
681                parser->readDataXml(b64,PTEID_XML_PATH_FILE_CHALLENGE_RESPONSE);
682                bDecode=true;
683        }
684        else if(strcmp(fileID,PTEID_FILE_CERTS_COUNT)==0)
685        {
686                unsigned long count=parser->countDataXml(PTEID_XML_PATH_FILE_CERTS);
687                in.ClearContents();
688                char buffer[5];
689                sprintf_s(buffer,sizeof(buffer),"%ld",count);
690                in.Append((unsigned char*)buffer,sizeof(buffer)-1);
691        }
692        else if(strcmp(fileID,PTEID_FILE_CERTS)==0)
693        {
694                parser->readDataXml(b64,PTEID_XML_PATH_FILE_CERTS,idx);
695                bDecode=true;
696        }
697        else if(strcmp(fileID,PTEID_FILE_CERTS_P15)==0)
698        {
699                parser->readDataXml(b64,PTEID_XML_PATH_FILE_CERTS_P15,idx);
700                bDecode=true;
701        }
702        else if(strcmp(fileID,PTEID_FILE_PINS_COUNT)==0)
703        {
704                unsigned long count=parser->countDataXml(PTEID_XML_PATH_FILE_PINS_P15);
705                in.ClearContents();
706                char buffer[5];
707                sprintf_s(buffer,sizeof(buffer),"%ld",count);
708                in.Append((unsigned char*)buffer,sizeof(buffer)-1);
709        }
710        else if(strcmp(fileID,PTEID_FILE_PINS_P15)==0)
711        {
712                parser->readDataXml(b64,PTEID_XML_PATH_FILE_PINS_P15,idx);
713                bDecode=true;
714        }
715        else
716        {
717                throw CMWEXCEPTION(EIDMW_ERR_FILE_NOT_FOUND);
718        }
719
720        if(bDecode)
721                m_cryptoFwk->b64Decode(b64,in);
722
723        return in.Size();
724}
725
726APL_EidFile_Trace *APL_EIDCard::getFileTrace()
727{
728        if(!m_FileTrace)
729        {
730                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
731                if(!m_FileTrace)
732                {
733                        m_FileTrace=new APL_EidFile_Trace(this);
734                }
735        }
736
737        return m_FileTrace;
738}
739
740APL_EidFile_ID *APL_EIDCard::getFileID()
741{
742        if(!m_FileID)
743        {
744                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
745                if(!m_FileID)
746                        m_FileID=new APL_EidFile_ID(this);
747        }
748
749        m_FileID->doSODCheck(m_sodCheck);
750
751        return m_FileID;
752}
753
754APL_EidFile_IDSign *APL_EIDCard::getFileIDSign()
755{
756        if(!m_FileIDSign)
757        {
758                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
759                if(!m_FileIDSign)
760                {
761                        m_FileIDSign=new APL_EidFile_IDSign(this);
762                }
763        }
764
765        return m_FileIDSign;
766}
767
768APL_EidFile_Address *APL_EIDCard::getFileAddress()
769{
770        if(!m_FileAddress)
771        {
772                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
773                if(!m_FileAddress)
774                        m_FileAddress=new APL_EidFile_Address(this);
775        }
776
777        m_FileAddress->doSODCheck(m_sodCheck);
778
779        return m_FileAddress;
780}
781
782APL_EidFile_AddressSign *APL_EIDCard::getFileAddressSign()
783{
784        if(!m_FileAddressSign)
785        {
786                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
787                if(!m_FileAddressSign)
788                {
789                        m_FileAddressSign=new APL_EidFile_AddressSign(this);
790                }
791        }
792
793        return m_FileAddressSign;
794}
795
796APL_EidFile_Sod *APL_EIDCard::getFileSod()
797{
798        if(!m_FileSod)
799        {
800                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
801                if(!m_FileSod)
802                {
803                        m_FileSod=new APL_EidFile_Sod(this);
804                }
805        }
806        return m_FileSod;
807}
808
809APL_EidFile_PersoData *APL_EIDCard::getFilePersoData()
810{
811        if(!m_FilePersoData)
812        {
813                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
814                if(!m_FilePersoData)
815                {
816                        m_FilePersoData=new APL_EidFile_PersoData(this);
817                }
818        }
819        return m_FilePersoData;
820}
821
822APL_EidFile_TokenInfo *APL_EIDCard::getFileTokenInfo()
823{
824        if(!m_FileTokenInfo)
825        {
826                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
827                if(!m_FileTokenInfo)
828                {
829                        m_FileTokenInfo=new APL_EidFile_TokenInfo(this);
830                }
831        }
832        return m_FileTokenInfo;
833}
834
835APL_CardType APL_EIDCard::getType() const
836{
837        return m_cardType;
838}
839
840bool APL_EIDCard::isTestCard()
841{
842        APL_Certif *root = NULL;
843
844        bool bOut = false;
845
846        if(root)
847                bOut=root->isTest();
848
849        return bOut;
850}
851
852unsigned long APL_EIDCard::readFile(const char *csPath, CByteArray &oData, unsigned long  ulOffset, unsigned long  ulMaxLength)
853{
854        if(!m_reader->isVirtualReader())
855        {
856                bool bWarning=false;
857                for(long i=0;_pteid_files_to_warn[i]!=NULL;i++)
858                {
859                        if(strcmp(csPath,_pteid_files_to_warn[i])==0)
860                        {
861                                bWarning=true;
862                                break;
863                        }
864                }
865
866                if(bWarning)
867                {
868                        askWarningLevel();
869                }
870        }
871
872        return APL_SmartCard::readFile(csPath,oData,ulOffset,ulMaxLength);
873}
874
875unsigned long APL_EIDCard::certificateCount()
876{
877        if(m_reader->isVirtualReader()) //Virtual Reader
878                return 0;
879
880        try
881        {
882                return APL_SmartCard::certificateCount();
883        }
884        catch(...)
885        {
886        }
887
888        if(m_certificateCount==COUNT_UNDEF)
889        {
890                //PKCS15 is broken
891                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
892                if(m_certificateCount==COUNT_UNDEF)
893                {
894                        m_certificateCount=0;
895
896                        if(!m_fileCertAuthentication)
897                        {
898                                m_fileCertAuthentication=new APL_CardFile_Certificate(this,PTEID_FILE_CERT_AUTHENTICATION);
899                                //If status ok, we add the certificate to the store
900                                if(m_fileCertAuthentication->getStatus(false)==CARDFILESTATUS_OK)
901                                {
902                                        if(NULL == (getCertificates()->addCert(m_fileCertAuthentication,APL_CERTIF_TYPE_AUTHENTICATION,true,false,m_certificateCount,NULL,NULL)))
903                                                throw CMWEXCEPTION(EIDMW_ERR_CHECK);
904                                        m_certificateCount++;
905                                }
906                        }
907
908                        if(!m_fileCertSignature)
909                        {
910                                m_fileCertSignature=new APL_CardFile_Certificate(this,PTEID_FILE_CERT_SIGNATURE);
911                                //If status ok, we add the certificate to the store
912                                if(m_fileCertSignature->getStatus(true)==CARDFILESTATUS_OK)
913                                {
914                                        if(NULL == (getCertificates()->addCert(m_fileCertSignature,APL_CERTIF_TYPE_SIGNATURE,true,false,m_certificateCount,NULL,NULL)))
915                                                throw CMWEXCEPTION(EIDMW_ERR_CHECK);
916                                        m_certificateCount++;
917                                }
918                        }
919
920                        if(!m_fileCertRootAuth)
921                        {
922                                m_fileCertRootAuth=new APL_CardFile_Certificate(this,PTEID_FILE_CERT_ROOT_AUTH);
923                                //If status ok, we add the certificate to the store
924                                if(m_fileCertRootAuth->getStatus(true)==CARDFILESTATUS_OK)
925                                {
926                                        if(NULL == (getCertificates()->addCert(m_fileCertRootAuth,APL_CERTIF_TYPE_ROOT_AUTH,true,false,m_certificateCount,NULL,NULL)))
927                                                throw CMWEXCEPTION(EIDMW_ERR_CHECK);
928                                        m_certificateCount++;
929                                }
930                        }
931
932                        if(!m_fileCertRootSign)
933                        {
934                                m_fileCertRootSign=new APL_CardFile_Certificate(this,PTEID_FILE_CERT_ROOT_SIGN);
935                                //If status ok, we add the certificate to the store
936                                if(m_fileCertRootSign->getStatus(true)==CARDFILESTATUS_OK)
937                                {
938                                        if(NULL == (getCertificates()->addCert(m_fileCertRootSign,APL_CERTIF_TYPE_ROOT_SIGN,true,false,m_certificateCount,NULL,NULL)))
939                                                throw CMWEXCEPTION(EIDMW_ERR_CHECK);
940                                        m_certificateCount++;
941                                }
942                        }
943
944                        if(!m_fileCertRoot)
945                        {
946                                m_fileCertRoot=new APL_CardFile_Certificate(this,PTEID_FILE_CERT_ROOT);
947                                //If status ok, we add the certificate to the store
948                                if(m_fileCertRoot->getStatus(true)==CARDFILESTATUS_OK)
949                                {
950                                        if(NULL == (getCertificates()->addCert(m_fileCertRoot,APL_CERTIF_TYPE_ROOT,true,false,m_certificateCount,NULL,NULL)))
951                                                throw CMWEXCEPTION(EIDMW_ERR_CHECK);
952                                        m_certificateCount++;
953                                }
954                        }
955                }
956        }
957        return m_certificateCount;
958}
959
960APL_XMLDoc& APL_EIDCard::getDocument(APL_DocumentType type)
961{
962        switch(type)
963        {
964        case APL_DOCTYPE_ID:
965                return getID();
966        case APL_DOCTYPE_ADDRESS:
967                return getAddr();
968        case APL_DOCTYPE_SOD:
969                return getSod();
970        case APL_DOCTYPE_INFO:
971                return getDocInfo();
972        case APL_DOCTYPE_PINS:
973                return *getPins();
974        case APL_DOCTYPE_CERTIFICATES:
975                return *getCertificates();
976        default:
977                throw CMWEXCEPTION(EIDMW_ERR_DOCTYPE_UNKNOWN);
978        }
979}
980
981
982APL_CCXML_Doc& APL_EIDCard::getXmlCCDoc(APL_XmlUserRequestedInfo& userRequestedInfo){
983        if (m_CCcustomDoc)
984                delete m_CCcustomDoc;
985
986        CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
987        m_CCcustomDoc=new APL_CCXML_Doc(this, userRequestedInfo);
988
989        return *m_CCcustomDoc;
990}
991
992
993APL_DocEId& APL_EIDCard::getID()
994{
995        if(!m_docid)
996        {
997                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
998                if(!m_docid)
999                {
1000                        m_docid=new APL_DocEId(this);
1001                }
1002        }
1003
1004        return *m_docid;
1005}
1006
1007
1008APL_PersonalNotesEId& APL_EIDCard::getPersonalNotes()
1009{
1010        if(!m_personal)
1011                {
1012                        CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
1013                        if(!m_personal)
1014                        {
1015                                m_personal=new APL_PersonalNotesEId(this);
1016                        }
1017                }
1018
1019                return *m_personal;
1020}
1021
1022
1023APL_AddrEId& APL_EIDCard::getAddr()
1024{
1025        if(!m_address)
1026        {
1027                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
1028                if(!m_address)
1029                {
1030                        m_address=new APL_AddrEId(this);
1031                }
1032        }
1033
1034        return *m_address;
1035}
1036
1037APL_SodEid& APL_EIDCard::getSod()
1038{
1039        if(!m_sod)
1040        {
1041                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
1042                if(!m_sod)
1043                {
1044                        m_sod=new APL_SodEid(this);
1045                }
1046        }
1047
1048        return *m_sod;
1049}
1050
1051APL_DocVersionInfo& APL_EIDCard::getDocInfo()
1052{
1053        if(!m_docinfo)
1054        {
1055                CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
1056                if(!m_docinfo)
1057                {
1058                        m_docinfo=new APL_DocVersionInfo(this);
1059                }
1060        }
1061
1062        return *m_docinfo;
1063}
1064
1065const CByteArray &APL_EIDCard::getCardInfoSignature()
1066{
1067        if(!m_cardinfosign)
1068        {
1069                if(m_reader->isVirtualReader())
1070                {
1071                        return EmptyByteArray;
1072                }
1073                else
1074                {
1075                        CAutoMutex autoMutex(&m_Mutex);         //We lock for only one instanciation
1076                        if(!m_cardinfosign)
1077                        {
1078                                CByteArray param;
1079                                CByteArray result;
1080
1081                                BEGIN_CAL_OPERATION(m_reader)
1082                                result = m_reader->getCalReader()->Ctrl(CTRL_PTEID_GETSIGNEDCARDDATA,param);
1083                                END_CAL_OPERATION(m_reader)
1084
1085                                m_cardinfosign=new CByteArray(result.GetBytes(28,128));
1086                        }
1087                }
1088        }
1089
1090        return *m_cardinfosign;
1091
1092}
1093const CByteArray& APL_EIDCard::getRawData(APL_RawDataType type)
1094{
1095        switch(type)
1096        {
1097        case APL_RAWDATA_ID:
1098                return getRawData_Id();
1099        case APL_RAWDATA_ID_SIG:
1100                return getRawData_IdSig();
1101        case APL_RAWDATA_TRACE:
1102                return getRawData_Trace();
1103        case APL_RAWDATA_ADDR:
1104                return getRawData_Addr();
1105        case APL_RAWDATA_ADDR_SIG:
1106                return getRawData_AddrSig();
1107        case APL_RAWDATA_SOD:
1108                return getRawData_Sod();
1109        case APL_RAWDATA_CARD_INFO:
1110                return getRawData_CardInfo();
1111        case APL_RAWDATA_TOKEN_INFO:
1112                return getRawData_TokenInfo();
1113        case APL_RAWDATA_CHALLENGE:
1114                return getRawData_Challenge();
1115        case APL_RAWDATA_RESPONSE:
1116                return getRawData_Response();
1117        case APL_RAWDATA_PERSO_DATA:
1118                return getRawData_PersoData();
1119        default:
1120                throw CMWEXCEPTION(EIDMW_ERR_FILETYPE_UNKNOWN);
1121        }
1122}
1123
1124const CByteArray& APL_EIDCard::getRawData_Trace()
1125{
1126        return getFileTrace()->getData();
1127}
1128
1129const CByteArray& APL_EIDCard::getRawData_Id()
1130{
1131        return getFileID()->getData();
1132}
1133
1134const CByteArray& APL_EIDCard::getRawData_IdSig()
1135{
1136        return getFileIDSign()->getData();
1137}
1138
1139const CByteArray& APL_EIDCard::getRawData_Addr()
1140{
1141        return getFileAddress()->getData();
1142}
1143
1144const CByteArray& APL_EIDCard::getRawData_AddrSig()
1145{
1146        return getFileAddressSign()->getData();
1147}
1148
1149const CByteArray& APL_EIDCard::getRawData_Sod()
1150{
1151        return getFileSod()->getData();
1152}
1153
1154const CByteArray& APL_EIDCard::getRawData_CardInfo()
1155{
1156        return getFileInfo()->getData();
1157}
1158
1159const CByteArray& APL_EIDCard::getRawData_TokenInfo()
1160{
1161        return getFileTokenInfo()->getData();
1162}
1163
1164const CByteArray& APL_EIDCard::getRawData_PersoData()
1165{
1166        return getFilePersoData()->getData();
1167}
1168
1169const CByteArray& APL_EIDCard::getRawData_Challenge()
1170{
1171        return getChallenge();
1172}
1173
1174const CByteArray& APL_EIDCard::getRawData_Response()
1175{
1176        return getChallengeResponse();
1177}
1178
1179void APL_EIDCard::askWarningLevel()
1180{
1181        // Fix this: This modification hides the accept window.
1182        // Application will access to the card always without user interaction
1183        setWarningLevel(APL_ACCESSWARNINGLEVEL_ACCEPTED);
1184}
1185
1186void APL_EIDCard::setWarningLevel(APL_AccessWarningLevel lWarningLevel)
1187{
1188        //APL_ACCESSWARNINGLEVEL_BEING_ASKED is an internal status that could not be set from outside
1189        if(lWarningLevel!=APL_ACCESSWARNINGLEVEL_REFUSED
1190                && lWarningLevel!=APL_ACCESSWARNINGLEVEL_TO_ASK
1191                && lWarningLevel!=APL_ACCESSWARNINGLEVEL_ACCEPTED)
1192                throw CMWEXCEPTION(EIDMW_ERR_CHECK);
1193
1194        m_lWarningLevel=lWarningLevel;
1195}
1196
1197APL_AccessWarningLevel APL_EIDCard::getWarningLevel()
1198{
1199        return m_lWarningLevel;
1200}
1201
1202bool APL_EIDCard::isApplicationAllowed()
1203{
1204        try
1205        {
1206                askWarningLevel();
1207        }
1208        catch(CMWException &e)
1209        {
1210                e=e;
1211        }
1212
1213        return (m_lWarningLevel==1);
1214}
1215
1216const char *APL_EIDCard::getTokenSerialNumber(){
1217        if (!m_tokenSerial){
1218
1219                BEGIN_CAL_OPERATION(m_reader)
1220                m_tokenSerial = new string (m_reader->getCalReader()->GetSerialNr());
1221                END_CAL_OPERATION(m_reader)
1222        }
1223        return m_tokenSerial->c_str();
1224}
1225
1226const char *APL_EIDCard::getTokenLabel(){
1227        if (!m_tokenLabel){
1228
1229                BEGIN_CAL_OPERATION(m_reader)
1230                                        m_tokenLabel = new string (m_reader->getCalReader()->GetCardLabel());
1231                END_CAL_OPERATION(m_reader)
1232        }
1233        return m_tokenLabel->c_str();
1234}
1235
1236APLPublicKey *APL_EIDCard::getRootCAPubKey(){
1237
1238        if (!m_RootCAPubKey){
1239                CByteArray out;
1240
1241                BEGIN_CAL_OPERATION(m_reader)
1242                out = m_reader->getCalReader()->RootCAPubKey();
1243                END_CAL_OPERATION(m_reader)
1244
1245                CByteArray modulus = out.GetBytes(PTEIDNG_FIELD_ROOTCA_PK_POS_MODULUS, PTEIDNG_FIELD_ROOTCA_PK_LEN_MODULUS);
1246                CByteArray exponent = out.GetBytes(PTEIDNG_FIELD_ROOTCA_PK_POS_EXPONENT, PTEIDNG_FIELD_ROOTCA_PK_LEN_EXPONENT);
1247
1248                m_RootCAPubKey = new APLPublicKey(modulus,exponent);
1249        }
1250
1251        return m_RootCAPubKey;
1252}
1253
1254bool APL_EIDCard::isActive()
1255{
1256        return getFileTrace()->isActive();
1257}
1258
1259bool APL_EIDCard::Activate(const char *pinCode, CByteArray &BCDDate){
1260        bool out = false;
1261
1262        BEGIN_CAL_OPERATION(m_reader)
1263        out = m_reader->getCalReader()->Activate(pinCode,BCDDate);
1264        END_CAL_OPERATION(m_reader)
1265
1266        return out;
1267}
1268
1269void APL_EIDCard::doSODCheck(bool check){
1270        m_sodCheck = check;
1271
1272        if (m_FileAddress)
1273                m_FileAddress->doSODCheck(check);
1274        if (m_FileID)
1275                m_FileID->doSODCheck(check);
1276
1277        if (check){
1278                if (!m_FileSod){
1279                        m_FileSod = getFileSod();
1280                        m_FileSod->doSODCheck(check);
1281                }
1282        }
1283}
1284
1285
1286/*****************************************************************************************
1287---------------------------------------- APL_CCXML_Doc -------------------------------------------
1288*****************************************************************************************/
1289APL_CCXML_Doc::APL_CCXML_Doc(APL_EIDCard *card, APL_XmlUserRequestedInfo&  xmlUserRequestedInfo)
1290{
1291        m_card=card;
1292        m_xmlUserRequestedInfo = &xmlUserRequestedInfo;
1293}
1294
1295APL_CCXML_Doc::~APL_CCXML_Doc()
1296{
1297}
1298
1299bool APL_CCXML_Doc::isAllowed()
1300{
1301        try
1302        {
1303                if(m_card->getFileID()->getStatus(true)==CARDFILESTATUS_OK
1304                        //&& m_card->getFileAddress()->getStatus(true)==CARDFILESTATUS_OK
1305                        && m_card->getFileSod()->getStatus(true)==CARDFILESTATUS_OK)
1306                        return true;
1307        }
1308        catch(CMWException& e)
1309        {
1310                if (e.GetError() == EIDMW_ERR_NOT_ALLOW_BY_USER)
1311                        return false;
1312                else
1313                        throw;
1314        }
1315        return false;
1316}
1317
1318CByteArray APL_CCXML_Doc::getXML(bool bNoHeader)
1319{
1320        CByteArray xml;
1321        string *ts, *sn, *sa;
1322        string rootATTRS;
1323
1324        ts = m_xmlUserRequestedInfo->getTimeStamp();
1325        sn = m_xmlUserRequestedInfo->getServerName();
1326        sa = m_xmlUserRequestedInfo->getServerAddress();
1327
1328        if(!bNoHeader)
1329                xml+="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
1330        if (ts && sn && sa){
1331                xml+=XML_ROOT_S;
1332                XML_ATTRIBUTE(xml,XML_ROOT_ELEMENT_ATTR_TIMESTAMP,ts->c_str());
1333                XML_ATTRIBUTE(xml,XML_ROOT_ELEMENT_ATTR_SERVERNAME,sn->c_str());
1334                XML_ATTRIBUTE(xml,XML_ROOT_ELEMENT_ATTR_SERVERADDRESS,sa->c_str());
1335                xml+=XML_ROOT_E;
1336        } else
1337                xml+=XML_OPEN_TAG_NEWLINE(XML_ROOT_ELEMENT);
1338        xml+=m_card->getID().getXML(true,*m_xmlUserRequestedInfo);
1339        xml+=m_card->getAddr().getXML(true, *m_xmlUserRequestedInfo);
1340        xml+=m_card->getPersonalNotes().getXML(true, *m_xmlUserRequestedInfo);
1341        xml+=XML_CLOSE_TAG(XML_ROOT_ELEMENT);
1342
1343        return xml;
1344}
1345
1346CByteArray APL_CCXML_Doc::getCSV(){
1347        CByteArray cb;
1348
1349        return cb;
1350}
1351
1352CByteArray APL_CCXML_Doc::getTLV(){
1353        CByteArray cb;
1354
1355        return cb;
1356}
1357
1358
1359/*****************************************************************************************
1360-------------------------------- APL_XmlUserRequestedInfo ---------------------------------------
1361*****************************************************************************************/
1362APL_XmlUserRequestedInfo::APL_XmlUserRequestedInfo()
1363{
1364        xmlSet = new set<enum XMLUserData>;
1365        _serverName = NULL;
1366        _serverAddress = NULL;
1367        _timeStamp = NULL;
1368}
1369
1370APL_XmlUserRequestedInfo::APL_XmlUserRequestedInfo(const char *timeStamp, const char *serverName, const char *serverAddress)
1371{
1372        xmlSet = new set<enum XMLUserData>;
1373        _timeStamp = new string(timeStamp);
1374        _serverName = new string(serverName);
1375        _serverAddress = new string(serverAddress);
1376}
1377
1378APL_XmlUserRequestedInfo::~APL_XmlUserRequestedInfo()
1379{
1380        if (xmlSet)
1381                delete xmlSet;
1382        if (_timeStamp)
1383                delete _timeStamp;
1384        if (_serverAddress)
1385                delete _serverAddress;
1386        if (_serverName)
1387                delete _serverName;
1388}
1389
1390void APL_XmlUserRequestedInfo::add(XMLUserData xmlUData)
1391{
1392        xmlSet->insert(xmlUData);
1393}
1394
1395bool APL_XmlUserRequestedInfo::contains(XMLUserData xmlUData)
1396{
1397        return (xmlSet->find(xmlUData) != xmlSet->end());
1398}
1399
1400void APL_XmlUserRequestedInfo::remove(XMLUserData xmlUData)
1401{
1402        xmlSet->erase(xmlUData);
1403}
1404
1405bool APL_XmlUserRequestedInfo::checkAndRemove(XMLUserData xmlUData)
1406{
1407        bool contains;
1408
1409        contains = (xmlSet->find(xmlUData) != xmlSet->end());
1410        if (!contains)
1411                xmlSet->erase(xmlUData);
1412
1413        return contains;
1414}
1415
1416bool APL_XmlUserRequestedInfo::isEmpty(){
1417        return xmlSet->empty();
1418}
1419
1420std::string* APL_XmlUserRequestedInfo::getTimeStamp(){
1421        return _timeStamp;
1422}
1423
1424std::string* APL_XmlUserRequestedInfo::getServerName(){
1425        return _serverName;
1426}
1427
1428std::string* APL_XmlUserRequestedInfo::getServerAddress(){
1429        return _serverAddress;
1430}
1431
1432
1433/*****************************************************************************************
1434---------------------------------------- APL_DocEId ---------------------------------------------
1435*****************************************************************************************/
1436APL_DocEId::APL_DocEId(APL_EIDCard *card)
1437{
1438        m_card=card;
1439
1440        m_FirstName.clear();
1441
1442        _xmlUInfo = NULL;
1443}
1444
1445APL_DocEId::~APL_DocEId()
1446{
1447}
1448
1449bool APL_DocEId::isAllowed()
1450{
1451        try
1452        {
1453                if(m_card->getFileID()->getStatus(true)==CARDFILESTATUS_OK
1454                        && m_card->getFileAddress()->getStatus(true)==CARDFILESTATUS_OK)
1455                        return true;
1456        }
1457        catch(CMWException& e)
1458        {
1459                if (e.GetError() == EIDMW_ERR_NOT_ALLOW_BY_USER)
1460                        return false;
1461                else
1462                        throw;
1463        }
1464        return false;
1465}
1466
1467CByteArray APL_DocEId::getXML(bool bNoHeader, APL_XmlUserRequestedInfo &xmlUInfo){
1468
1469        CByteArray ca;
1470
1471        _xmlUInfo = &xmlUInfo;
1472        ca = getXML(bNoHeader);
1473        _xmlUInfo = NULL;
1474
1475        return ca;
1476}
1477
1478CByteArray APL_DocEId::getXML(bool bNoHeader)
1479{
1480        CByteArray xml;
1481        CByteArray basicInfo;
1482        CByteArray civilInfo;
1483        CByteArray idNum;
1484        CByteArray cardValues;
1485        CByteArray b64photo;
1486        CByteArray *photo;
1487        bool addBasicInfo = false;
1488        bool addIdNum = false;
1489        bool addCardValues = false;
1490        bool addCivilInfo = false;
1491        string temp;
1492
1493        // photo
1494        if (_xmlUInfo->contains(XML_PHOTO)){
1495                photo = getPhotoObj()->getPhotoPNG();
1496                m_cryptoFwk->b64Encode(*photo,b64photo);
1497                BUILD_XML_ELEMENT(xml, XML_PHOTO_ELEMENT, b64photo);
1498        }
1499
1500        // basicInformation
1501        if (_xmlUInfo->contains(XML_NAME)){
1502                string s;
1503                s+= getGivenName();
1504                s+=" ";
1505                s+=getSurname();
1506                BUILD_XML_ELEMENT(basicInfo, XML_NAME_ELEMENT, s.c_str());
1507                addBasicInfo = true;
1508        }
1509        if (_xmlUInfo->contains(XML_GIVEN_NAME)){
1510                BUILD_XML_ELEMENT(basicInfo,XML_GIVEN_NAME_ELEMENT,getGivenName());
1511                addBasicInfo = true;
1512        }
1513        if (_xmlUInfo->contains(XML_SURNAME)){
1514                BUILD_XML_ELEMENT(basicInfo,XML_SURNAME_ELEMENT,getSurname());
1515                addBasicInfo = true;
1516        }
1517        if (_xmlUInfo->contains(XML_NIC)){
1518                BUILD_XML_ELEMENT(basicInfo,XML_NIC_ELEMENT,getCivilianIdNumber());
1519                addBasicInfo = true;
1520        }
1521        if (_xmlUInfo->contains(XML_EXPIRY_DATE)){
1522                BUILD_XML_ELEMENT(basicInfo,XML_EXPIRY_DATE_ELEMENT, getValidityEndDate());
1523                addBasicInfo = true;
1524        }
1525        if (addBasicInfo){
1526                BUILD_XML_ELEMENT_NEWLINE(xml, XML_BASIC_INFO_ELEMENT, basicInfo);
1527        }
1528
1529        // CivilInformation
1530        if (_xmlUInfo->contains(XML_GENDER)){
1531                BUILD_XML_ELEMENT(civilInfo, XML_GENDER_ELEMENT, getGender());
1532                addCivilInfo = true;
1533        }
1534        if (_xmlUInfo->contains(XML_HEIGHT)){
1535                BUILD_XML_ELEMENT(civilInfo, XML_HEIGHT_ELEMENT, getHeight());
1536                addCivilInfo = true;
1537        }
1538        if (_xmlUInfo->contains(XML_NATIONALITY)){
1539                BUILD_XML_ELEMENT(civilInfo, XML_NATIONALITY_ELEMENT, getNationality());
1540                addCivilInfo = true;
1541        }
1542        if (_xmlUInfo->contains(XML_DATE_OF_BIRTH)){
1543                BUILD_XML_ELEMENT(civilInfo, XML_DATE_OF_BIRTH_ELEMENT, getDateOfBirth());
1544                addCivilInfo = true;
1545        }
1546        if (_xmlUInfo->contains(XML_GIVEN_NAME_FATHER)){
1547                BUILD_XML_ELEMENT(civilInfo, XML_GIVEN_NAME_FATHER_ELEMENT, getGivenNameFather());
1548                addCivilInfo = true;
1549        }
1550        if (_xmlUInfo->contains(XML_SURNAME_FATHER)){
1551                BUILD_XML_ELEMENT(civilInfo, XML_SURNAME_FATHER_ELEMENT, getSurnameFather());
1552                addCivilInfo = true;
1553        }
1554        if (_xmlUInfo->contains(XML_GIVEN_NAME_MOTHER)){
1555                BUILD_XML_ELEMENT(civilInfo, XML_GIVEN_NAME_MOTHER_ELEMENT, getGivenNameMother());
1556                addCivilInfo = true;
1557        }
1558        if (_xmlUInfo->contains(XML_SURNAME_MOTHER)){
1559                BUILD_XML_ELEMENT(civilInfo, XML_SURNAME_MOTHER_ELEMENT, getSurnameMother());
1560                addCivilInfo = true;
1561        }
1562        if (_xmlUInfo->contains(XML_ACCIDENTAL_INDICATIONS)){
1563                BUILD_XML_ELEMENT(civilInfo, XML_ACCIDENTAL_INDICATIONS_ELEMENT, getAccidentalIndications());
1564                addCivilInfo = true;
1565        }
1566        if (addCivilInfo){
1567                BUILD_XML_ELEMENT_NEWLINE(xml,XML_CIVIL_INFO_ELEMENT, civilInfo);
1568        }
1569
1570        // IdentificationNumbers
1571        if (_xmlUInfo->contains(XML_DOCUMENT_NO)){
1572                BUILD_XML_ELEMENT(idNum, XML_DOCUMENT_NO_ELEMENT, getDocumentNumber());
1573                addIdNum = true;
1574        }
1575        if (_xmlUInfo->contains(XML_TAX_NO)){
1576                BUILD_XML_ELEMENT(idNum, XML_TAX_NO_ELEMENT, getTaxNo());
1577                addIdNum = true;
1578        }
1579        if (_xmlUInfo->contains(XML_SOCIAL_SECURITY_NO)){
1580                BUILD_XML_ELEMENT(idNum, XML_SOCIAL_SECURITY_NO_ELEMENT, getTaxNo());
1581                addIdNum = true;
1582        }
1583        if (_xmlUInfo->contains(XML_HEALTH_NO)){
1584                BUILD_XML_ELEMENT(idNum, XML_HEALTH_NO_ELEMENT, getHealthNumber());
1585                addIdNum = true;
1586        }
1587        if (_xmlUInfo->contains(XML_MRZ1)){
1588                temp = getMRZ1();
1589                replace(temp,XML_ESCAPE_LT);
1590                BUILD_XML_ELEMENT(idNum, XML_MRZ1_ELEMENT, temp);
1591                addIdNum = true;
1592        }
1593
1594        if (_xmlUInfo->contains(XML_MRZ2)){
1595                temp = getMRZ2();
1596                replace(temp,XML_ESCAPE_LT);
1597                BUILD_XML_ELEMENT(idNum, XML_MRZ2_ELEMENT, temp);
1598                addIdNum = true;
1599        }
1600        if (_xmlUInfo->contains(XML_MRZ3)){
1601                temp = getMRZ3();
1602                replace(temp,XML_ESCAPE_LT);
1603                BUILD_XML_ELEMENT(idNum, XML_MRZ3_ELEMENT, temp);
1604                addIdNum = true;
1605        }
1606        if (addIdNum){
1607                BUILD_XML_ELEMENT_NEWLINE(xml,XML_IDENTIFICATION_NUMBERS_ELEMENT, idNum);
1608        }
1609
1610        // CardValues
1611        if (_xmlUInfo->contains(XML_CARD_VERSION)){
1612                BUILD_XML_ELEMENT(cardValues, XML_CARD_VERSION_ELEMENT, getDocumentVersion());
1613                addCardValues = true;
1614        }
1615        if (_xmlUInfo->contains(XML_CARD_NUMBER_PAN)){
1616                BUILD_XML_ELEMENT(cardValues, XML_CARD_NUMBER_PAN_ELEMENT, getDocumentPAN());
1617                addCardValues = true;
1618        }
1619        if (_xmlUInfo->contains(XML_ISSUING_DATE)){
1620                BUILD_XML_ELEMENT(cardValues, XML_ISSUING_DATE_ELEMENT, getValidityBeginDate());
1621                addCardValues = true;
1622        }
1623        if (_xmlUInfo->contains(XML_ISSUING_ENTITY)){
1624                BUILD_XML_ELEMENT(cardValues, XML_ISSUING_ENTITY_ELEMENT, getIssuingEntity());
1625                addCardValues = true;
1626        }
1627        if (_xmlUInfo->contains(XML_DOCUMENT_TYPE)){
1628                BUILD_XML_ELEMENT(cardValues, XML_DOCUMENT_TYPE_ELEMENT, getDocumentType());
1629                addCardValues = true;
1630        }
1631        if (_xmlUInfo->contains(XML_LOCAL_OF_REQUEST)){
1632                BUILD_XML_ELEMENT(cardValues, XML_LOCAL_OF_REQUEST_ELEMENT, getLocalofRequest());
1633                addCardValues = true;
1634        }
1635        if (_xmlUInfo->contains(XML_VERSION)){
1636                BUILD_XML_ELEMENT(cardValues, XML_VERSION_ELEMENT, "0");
1637                addCardValues = true;
1638        }
1639        if (addCardValues){
1640                BUILD_XML_ELEMENT_NEWLINE(xml, XML_CARD_VALUES_ELEMENT, cardValues);
1641        };
1642
1643        return xml;
1644}
1645
1646CByteArray APL_DocEId::getCSV()
1647{
1648/*
1649version;type;name;surname;gender;date_of_birth;location_of_birth;nobility;nationality;
1650        national_nr;special_organization;member_of_family;special_status;logical_nr;chip_nr;
1651        date_begin;date_end;issuing_municipality;version;street;zip;municipality;country;
1652        file_id;file_id_sign;file_address;file_address_sign;
1653*/
1654
1655        CByteArray csv;
1656
1657        csv+=getDocumentVersion();
1658        csv+=CSV_SEPARATOR;
1659        csv+=getDocumentType();
1660        csv+=CSV_SEPARATOR;
1661        csv+=getGivenName();
1662        csv+=CSV_SEPARATOR;
1663        csv+=getSurname();
1664        csv+=CSV_SEPARATOR;
1665        csv+=getGender();
1666        csv+=CSV_SEPARATOR;
1667        csv+=getDateOfBirth();
1668        csv+=CSV_SEPARATOR;
1669        csv+=getLocationOfBirth();
1670        csv+=CSV_SEPARATOR;
1671        csv+=getNationality();
1672        csv+=CSV_SEPARATOR;
1673        csv+=getCivilianIdNumber();
1674        csv+=CSV_SEPARATOR;
1675        csv+=getDuplicata();
1676        csv+=CSV_SEPARATOR;
1677        csv+=getSpecialOrganization();
1678        csv+=CSV_SEPARATOR;
1679        csv+=getMemberOfFamily();
1680        csv+=CSV_SEPARATOR;
1681        csv+=getSpecialStatus();
1682        csv+=CSV_SEPARATOR;
1683        csv+=getLogicalNumber();
1684        csv+=CSV_SEPARATOR;
1685        csv+=getDocumentPAN();
1686        csv+=CSV_SEPARATOR;
1687        csv+=getValidityBeginDate();
1688        csv+=CSV_SEPARATOR;
1689        csv+=getValidityEndDate();
1690        csv+=CSV_SEPARATOR;
1691
1692        // MARTINHO: fica aqui para n ficar esquecido também, provavelmente nem o CSV vai ser utilizado.
1693        csv+=getMRZ1();
1694        csv+=CSV_SEPARATOR;
1695        csv+=getMRZ2();
1696        csv+=CSV_SEPARATOR;
1697        csv+=getMRZ3();
1698        csv+=CSV_SEPARATOR;
1699
1700
1701        CByteArray baFileB64;
1702        if(m_cryptoFwk->b64Encode(m_card->getFileID()->getData(),baFileB64,false))
1703                csv+=baFileB64;
1704        csv+=CSV_SEPARATOR;
1705        if(m_cryptoFwk->b64Encode(m_card->getFileIDSign()->getData(),baFileB64,false))
1706                csv+=baFileB64;
1707        csv+=CSV_SEPARATOR;
1708
1709        return csv;
1710}
1711
1712CByteArray APL_DocEId::getTLV()
1713{
1714        CTLVBuffer tlv;
1715
1716        tlv.SetTagData(PTEID_TLV_TAG_FILE_ID,m_card->getFileID()->getData().GetBytes(),m_card->getFileID()->getData().Size());
1717        tlv.SetTagData(PTEID_TLV_TAG_FILE_IDSIGN,m_card->getFileIDSign()->getData().GetBytes(),m_card->getFileIDSign()->getData().Size());
1718
1719        unsigned long ulLen=tlv.GetLengthNeeded();
1720        unsigned char *pucData= new unsigned char[ulLen];
1721        tlv.Extract(pucData,ulLen);
1722        CByteArray ba(pucData,ulLen);
1723
1724        delete[] pucData;
1725
1726        return ba;
1727}
1728
1729const char *APL_DocEId::getValidation()
1730{
1731        return m_card->getFileTrace()->getValidation();
1732}
1733
1734const char *APL_DocEId::getDocumentVersion()
1735{
1736        return m_card->getFileID()->getDocumentVersion();
1737}
1738
1739const char *APL_DocEId::getDocumentType()
1740{
1741        return m_card->getFileID()->getDocumentType();
1742}
1743
1744const char *APL_DocEId::getCountry()
1745{
1746        return m_card->getFileID()->getCountry();
1747}
1748
1749const char *APL_DocEId::getGivenName()
1750{
1751        return m_card->getFileID()->getGivenName();
1752}
1753
1754const char *APL_DocEId::getSurname()
1755{
1756        return m_card->getFileID()->getSurname();
1757}
1758
1759const char *APL_DocEId::getGender()
1760{
1761        return m_card->getFileID()->getGender();
1762}
1763
1764const char *APL_DocEId::getDateOfBirth()
1765{
1766        return m_card->getFileID()->getDateOfBirth();
1767}
1768
1769const char *APL_DocEId::getLocationOfBirth()
1770{
1771        return m_card->getFileID()->getLocationOfBirth();
1772}
1773
1774const char *APL_DocEId::getNationality()
1775{
1776        return m_card->getFileID()->getNationality();
1777}
1778
1779const char *APL_DocEId::getDuplicata()
1780{
1781        return m_card->getFileID()->getDuplicata();
1782}
1783
1784const char *APL_DocEId::getSpecialOrganization()
1785{
1786        return m_card->getFileID()->getSpecialOrganization();
1787}
1788
1789const char *APL_DocEId::getMemberOfFamily()
1790{
1791        return m_card->getFileID()->getMemberOfFamily();
1792}
1793
1794const char *APL_DocEId::getLogicalNumber()
1795{
1796        return m_card->getFileID()->getLogicalNumber();
1797}
1798
1799const char *APL_DocEId::getDocumentPAN()
1800{
1801        return m_card->getFileID()->getDocumentPAN();
1802}
1803
1804const char *APL_DocEId::getValidityBeginDate()
1805{
1806        return m_card->getFileID()->getValidityBeginDate();
1807}
1808
1809const char *APL_DocEId::getValidityEndDate()
1810{
1811        return m_card->getFileID()->getValidityEndDate();
1812}
1813
1814const char *APL_DocEId::getSpecialStatus()
1815{
1816        return m_card->getFileID()->getSpecialStatus();
1817}
1818
1819const char *APL_DocEId::getHeight()
1820{
1821        return m_card->getFileID()->getHeight();
1822
1823}
1824
1825const char *APL_DocEId::getDocumentNumber()
1826{
1827        return m_card->getFileID()->getDocumentNumber();
1828}
1829
1830const char *APL_DocEId::getTaxNo()
1831{
1832        return m_card->getFileID()->getTaxNo();
1833}
1834
1835const char *APL_DocEId::getSocialSecurityNumber()
1836{
1837        return m_card->getFileID()->getSocialSecurityNumber();
1838}
1839
1840const char *APL_DocEId::getHealthNumber()
1841{
1842        return m_card->getFileID()->getHealthNumber();
1843}
1844
1845const char *APL_DocEId::getIssuingEntity()
1846{
1847        return m_card->getFileID()->getIssuingEntity();
1848}
1849
1850const char *APL_DocEId::getLocalofRequest()
1851{
1852        return m_card->getFileID()->getLocalofRequest();
1853}
1854
1855const char *APL_DocEId::getGivenNameFather()
1856{
1857        return m_card->getFileID()->getGivenNameFather();
1858}
1859
1860const char *APL_DocEId::getSurnameFather()
1861{
1862        return m_card->getFileID()->getSurnameFather();
1863}
1864
1865const char *APL_DocEId::getGivenNameMother()
1866{
1867        return m_card->getFileID()->getGivenNameMother();
1868}
1869
1870const char *APL_DocEId::getSurnameMother()
1871{
1872        return m_card->getFileID()->getSurnameMother();
1873}
1874
1875const char *APL_DocEId::getParents()
1876{
1877        return m_card->getFileID()->getParents();
1878}
1879
1880PhotoPteid *APL_DocEId::getPhotoObj()
1881{
1882        return m_card->getFileID()->getPhotoObj();
1883}
1884
1885APLPublicKey *APL_DocEId::getCardAuthKeyObj(){
1886        return m_card->getFileID()->getCardAuthKeyObj();
1887}
1888
1889const char *APL_DocEId::getMRZ1(){
1890        return m_card->getFileID()->getMRZ1();
1891}
1892
1893const char *APL_DocEId::getMRZ2(){
1894        return m_card->getFileID()->getMRZ2();
1895}
1896
1897const char *APL_DocEId::getMRZ3(){
1898        return m_card->getFileID()->getMRZ3();
1899}
1900
1901const char *APL_DocEId::getAccidentalIndications(){
1902        return m_card->getFileID()->getAccidentalIndications();
1903}
1904
1905const char *APL_DocEId::getCivilianIdNumber(){
1906        return m_card->getFileID()->getCivilianIdNumber();
1907}
1908
1909/*****************************************************************************************
1910----------------------------------- APL_PersonalNotesEid ----------------------------------------
1911*****************************************************************************************/
1912APL_PersonalNotesEId::APL_PersonalNotesEId(APL_EIDCard *card)
1913{
1914        m_card=card;
1915}
1916
1917APL_PersonalNotesEId::~APL_PersonalNotesEId()
1918{
1919}
1920
1921bool APL_PersonalNotesEId::isAllowed()
1922{
1923        try
1924        {
1925                if(m_card->getFilePersoData()->getStatus(true)==CARDFILESTATUS_OK)
1926                        return true;
1927        }
1928        catch(CMWException& e)
1929        {
1930                if (e.GetError() == EIDMW_ERR_NOT_ALLOW_BY_USER)
1931                        return false;
1932                else
1933                        throw;
1934        }
1935        return false;
1936}
1937
1938CByteArray APL_PersonalNotesEId::getXML(bool bNoHeader, APL_XmlUserRequestedInfo &xmlUInfo){
1939        CByteArray ca;
1940
1941        _xmlUInfo = &xmlUInfo;
1942        ca = getXML(bNoHeader);
1943        _xmlUInfo = NULL;
1944
1945        return ca;
1946}
1947
1948CByteArray APL_PersonalNotesEId::getXML(bool bNoHeader)
1949{
1950        CByteArray xml;
1951        string str;
1952
1953        if (_xmlUInfo->contains(XML_PERSONAL_NOTES)){
1954                str = getPersonalNotes();
1955                replace(str,XML_ESCAPE_AMP);
1956                replace(str,XML_ESCAPE_APOS);
1957                replace(str,XML_ESCAPE_GT);
1958                replace(str,XML_ESCAPE_LT);
1959                replace(str,XML_ESCAPE_QUOTE);
1960
1961                BUILD_XML_ELEMENT(xml, XML_PERSONAL_NOTES_ELEMENT, str.c_str());
1962        }
1963
1964        return xml;
1965}
1966
1967CByteArray APL_PersonalNotesEId::getCSV()
1968{
1969        CByteArray csv;
1970
1971        return csv;
1972}
1973
1974CByteArray APL_PersonalNotesEId::getTLV()
1975{
1976        CTLVBuffer tlv;
1977        CByteArray ba;
1978
1979        return ba;
1980}
1981
1982const char *APL_PersonalNotesEId::getPersonalNotes(bool forceMap)
1983{
1984        return m_card->getFilePersoData()->getPersoData(forceMap);
1985}
1986
1987/*****************************************************************************************
1988---------------------------------------- APL_AddrEId ---------------------------------------------
1989*****************************************************************************************/
1990APL_AddrEId::APL_AddrEId(APL_EIDCard *card)
1991{
1992        m_card=card;
1993}
1994
1995APL_AddrEId::~APL_AddrEId()
1996{
1997}
1998
1999bool APL_AddrEId::isAllowed()
2000{
2001        try
2002        {
2003                if(m_card->getFileAddress()->getStatus(true)==CARDFILESTATUS_OK)
2004                        return true;
2005        }
2006        catch(CMWException& e)
2007        {
2008                if (e.GetError() == EIDMW_ERR_NOT_ALLOW_BY_USER)
2009                        return false;
2010                else
2011                        throw;
2012        }
2013        return false;
2014}
2015
2016CByteArray APL_AddrEId::getXML(bool bNoHeader, APL_XmlUserRequestedInfo &xmlUInfo){
2017        CByteArray ca;
2018
2019        _xmlUInfo = &xmlUInfo;
2020        ca = getXML(bNoHeader);
2021        _xmlUInfo = NULL;
2022
2023        return ca;
2024}
2025
2026CByteArray APL_AddrEId::getXML(bool bNoHeader)
2027{
2028        CByteArray xml;
2029        CByteArray address;
2030        bool addAddress = false;
2031
2032        /*      if (isNationalAddress()){ //specification for xml does not include foreign addresses, this will stay here if specification changes */
2033        if (_xmlUInfo->contains(XML_DISTRICT)){
2034                BUILD_XML_ELEMENT(address, XML_DISTRICT_ELEMENT, getDistrict());
2035                addAddress = true;
2036        }
2037        if (_xmlUInfo->contains(XML_MUNICIPALITY)){
2038                BUILD_XML_ELEMENT(address, XML_MUNICIPALITY_ELEMENT, getMunicipality());
2039                addAddress = true;
2040        }
2041        if (_xmlUInfo->contains(XML_CIVIL_PARISH)){
2042                BUILD_XML_ELEMENT(address, XML_CIVIL_PARISH_ELEMENT, getCivilParish());
2043                addAddress = true;
2044        }
2045        if (_xmlUInfo->contains(XML_ABBR_STREET_TYPE)){
2046                BUILD_XML_ELEMENT(address, XML_ABBR_STREET_TYPE_ELEMENT, getAbbrStreetType());
2047                addAddress = true;
2048        }
2049        if (_xmlUInfo->contains(XML_STREET_TYPE)){
2050                BUILD_XML_ELEMENT(address, XML_STREET_TYPE_ELEMENT, getStreetType());
2051                addAddress = true;
2052        }
2053        if (_xmlUInfo->contains(XML_STREET_NAME)){
2054                BUILD_XML_ELEMENT(address, XML_STREET_NAME_ELEMENT, getStreetName());
2055                addAddress = true;
2056        }
2057        if (_xmlUInfo->contains(XML_ABBR_BUILDING_TYPE)){
2058                BUILD_XML_ELEMENT(address, XML_ABBR_BUILDING_TYPE_ELEMENT, getAbbrBuildingType());
2059                addAddress = true;
2060        }
2061        if (_xmlUInfo->contains(XML_BUILDING_TYPE)){
2062                BUILD_XML_ELEMENT(address, XML_BUILDING_TYPE_ELEMENT, getBuildingType());
2063                addAddress = true;
2064        }
2065        if (_xmlUInfo->contains(XML_DOOR_NO)){
2066                BUILD_XML_ELEMENT(address, XML_DOOR_NO_ELEMENT, getDoorNo());
2067                addAddress = true;
2068        }
2069        if (_xmlUInfo->contains(XML_FLOOR)){
2070                BUILD_XML_ELEMENT(address, XML_FLOOR_ELEMENT, getFloor());
2071                addAddress = true;
2072        }
2073        if (_xmlUInfo->contains(XML_SIDE)){
2074                BUILD_XML_ELEMENT(address, XML_SIDE_ELEMENT, getSide());
2075                addAddress = true;
2076        }
2077        if (_xmlUInfo->contains(XML_PLACE)){
2078                BUILD_XML_ELEMENT(address, XML_PLACE_ELEMENT, getPlace());
2079                addAddress = true;
2080        }
2081        if (_xmlUInfo->contains(XML_LOCALITY)){
2082                BUILD_XML_ELEMENT(address, XML_LOCALITY_ELEMENT, getLocality());
2083                addAddress = true;
2084        }
2085        if (_xmlUInfo->contains(XML_ZIP4)){
2086                BUILD_XML_ELEMENT(address, XML_ZIP4_ELEMENT, getZip4());
2087                addAddress = true;
2088        }
2089        if (_xmlUInfo->contains(XML_ZIP3)){
2090                BUILD_XML_ELEMENT(address, XML_ZIP3_ELEMENT, getZip3());
2091                addAddress = true;
2092        }
2093        if (_xmlUInfo->contains(XML_POSTAL_LOCALITY)){
2094                BUILD_XML_ELEMENT(address, XML_POSTAL_LOCALITY_ELEMENT, getPostalLocality());
2095                addAddress = true;
2096        }
2097        if (addAddress){
2098                BUILD_XML_ELEMENT_NEWLINE(xml,XML_ADDRESS_ELEMENT, address);
2099        }
2100
2101        /* } else { //specification for xml does not include foreign addresses, this will stay here if specification changes
2102                if (_xmlUInfo->contains(XML_FOREIGN_COUNTRY)){
2103                        BUILD_XML_ELEMENT(address, XML_FOREIGN_COUNTRY_ELEMENT, getForeignCountry());
2104                        addAddress = true;
2105                }
2106                if (_xmlUInfo->contains(XML_FOREIGN_ADDRESS)){
2107                        BUILD_XML_ELEMENT(address, XML_FOREIGN_ADDRESS_ELEMENT, getForeignAddress());
2108                        addAddress = true;
2109                }
2110                if (_xmlUInfo->contains(XML_FOREIGN_CITY)){
2111                        BUILD_XML_ELEMENT(address, XML_FOREIGN_CITY_ELEMENT, getForeignCity());
2112                        addAddress = true;
2113                }
2114                if (_xmlUInfo->contains(XML_FOREIGN_REGION)){
2115                        BUILD_XML_ELEMENT(address, XML_FOREIGN_REGION_ELEMENT, getForeignRegion());
2116                        addAddress = true;
2117                }
2118                if (_xmlUInfo->contains(XML_FOREIGN_LOCALITY)){
2119                        BUILD_XML_ELEMENT(address, XML_FOREIGN_LOCALITY_ELEMENT, getForeignLocality());
2120                        addAddress = true;
2121                }
2122                if (_xmlUInfo->contains(XML_FOREIGN_POSTAL_CODE)){
2123                        BUILD_XML_ELEMENT(address, XML_FOREIGN_POSTAL_CODE_ELEMENT, getForeignPostalCode());
2124                        addAddress = true;
2125                }
2126        }
2127         */
2128        return xml;
2129}
2130
2131CByteArray APL_AddrEId::getCSV()
2132{
2133        CByteArray csv;
2134
2135        /*
2136        CByteArray baFileB64;
2137        if(m_cryptoFwk->b64Encode(m_card->getFileAddress()->getData(),baFileB64,false))
2138                csv+=baFileB64;
2139        */
2140        return csv;
2141}
2142
2143CByteArray APL_AddrEId::getTLV()
2144{
2145        CTLVBuffer tlv;
2146
2147        tlv.SetTagData(PTEID_TLV_TAG_FILE_ADDR,m_card->getFileAddress()->getData().GetBytes(),m_card->getFileAddress()->getData().Size());
2148        tlv.SetTagData(PTEID_TLV_TAG_FILE_ADDRSIGN,m_card->getFileAddressSign()->getData().GetBytes(),m_card->getFileAddressSign()->getData().Size());
2149
2150        unsigned long ulLen=tlv.GetLengthNeeded();
2151        unsigned char *pucData= new unsigned char[ulLen];
2152        tlv.Extract(pucData,ulLen);
2153        CByteArray ba(pucData,ulLen);
2154
2155        delete[] pucData;
2156
2157        return ba;
2158}
2159
2160const char *APL_AddrEId::getMunicipality()
2161{
2162        return m_card->getFileAddress()->getMunicipality();
2163}
2164
2165const char *APL_AddrEId::getMunicipalityCode()
2166{
2167        return m_card->getFileAddress()->getMunicipalityCode();
2168}
2169
2170const char *APL_AddrEId::getPlace()
2171{
2172        return m_card->getFileAddress()->getPlace();
2173}
2174
2175const char *APL_AddrEId::getCivilParish()
2176{
2177        return m_card->getFileAddress()->getCivilParish();
2178}
2179
2180const char *APL_AddrEId::getCivilParishCode()
2181{
2182        return m_card->getFileAddress()->getCivilParishCode();
2183}
2184
2185const char *APL_AddrEId::getStreetName()
2186{
2187        return m_card->getFileAddress()->getStreetName();
2188}
2189
2190const char *APL_AddrEId::getAbbrStreetType()
2191{
2192        return m_card->getFileAddress()->getAbbrStreetType();
2193}
2194
2195const char *APL_AddrEId::getStreetType()
2196{
2197        return m_card->getFileAddress()->getStreetType();
2198}
2199
2200const char *APL_AddrEId::getAbbrBuildingType()
2201{
2202        return m_card->getFileAddress()->getAbbrBuildingType();
2203}
2204
2205const char *APL_AddrEId::getBuildingType()
2206{
2207        return m_card->getFileAddress()->getBuildingType();
2208}
2209
2210const char *APL_AddrEId::getDoorNo()
2211{
2212        return m_card->getFileAddress()->getDoorNo();
2213}
2214
2215const char *APL_AddrEId::getFloor()
2216{
2217        return m_card->getFileAddress()->getFloor();
2218}
2219
2220const char *APL_AddrEId::getSide()
2221{
2222        return m_card->getFileAddress()->getSide();
2223}
2224
2225const char *APL_AddrEId::getLocality()
2226{
2227        return m_card->getFileAddress()->getLocality();
2228}
2229
2230const char *APL_AddrEId::getZip4()
2231{
2232        return m_card->getFileAddress()->getZip4();
2233}
2234
2235const char *APL_AddrEId::getZip3()
2236{
2237        return m_card->getFileAddress()->getZip3();
2238}
2239
2240const char *APL_AddrEId::getPostalLocality()
2241{
2242        return m_card->getFileAddress()->getPostalLocality();
2243}
2244
2245const char *APL_AddrEId::getGeneratedAddressCode()
2246{
2247        return m_card->getFileAddress()->getGeneratedAddressCode();
2248}
2249
2250const char *APL_AddrEId::getDistrict()
2251{
2252        return m_card->getFileAddress()->getDistrict();
2253}
2254
2255const char *APL_AddrEId::getDistrictCode()
2256{
2257        return m_card->getFileAddress()->getDistrictCode();
2258}
2259
2260const char *APL_AddrEId::getCountryCode()
2261{
2262        return m_card->getFileAddress()->getCountryCode();
2263}
2264
2265bool APL_AddrEId::isNationalAddress()
2266{
2267        return m_card->getFileAddress()->isNationalAddress();
2268}
2269
2270const char *APL_AddrEId::getForeignCountry()
2271{
2272        return m_card->getFileAddress()->getForeignCountry();
2273}
2274
2275const char *APL_AddrEId::getForeignAddress()
2276{
2277        return m_card->getFileAddress()->getForeignAddress();
2278}
2279
2280const char *APL_AddrEId::getForeignCity()
2281{
2282        return m_card->getFileAddress()->getForeignCity();
2283}
2284
2285const char *APL_AddrEId::getForeignRegion()
2286{
2287        return m_card->getFileAddress()->getForeignRegion();
2288}
2289
2290const char *APL_AddrEId::getForeignLocality()
2291{
2292        return m_card->getFileAddress()->getForeignLocality();
2293}
2294
2295const char *APL_AddrEId::getForeignPostalCode()
2296{
2297        return m_card->getFileAddress()->getForeignPostalCode();
2298}
2299
2300/*****************************************************************************************
2301---------------------------------------- APL_SodEid -----------------------------------------
2302*****************************************************************************************/
2303APL_SodEid::APL_SodEid(APL_EIDCard *card)
2304{       
2305        m_card=card;
2306}
2307
2308APL_SodEid::~APL_SodEid()
2309{
2310}
2311
2312bool APL_SodEid::isAllowed()
2313{
2314        try
2315        {
2316                if(m_card->getFileSod()->getStatus(true)==CARDFILESTATUS_OK
2317                        && m_card->getFileID()->getStatus(true)==CARDFILESTATUS_OK)
2318                        return true;
2319        }
2320        catch(CMWException& e)
2321        {
2322                if (e.GetError() == EIDMW_ERR_NOT_ALLOW_BY_USER)
2323                        return false;
2324                else
2325                        throw;
2326        }
2327        return false;
2328}
2329
2330CByteArray APL_SodEid::getXML(bool bNoHeader)
2331{
2332/*
2333        <biometric>
2334                <picture type=ï¿œjpgï¿œ>
2335                        <data encoding=ï¿œbase64ï¿œ></data>
2336                        <hash encoding=ï¿œbase64ï¿œ method=ï¿œmd5ï¿œ></hash>
2337                </picture>
2338        </biometric>
2339*/
2340
2341        CByteArray xml;
2342        CByteArray baB64;
2343
2344        if(!bNoHeader)
2345                xml+="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
2346
2347        xml+="<biometric>\n";
2348        xml+="  <picture type=\"jpg\">\n";
2349        xml+="          <data encoding=\"base64\">\n";
2350        if(m_cryptoFwk->b64Encode(getData(),baB64))
2351                xml+=           baB64;
2352        xml+="          </data>\n";
2353        xml+="          <hash encoding=\"base64\" method=\"md5\">\n";
2354        /*if(m_cryptoFwk->b64Encode(getHash(),baB64))
2355                xml+=           baB64;*/
2356        xml+="          </hash>\n";
2357        xml+="  </picture>\n";
2358        xml+="</biometric>\n";
2359
2360        return xml;
2361}
2362
2363CByteArray APL_SodEid::getCSV()
2364{
2365/*
2366data;hash;
2367*/
2368
2369        CByteArray csv;
2370        CByteArray baB64;
2371
2372        if(m_cryptoFwk->b64Encode(getData(),baB64,false))
2373                csv+=           baB64;
2374        csv+=CSV_SEPARATOR;
2375        /*if(m_cryptoFwk->b64Encode(getHash(),baB64,false))
2376                csv+=           baB64;*/
2377        csv+=CSV_SEPARATOR;
2378
2379        return csv;
2380}
2381
2382CByteArray APL_SodEid::getTLV()
2383{
2384        CTLVBuffer tlv;
2385
2386        tlv.SetTagData(PTEID_TLV_TAG_FILE_SOD,m_card->getFileSod()->getData().GetBytes(),m_card->getFileSod()->getData().Size());
2387
2388        unsigned long ulLen=tlv.GetLengthNeeded();
2389        unsigned char *pucData= new unsigned char[ulLen];
2390        tlv.Extract(pucData,ulLen);
2391        CByteArray ba(pucData,ulLen);
2392
2393        delete[] pucData;
2394
2395        return ba;
2396}
2397
2398const CByteArray& APL_SodEid::getData()
2399{
2400        const CByteArray &cb = m_card->getFileSod()->getData();
2401
2402        m_card->getFileSod()->getAddressHash();
2403        APL_Config conf_dir(CConfig::EIDMW_CONFIG_PARAM_GENERAL_CERTS_DIR);
2404
2405        return cb;
2406}
2407
2408/*****************************************************************************************
2409---------------------------------------- APL_DocVersionInfo --------------------------------------------
2410*****************************************************************************************/
2411APL_DocVersionInfo::APL_DocVersionInfo(APL_EIDCard *card)
2412{
2413        m_card=card;
2414}
2415
2416APL_DocVersionInfo::~APL_DocVersionInfo()
2417{
2418}
2419
2420bool APL_DocVersionInfo::isAllowed()
2421{
2422        return true;
2423}
2424
2425CByteArray APL_DocVersionInfo::getXML(bool bNoHeader)
2426{
2427/*
2428        <scard>
2429                <serial_nr></serial_nr>
2430                <component_code></component_code>
2431                <os_nr></os_nr>
2432                <os_version></os_version>
2433                <softmask_nr></softmask_nr>
2434                <softmask_version></softmask_version>
2435                <applet_version></applet_version>
2436                <global_os_version></global_os_version>
2437                <applet_interface_version></applet_interface_version>
2438                <PKCS1_support></PKCS1_support>
2439                <key_exchange_version></key_exchange_version>
2440                <application_lifecycle></application_lifecycle>
2441                <graph_perso></graph_perso>
2442                <elec_perso></elec_perso>
2443                <elec_perso_interface></elec_perso_interface>
2444                <files>
2445                        <file_datainfo encoding="base64">
2446                        </file_datainfo>
2447                        <file_tokeninfo encoding="base64">
2448                        </file_tokeninfo>                       
2449                </files>
2450        </scard>
2451*/
2452
2453        CByteArray xml;
2454        CByteArray b64;
2455
2456        if(!bNoHeader)
2457                xml+="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
2458
2459        xml+="<scard>\n";
2460        xml+="  <serial_nr>";
2461        xml+=           getSerialNumber();
2462        xml+=   "</serial_nr>\n";
2463        xml+="  <component_code>";
2464        xml+=           getComponentCode();
2465        xml+=   "</component_code>\n";
2466        xml+="  <os_nr>";
2467        xml+=           getOsNumber();
2468        xml+=   "</os_nr>\n";
2469        xml+="  <os_version>";
2470        xml+=           getOsVersion();
2471        xml+=   "</os_version>\n";
2472        xml+="  <softmask_nr>";
2473        xml+=           getSoftmaskNumber();
2474        xml+=   "</softmask_nr>\n";
2475        xml+="  <softmask_version>";
2476        xml+=           getSoftmaskVersion();
2477        xml+=   "</softmask_version>\n";
2478        xml+="  <applet_version>";
2479        xml+=           getAppletVersion();
2480        xml+=   "</applet_version>\n";
2481        xml+="  <global_os_version>";
2482        xml+=           getGlobalOsVersion();
2483        xml+=   "</global_os_version>\n";
2484        xml+="  <applet_interface_version>";
2485        xml+=           getAppletInterfaceVersion();
2486        xml+=   "</applet_interface_version>\n";
2487        xml+="  <PKCS1_support>";
2488        xml+=           getPKCS1Support();
2489        xml+=   "</PKCS1_support>\n";
2490        xml+="  <key_exchange_version>";
2491        xml+=           getKeyExchangeVersion();
2492        xml+=   "</key_exchange_version>\n";
2493        xml+="  <application_lifecycle>";
2494        xml+=           getAppletLifeCicle();
2495        xml+=   "</application_lifecycle>\n";
2496        xml+="  <graph_perso>";
2497        xml+=           getGraphicalPersonalisation();
2498        xml+=   "</graph_perso>\n";
2499        xml+="  <elec_perso>";
2500        xml+=           getElectricalPersonalisation();
2501        xml+=   "</elec_perso>\n";
2502        xml+="  <elec_perso_interface>";
2503        xml+=           getElectricalPersonalisationInterface();
2504        xml+=   "</elec_perso_interface>\n";
2505        xml+="  <files>\n";
2506        xml+="          <file_datainfo encoding=\"base64\">\n";
2507        if(m_cryptoFwk->b64Encode(m_card->getFileInfo()->getData(),b64))
2508                xml+=b64;
2509        xml+="          </file_datainfo>\n";
2510        xml+="          <file_tokeninfo encoding=\"base64\">\n";
2511        if(m_cryptoFwk->b64Encode(m_card->getFileTokenInfo()->getData(),b64))
2512                xml+=b64;
2513        xml+="          </file_tokeninfo>\n";
2514        xml+="  </files>\n";
2515        xml+="</scard>\n";
2516
2517        return xml;
2518}
2519
2520CByteArray APL_DocVersionInfo::getCSV()
2521{
2522/*
2523serial_nr;component_code;os_nr;os_version;softmask_nr;softmask_version;applet_version;
2524        global_os_version;applet_interface_version;PKCS1_support;key_exchange_version;
2525        application_lifecycle;graph_perso;elec_perso;elec_perso_interface;
2526*/
2527
2528        CByteArray csv;
2529        CByteArray b64;
2530
2531        csv+=getSerialNumber();
2532        csv+=CSV_SEPARATOR;
2533        csv+=getComponentCode();
2534        csv+=CSV_SEPARATOR;
2535        csv+=getOsNumber();
2536        csv+=CSV_SEPARATOR;
2537        csv+=getOsVersion();
2538        csv+=CSV_SEPARATOR;
2539        csv+=getSoftmaskNumber();
2540        csv+=CSV_SEPARATOR;
2541        csv+=getSoftmaskVersion();
2542        csv+=CSV_SEPARATOR;
2543        csv+=getAppletVersion();
2544        csv+=CSV_SEPARATOR;
2545        csv+=getGlobalOsVersion();
2546        csv+=CSV_SEPARATOR;
2547        csv+=getAppletInterfaceVersion();
2548        csv+=CSV_SEPARATOR;
2549        csv+=getPKCS1Support();
2550        csv+=CSV_SEPARATOR;
2551        csv+=getKeyExchangeVersion();
2552        csv+=CSV_SEPARATOR;
2553        csv+=getAppletLifeCicle();
2554        csv+=CSV_SEPARATOR;
2555        csv+=getGraphicalPersonalisation();
2556        csv+=CSV_SEPARATOR;
2557        csv+=getElectricalPersonalisation();
2558        csv+=CSV_SEPARATOR;
2559        csv+=getElectricalPersonalisationInterface();
2560        csv+=CSV_SEPARATOR;
2561
2562        if(m_cryptoFwk->b64Encode(m_card->getFileInfo()->getData(),b64,false))
2563                csv+=b64;
2564        csv+=CSV_SEPARATOR;
2565
2566        if(m_cryptoFwk->b64Encode(m_card->getFileTokenInfo()->getData(),b64,false))
2567                csv+=b64;
2568        csv+=CSV_SEPARATOR;
2569
2570        return csv;
2571}
2572
2573CByteArray APL_DocVersionInfo::getTLV()
2574{
2575        CTLVBuffer tlv;
2576
2577        tlv.SetTagData(PTEID_TLV_TAG_FILE_CARDINFO,m_card->getFileInfo()->getData().GetBytes(),m_card->getFileInfo()->getData().Size());
2578        tlv.SetTagData(PTEID_TLV_TAG_FILE_TOKENINFO,m_card->getFileTokenInfo()->getData().GetBytes(),m_card->getFileTokenInfo()->getData().Size());
2579
2580        unsigned long ulLen=tlv.GetLengthNeeded();
2581        unsigned char *pucData= new unsigned char[ulLen];
2582        tlv.Extract(pucData,ulLen);
2583        CByteArray ba(pucData,ulLen);
2584
2585        delete[] pucData;
2586
2587        return ba;
2588}
2589
2590const char *APL_DocVersionInfo::getSerialNumber()
2591{
2592        return m_card->getTokenSerialNumber();
2593}
2594
2595const char * APL_DocVersionInfo::getTokenLabel(){
2596        return m_card->getTokenLabel();
2597}
2598
2599const char *APL_DocVersionInfo::getComponentCode()
2600{
2601        return m_card->getFileInfo()->getComponentCode();
2602}
2603
2604const char *APL_DocVersionInfo::getOsNumber()
2605{
2606        return m_card->getFileInfo()->getOsNumber();
2607}
2608
2609const char *APL_DocVersionInfo::getOsVersion()
2610{
2611        return m_card->getFileInfo()->getOsVersion();
2612}
2613
2614const char *APL_DocVersionInfo::getSoftmaskNumber()
2615{
2616        return m_card->getFileInfo()->getSoftmaskNumber();
2617}
2618
2619const char *APL_DocVersionInfo::getSoftmaskVersion()
2620{
2621        return m_card->getFileInfo()->getSoftmaskVersion();
2622}
2623
2624const char *APL_DocVersionInfo::getAppletVersion()
2625{
2626        return m_card->getFileInfo()->getAppletVersion();
2627}
2628
2629const char *APL_DocVersionInfo::getGlobalOsVersion()
2630{
2631        return m_card->getFileInfo()->getGlobalOsVersion();
2632}
2633
2634const char *APL_DocVersionInfo::getAppletInterfaceVersion()
2635{
2636        return m_card->getFileInfo()->getAppletInterfaceVersion();
2637}
2638
2639const char *APL_DocVersionInfo::getPKCS1Support()
2640{
2641        return m_card->getFileInfo()->getPKCS1Support();
2642}
2643
2644const char *APL_DocVersionInfo::getKeyExchangeVersion()
2645{
2646        return m_card->getFileInfo()->getKeyExchangeVersion();
2647}
2648
2649const char *APL_DocVersionInfo::getAppletLifeCicle()
2650{
2651        return m_card->getFileInfo()->getAppletLifeCicle();
2652}
2653
2654const char *APL_DocVersionInfo::getGraphicalPersonalisation()
2655{
2656        return m_card->getFileTokenInfo()->getGraphicalPersonalisation();
2657}
2658
2659const char *APL_DocVersionInfo::getElectricalPersonalisation()
2660{
2661        return m_card->getFileTokenInfo()->getElectricalPersonalisation();
2662}
2663
2664const char *APL_DocVersionInfo::getElectricalPersonalisationInterface()
2665{
2666        return m_card->getFileTokenInfo()->getElectricalPersonalisationInterface();
2667}
2668
2669const CByteArray &APL_DocVersionInfo::getSignature()
2670{
2671        return m_card->getCardInfoSignature();
2672}
2673}
Note: See TracBrowser for help on using the browser.