italia / cie-nis-python-sdk

SDK for reading the NIS code from an Italian Electronic Identity Card (CIE) using Python
BSD 3-Clause "New" or "Revised" License
30 stars 10 forks source link

Exception => extractData: Invalid DG 30 #11

Open amusarra opened 3 years ago

amusarra commented 3 years ago

Ciao. Sto provando il vostro progetto, purtroppo ho riscontrato l'eccezione in oggetto di cui riporto lo stack trace. Sapreste darmi indicazioni in merito?

Il mio ambiente di esecuzione è il seguente:

  1. Sistema Operativo Fedora 34 (5.13.4-200.fc34.x86_64)
  2. Python 3.9.6
  3. pcsc-lite-devel-1.9.1-1.fc34.x86_64
  4. CIE Gemalto (BIT4ID miniLector AIR NFC v3)
Waiting for the CIE...
Connected!
Traceback (most recent call last):
  File "/uwfs03/progetti/developers-italia/sources/cie-nis-python-sdk/./main.py", line 46, in <module>
    main()
  File "/uwfs03/progetti/developers-italia/sources/cie-nis-python-sdk/./main.py", line 26, in main
    data = interface.extractData()
  File "/uwfs03/progetti/developers-italia/sources/cie-nis-python-sdk/pkg/lib/CIEInterface.py", line 418, in extractData
    raise Exception('extractData: Invalid DG 30')
Exception: extractData: Invalid DG 30

invalid_dg_30

Grazie.

amusarra commented 3 years ago

Ciao @danielabrozzoni , @astagi e @afilini riuscireste a dare un feedback su questo problema da me riscontrato? Immagino che il problema si di carattere generale. Grazie.

danielabrozzoni commented 3 years ago

Non guardo il progetto da anni ormai quindi non ho ben idea di cosa stia succedendo. Il problema risiede in queste due righe: https://github.com/italia/cie-nis-python-sdk/blob/master/pkg/lib/CIEInterface.py#L417-L418, un qualche controllo che i dati siano validi. Il mio ignorante consiglio è di commentare le due righe e vedere che succede...

amusarra commented 3 years ago

Grazie @danielabrozzoni Chiedo maggiori info a @afilini che dal blame vedo che il commit dell'eccezione è proprio il suo. Sapresti dirmi esattamente il significato dell'eccezione?

afilini commented 3 years ago

Credo che in quel caso si stia facendo un check di versione: la sezione 4.6.1 di questo documento https://www.icao.int/publications/Documents/9303_p10_cons_en.pdf lo descrive.

A pagina 99 dello stesso documento vengono mostrati alcuni esempi di risposte in esadecimale, e le costanti che mostrano loro sono identiche a quelle controllate dal codice.

Quindi direi che il codice python controlla che la carta usi la versione LDS 1.7 e Unicode 4.0.0. Può essere che in alcune carte più recenti questo sia stato cambiato, e quindi quel controllo fallisce.

Se la versione LDS è corretta ma cambia solo quella Unicode forse puoi completamente saltare il check, immagino che Python possa gestire versioni Unicode recenti correttamente. Dovresti stampare i valori di risposta e vedere quale dei due non corrisponde.

amusarra commented 3 years ago

Ti ringrazio per la tua risposta di chiarimento. Farò delle attività di debug ed eventualmente vedrò di fare delle contribuzioni.

Saifer707 commented 1 year ago

@amusarra ciao, scusami, sei riuscito a trovare una soluzione? Anche io ho il tuo stesso problema, ma non so come risolvere

amusarra commented 1 year ago

@amusarra ciao, scusami, sei riuscito a trovare una soluzione? Anche io ho il tuo stesso problema, ma non so come risolvere

Ciao @Saifer707 purtroppo no, mi sarei aspettato una risposta dai manutentori del progetto ma così non è stato e francamente non mi andava mi mettermi a fare RE sul codice, quindi ho lasciato perdere.

Saifer707 commented 1 year ago

Grazie mille per la risposta! Ti auguro una buona giornata!

Saifer707 commented 1 year ago

@amusarra ciao di nuovo! Non so se sei ancora interessato, ma sono riuscito a trovare una soluzione, anzi 2. Cerco di spiegarle brevemente qui in modo che possano essere utili a te e a tutta la community.

Primo Metodo

Modificare il main.py commentando la riga data = interface.extractData() e aggiungendo la riga interface.extractAdditionalDetails(). In questo modo si hanno le informazioni base della CIE: card_id, full_name, vat_code, birth_date, birth_place, address. Si possono utilizzare anche gli altri metodi dell'interfaccia per ottenere la foto (interface.extractPhoto()) e l'MRZ (interface.extractMRZ()).

Secondo Metodo

Come si dice qui: https://github.com/italia/cie-nis-python-sdk/issues/11#issuecomment-916089129, il problema sta nella verifica che viene effettuata dal metodo interface.extractData(). Andando in modalità debug, ho visto che la variabile verifyChild0 mi veniva settata a false, mentre la variabile verifyChild1 era true: quindi il problema dipendeva dalla prima variabile. Ho così eliminato dall'if successivo il controllo sulla variabile verifyChild0 ed ho così ottenuto i dati della CIE senza alcun problema.

Molto probabilmente il primo metodo è più safe del secondo. Inoltre, la foto non viene estratta correttamente in formato jpeg, quindi rimando alla soluzione mostrata in un'altra issue: https://github.com/italia/cie-nis-python-sdk/issues/13

amusarra commented 1 year ago

Ottima notiza @Saifer707 Non appena avrò la possibilità farò un test delle due soluzioni. Proverei a fare una pull request.

Saifer707 commented 1 year ago

Sì, sistemo un po' il codice e chiedo la Pull Request!