<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://eidkit.ro/blog</id>
    <title>EidKit Blog</title>
    <updated>2026-05-05T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://eidkit.ro/blog"/>
    <subtitle>EidKit Blog</subtitle>
    <icon>https://eidkit.ro/img/favicon.svg</icon>
    <entry>
        <title type="html"><![CDATA[Autentificarea cu buletinul electronic. De ce două verificări corecte pot fi totuși insuficiente.]]></title>
        <id>https://eidkit.ro/blog/autentificare-buletin-electronic-zero-trust</id>
        <link href="https://eidkit.ro/blog/autentificare-buletin-electronic-zero-trust"/>
        <updated>2026-05-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Autentificarea pasivă dovedește că datele sunt semnate de MAI. Autentificarea activă dovedește că cipul poate semna un challenge. Dar cele două verificări sunt independente — și asta deschide un vector de atac real. Iată ce înseamnă autentificarea cu adevărat sigură pe CEI.
]]></summary>
        <content type="html"><![CDATA[<p>Când un inginer integrează citirea CEI pentru prima dată și vede că autentificarea pasivă verifică datele față de certificatul MAI, iar autentificarea activă confirmă că cipul poate semna un challenge, concluzia naturală este că totul e în ordine. Două verificări independente, amândouă trecute, deci cardul este autentic și datele sunt corecte.</p>
<p>Concluzia este rezonabilă. Și este greșită.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="cele-două-verificări-și-ce-dovedesc-fiecare">Cele două verificări și ce dovedesc fiecare<a href="https://eidkit.ro/blog/autentificare-buletin-electronic-zero-trust#cele-dou%C4%83-verific%C4%83ri-%C8%99i-ce-dovedesc-fiecare" class="hash-link" aria-label="Direct link to Cele două verificări și ce dovedesc fiecare" title="Direct link to Cele două verificări și ce dovedesc fiecare">​</a></h2>
<p><strong>Autentificarea pasivă</strong> verifică integritatea datelor. Security Object Document-ul de pe card conține hash-urile SHA-256 ale grupelor de date, semnat cu certificatul Document Signer al MAI, verificat față de CSCA-ul Ministerului. Dacă verificarea trece, știi că datele nu au fost modificate după emitere și că MAI le-a semnat.</p>
<p><strong>Autentificarea activă</strong> verifică că cipul deține o cheie privată. Serverul trimite un challenge de 48 de bytes, cipul îl semnează cu cheia sa privată de autentificare, serverul verifică semnătura față de certificatul din card. Dacă verificarea trece, știi că cineva cu acces la un cip funcțional a răspuns corect.</p>
<p>Problema este că cele două verificări sunt <strong>independente</strong>. Pasivă verifică datele. Activă verifică cipul. Dar nu verifică că datele și cipul aparțin aceluiași card fizic.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="vectorul-de-atac-split-proof">Vectorul de atac: split-proof<a href="https://eidkit.ro/blog/autentificare-buletin-electronic-zero-trust#vectorul-de-atac-split-proof" class="hash-link" aria-label="Direct link to Vectorul de atac: split-proof" title="Direct link to Vectorul de atac: split-proof">​</a></h2>
<p>Iată scenariul concret.</p>
<p>CAN-ul este tipărit pe fața cărții de identitate. Oricine ține cardul în mână câteva secunde îl poate citi — la o coadă, la un ghișeu, la un control de rutină. CAN-ul nu este un secret în sensul tradițional al cuvântului; este un identificator de acces la canalul NFC.</p>
<p>Cu CAN-ul victimei, un atacator poate stabili un canal PACE cu cardul și poate citi fișierele ICAO care nu necesită PIN — SOD-ul și datele din applet-ul standard. Aceasta include hash-urile semnate de MAI și, în funcție de configurație, date de bază. Autentificarea pasivă a acestor date va trece pe orice backend.</p>
<p>Atacatorul folosește acum <strong>propriul card</strong> pentru autentificarea activă. Trimite challenge-ul de la server la propriul cip, primește o semnătură validă față de propriul certificat.</p>
<p>Un backend care verifică pasivă și activă <strong>separat</strong> vede două lanțuri valide. Nu poate distinge atacatorul de titularul legitim — pentru că nu a verificat niciodată că datele MAI și cipul care a semnat challenge-ul sunt același obiect fizic.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="chip-authentication-legătura-criptografică-dintre-date-și-cip">Chip Authentication: legătura criptografică dintre date și cip<a href="https://eidkit.ro/blog/autentificare-buletin-electronic-zero-trust#chip-authentication-leg%C4%83tura-criptografic%C4%83-dintre-date-%C8%99i-cip" class="hash-link" aria-label="Direct link to Chip Authentication: legătura criptografică dintre date și cip" title="Direct link to Chip Authentication: legătura criptografică dintre date și cip">​</a></h2>
<p>Chip Authentication (CA, standardizată în BSI TR-03110) rezolvă exact această problemă.</p>
<p>Cardul conține în DG14 o cheie publică <code>Q_chip</code> — specifică acestui cip, acoperită de hash-ul SOD semnat de MAI. Chip Authentication efectuează un schimb ECDH între o cheie efemeră a terminalului și <code>Q_chip</code>. Numai cipul care deține cheia privată corespunzătoare <code>d_chip</code> poate produce secretul partajat corect.</p>
<p>Serverul recomputează schimbul și compară:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Verificare server-side (Node.js)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ecdh </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> crypto</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createECDH</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'brainpoolP256r1'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ecdh</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setPrivateKey</span><span class="token punctuation" style="color:#393A34">(</span><span class="token maybe-class-name">Buffer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword module" style="color:#00009f">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">caEphemeralPrivateKey</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'base64'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> recomputed </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ecdh</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">computeSecret</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">qChipFromDg14</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">recomputed</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">slice</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">32</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">equals</span><span class="token punctuation" style="color:#393A34">(</span><span class="token maybe-class-name">Buffer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword module" style="color:#00009f">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">caSharedSecretX</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'base64'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">throw</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'CA binding mismatch — split-proof attack detected'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Dacă comparația eșuează, cineva a prezentat date MAI-semnate ale victimei cu propriul cip. Atacul este detectat.</p>
<p>Dacă trece, datele din card și cipul care a răspuns la challenge sunt criptografic legate — pentru că <code>Q_chip</code> este semnat de MAI în SOD, iar ECDH-ul confirmă că cipul fizic deține cheia privată corespunzătoare.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ce-înseamnă-zero-trust-în-contextul-cei">Ce înseamnă zero trust în contextul CEI<a href="https://eidkit.ro/blog/autentificare-buletin-electronic-zero-trust#ce-%C3%AEnseamn%C4%83-zero-trust-%C3%AEn-contextul-cei" class="hash-link" aria-label="Direct link to Ce înseamnă zero trust în contextul CEI" title="Direct link to Ce înseamnă zero trust în contextul CEI">​</a></h2>
<p>Un flux de autentificare corect pe CEI impune trei condiții simultan:</p>
<p><strong>Datele sunt semnate de MAI</strong> — autentificare pasivă față de CSCA.</p>
<p><strong>Cipul este autentic</strong> — autentificarea activă dovedește că cipul poate semna un challenge cu propria cheie privată.</p>
<p><strong>Datele și cipul sunt același obiect fizic</strong> — Chip Authentication leagă <code>Q_chip</code> din DG14 (semnat de MAI) de cipul care a efectuat ECDH-ul.</p>
<p>Fără toate trei, nu poți emite un token de autentificare cu garanție criptografică completă. Fără CA în particular, un sistem care verifică pasivă și activă separat are un vector de atac real și exploatabil — nu teoretic.</p>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Autentificarea activă singură nu este suficientă</div><div class="admonitionContent_BuS1"><p>Un backend care verifică AA fără CA știe că cineva a răspuns la un challenge cu un cip funcțional. Nu știe că acel cip conține identitatea pe care a prezentat-o. Cele două trebuie verificate împreună.</p></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="eidkit-sso-oidc-standard-zero-trust-pe-cei">EidKit SSO: OIDC standard, zero trust pe CEI<a href="https://eidkit.ro/blog/autentificare-buletin-electronic-zero-trust#eidkit-sso-oidc-standard-zero-trust-pe-cei" class="hash-link" aria-label="Direct link to EidKit SSO: OIDC standard, zero trust pe CEI" title="Direct link to EidKit SSO: OIDC standard, zero trust pe CEI">​</a></h2>
<p>EidKit SSO este un identity provider OIDC standard — același protocol ca Google Sign-In sau GitHub OAuth. Client ID, Client Secret, redirect URI. Dacă ai integrat vreodată un provider OAuth, știi deja tot ce ai nevoie tehnic.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// JWT primit după autentificare reușită</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"sub"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"a3f7bc9d..."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// pseudonim stabil per persoană, nu CNP-ul brut</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CĂTĂLIN TOMA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"given_name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CĂTĂLIN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"family_name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TOMA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"birthdate"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1985-03-15"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"address"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"formatted"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Str. Exemplu Nr. 1, Timișoara, Timiș"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Datele nu sunt auto-declarate de utilizator — vin direct din cipul CEI, verificate de MAI. Adresa de domiciliu este inclusă, deși nu mai apare tipărită pe cardul fizic.</p>
<p>Fluxul de autentificare implementează toate trei straturile: pasivă + activă + Chip Authentication. Serverul nu emite niciun token fără dovadă criptografică că utilizatorul deține cardul fizic, cunoaște PIN-ul și că datele prezentate și cipul sunt același obiect.</p>
<p>Un detaliu de UX care simplifică integrarea: nu există diferență între înregistrare și login. <code>sub</code>-ul din JWT este un pseudonim stabil și unic per persoană — prima atingere a cardului creează contul automat, fără formular, fără email, fără parolă.</p>
<p>Documentația de integrare și prezentarea completă de securitate sunt disponibile pe <a href="https://eidkit.ro/docs/sso/integration" target="_blank" rel="noopener noreferrer">eidkit.ro/docs</a>.</p>
<hr>
<p><em>Scriem despre CEI — capabilitățile sale, provocările de integrare și contextul reglementar din jurul său. Dacă un subiect de aici este relevant pentru ce construiești, <a href="mailto:hello@eidkit.ro" target="_blank" rel="noopener noreferrer">scrie-ne</a>.</em></p>]]></content>
        <author>
            <name>Cătălin Toma</name>
            <uri>https://linkedin.com/company/eidkit</uri>
        </author>
        <category label="cei" term="cei"/>
        <category label="securitate" term="securitate"/>
        <category label="autentificare" term="autentificare"/>
        <category label="sso" term="sso"/>
        <category label="chip-authentication" term="chip-authentication"/>
        <category label="zero-trust" term="zero-trust"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[2027 este mai aproape decât pare. Ce înseamnă eIDAS 2.0 pentru companiile din România.]]></title>
        <id>https://eidkit.ro/blog/eidas-2-termenul-2027-companii-romania</id>
        <link href="https://eidkit.ro/blog/eidas-2-termenul-2027-companii-romania"/>
        <updated>2026-04-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Până la finalul lui 2027, băncile, fintech-urile, companiile de asigurări și operatorii de telecomunicații din România vor fi obligați legal să accepte EUDI Wallet pentru autentificarea utilizatorilor. 2026 este anul de pregătire. Iată ce înseamnă asta concret.
]]></summary>
        <content type="html"><![CDATA[<p>Pe 4 decembrie 2024, Comisia Europeană a publicat primele acte de implementare ale Regulamentului (UE) 2024/1183 — eIDAS 2.0. Douăzeci de zile mai târziu, acestea au intrat în vigoare. De atunci, a început numărătoarea inversă.</p>
<p>Termenele sunt legale, nu aspiraționale. Până la finalul lui 2026, fiecare stat membru trebuie să pună la dispoziția cetățenilor cel puțin un portofel de identitate digitală — EUDI Wallet — certificat la nivel european. Până la finalul lui 2027, companiile private din sectoarele reglementate sunt obligate să îl accepte. Iar sectoarele care intră sub această obligație includ, explicit, băncile, furnizorii de servicii de plată, companiile de asigurări și operatorii de telecomunicații.</p>
<p>Dacă lucrezi în oricare dintre aceste domenii în România, 2026 este anul în care trebuie să înțelegi ce implică această tranziție — nu 2027.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ce-este-eudi-wallet-și-ce-legătură-are-cu-buletinul-electronic">Ce este EUDI Wallet și ce legătură are cu buletinul electronic<a href="https://eidkit.ro/blog/eidas-2-termenul-2027-companii-romania#ce-este-eudi-wallet-%C8%99i-ce-leg%C4%83tur%C4%83-are-cu-buletinul-electronic" class="hash-link" aria-label="Direct link to Ce este EUDI Wallet și ce legătură are cu buletinul electronic" title="Direct link to Ce este EUDI Wallet și ce legătură are cu buletinul electronic">​</a></h2>
<p>EUDI Wallet este o aplicație mobilă standardizată la nivel european în care cetățenii pot stoca și prezenta credențiale de identitate verificate — actul de identitate, permisul de conducere, diplome, calificări profesionale și alte atribute. Utilizatorul controlează ce date partajează și cu cine, prin divulgare selectivă: poți dovedi că ai peste 18 ani fără să arăți data nașterii exactă, sau poți confirma că ești rezident al unui stat membru fără să dai adresa completă.</p>
<p>Legătura cu CEI este directă și intenționată. Cătălin Giulescu, directorul DGEP, a declarat public că <a href="https://validsoftware.ro/portofelul-digital-european-eudi-wallet-ce-este-cand-vine-si-ce-trebuie-sa-faca-firmele-si-institutiile-din-romania/" target="_blank" rel="noopener noreferrer">cartea electronică de identitate este „un intermediar" în procesul de digitalizare</a> — platforma pe care se construiește EUDI Wallet în România. Cipul CEI, cu certificatele sale digitale emise de MAI, este mecanismul principal de înrolare în portofel. Fără CEI, nu există EUDI Wallet românesc.</p>
<p>România participă deja în proiectul-pilot european EUDIW-PACT coordonat de Ministerul de Interne din Franța, alături de alte 24 de state membre. Pe 17-18 martie 2026, la București au avut loc teste de interoperabilitate transfrontalieră în mediu live — schimb de credențiale funcțional între state membre diferite.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="termenele-clar">Termenele, clar<a href="https://eidkit.ro/blog/eidas-2-termenul-2027-companii-romania#termenele-clar" class="hash-link" aria-label="Direct link to Termenele, clar" title="Direct link to Termenele, clar">​</a></h2>
<table><thead><tr><th>Termen</th><th>Obligație</th></tr></thead><tbody><tr><td><strong>24 dec. 2024</strong></td><td>Primele acte de implementare intră în vigoare — ceasul pornește</td></tr><tr><td><strong>31 dec. 2026</strong></td><td>Fiecare stat membru pune la dispoziție cel puțin un EUDI Wallet certificat</td></tr><tr><td><strong>31 dec. 2026</strong></td><td>Organismele publice și semi-publice sunt obligate să îl accepte</td></tr><tr><td><strong>31 dec. 2027</strong></td><td><strong>Companiile private din sectoarele reglementate sunt obligate să îl accepte</strong></td></tr></tbody></table>
<p>Articolul 5f(2) din Regulament este direct: companiile private care sunt deja obligate prin lege să folosească autentificare puternică a utilizatorilor — Strong Customer Authentication — trebuie să accepte EUDI Wallet la cererea utilizatorului, în cel mult 36 de luni de la intrarea în vigoare a actelor de implementare. Baza legală pentru SCA în serviciile financiare este PSD2. Dacă ești bancă sau fintech care procesează plăți, obligația este certă.</p>
<p>Penalitățile pentru neconformare ajung la <strong>5 milioane EUR sau 1% din cifra de afaceri globală</strong>, oricare este mai mare.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="de-ce-2026-este-anul-în-care-trebuie-să-acționezi-nu-2027">De ce 2026 este anul în care trebuie să acționezi, nu 2027<a href="https://eidkit.ro/blog/eidas-2-termenul-2027-companii-romania#de-ce-2026-este-anul-%C3%AEn-care-trebuie-s%C4%83-ac%C8%9Bionezi-nu-2027" class="hash-link" aria-label="Direct link to De ce 2026 este anul în care trebuie să acționezi, nu 2027" title="Direct link to De ce 2026 este anul în care trebuie să acționezi, nu 2027">​</a></h2>
<p>Există o capcană comună în modul în care companiile citesc termenele reglementare: văd data de 2027 și planifică pentru 2027. Problema este că o integrare de nivel enterprise nu se finalizează în câteva săptămâni.</p>
<p>Experții în implementare estimează că o integrare completă, de la decizie la producție, necesită între 9 și 18 luni pentru o organizație de dimensiuni medii-mari. O bancă cu sisteme legacy, procese de procurement, cerințe de audit intern și cicluri de release bine-definite va fi la capătul superior al acestui interval, nu la cel inferior.</p>
<p>Companiile care încep în 2027 vor intra în producție în 2028 — după termenul obligatoriu. Companiile care încep în 2026 vor fi gata la timp și vor fi câștigat un avantaj competitiv: vor putea să ofere clienților autentificarea prin EUDI Wallet înainte ca aceasta să devină standard.</p>
<p>Chambers &amp; Partners, în analiza lor pe piața fintech din România, confirmă explicit: <a href="https://chambers.com/content/item/7008" target="_blank" rel="noopener noreferrer">„în practică, 2026 este un an de pregătire"</a> pentru a putea accepta wallet-ul și adapta onboardingul până în 2027.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ce-trebuie-să-pregătești-concret">Ce trebuie să pregătești concret<a href="https://eidkit.ro/blog/eidas-2-termenul-2027-companii-romania#ce-trebuie-s%C4%83-preg%C4%83te%C8%99ti-concret" class="hash-link" aria-label="Direct link to Ce trebuie să pregătești concret" title="Direct link to Ce trebuie să pregătești concret">​</a></h2>
<p><strong>1. Maparea fluxurilor de identitate</strong></p>
<p>Primul pas nu este tehnic — este de business. Orice companie care intră sub incidența obligației trebuie să identifice toate punctele din produsele și serviciile sale unde are loc o autentificare puternică sau o verificare de identitate: onboarding KYC, autentificare la tranzacții semnificative, semnare de contracte, acces la date sensibile. Aceste puncte sunt cele care trebuie să accepte credențiale EUDI Wallet.</p>
<p><strong>2. Înregistrarea ca Relying Party</strong></p>
<p>Companiile care vor să accepte EUDI Wallet trebuie să se înregistreze ca <em>relying party</em> la autoritatea națională competentă. Fără înregistrare, nu poți solicita credențiale din portofelele utilizatorilor. Procesul de înregistrare nu este instant — include identificarea entității juridice, specificarea atributelor pe care intenționezi să le accesezi și motivele de business pentru care ai nevoie de ele.</p>
<p><strong>3. Integrarea tehnică</strong></p>
<p>Standardele tehnice pentru interacțiunea cu EUDI Wallet — OpenID4VP pentru prezentarea credențialelor, OpenID4VCI pentru emiterea lor, SD-JWT pentru divulgare selectivă — sunt stabilite prin actele de implementare. Integrarea presupune implementarea acestor protocoale în sistemele existente, nu o înlocuire a acestora.</p>
<p><strong>4. Redesignul fluxurilor KYC</strong></p>
<p>Regulamentul impune minimizarea datelor — poți solicita doar atributele necesare pentru tranzacția respectivă. Dacă ai acum un flux KYC care colectează toate datele disponibile, va trebui să îl redesignezi pentru a cere selectiv doar ce este necesar pentru fiecare context. Aceasta este o schimbare de arhitectură, nu doar de UI.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="situația-din-românia-fundație-solidă-incertitudine-operațională">Situația din România: fundație solidă, incertitudine operațională<a href="https://eidkit.ro/blog/eidas-2-termenul-2027-companii-romania#situa%C8%9Bia-din-rom%C3%A2nia-funda%C8%9Bie-solid%C4%83-incertitudine-opera%C8%9Bional%C4%83" class="hash-link" aria-label="Direct link to Situația din România: fundație solidă, incertitudine operațională" title="Direct link to Situația din România: fundație solidă, incertitudine operațională">​</a></h2>
<p>România nu pleacă de la zero. CEI este deja în rollout național, cu peste 1,5 milioane de carduri emise și un target de 5 milioane până la mijlocul lui 2026. ROeID există ca aplicație de SSO guvernamental. Testele de interoperabilitate EUDI Wallet au avut loc deja pe sol românesc.</p>
<p>Ceea ce lipsește este claritatea operațională pentru sectorul privat. Un raport recent al <a href="https://www.accace.com/eidas-2-in-romania/" target="_blank" rel="noopener noreferrer">Accace</a> constată că, deși alinierea juridică există prin Legea 214/2024, multe companii nu au claritate pe cerințele practice pe termen scurt. Conștientizarea problemei este limitată în afara sectoarelor puternic reglementate.</p>
<p>Există și o nuanță onestă de adăugat: la nivel european, unele state membre <a href="https://www.biometricupdate.com/202512/will-the-eudi-wallet-be-ready-in-2026-experts-say-probably-not" target="_blank" rel="noopener noreferrer">s-ar putea să nu respecte termenul din 2026</a> pentru lansarea wallet-ului, din cauza complexității tehnice și a standardelor care se finalizează în paralel. Dar termenul de 2027 pentru sectorul privat este independent de viteza de lansare a wallet-ului — obligația de acceptare există indiferent de momentul exact al disponibilității. Și în România, CEI este deja disponibilă și funcțională ca fundație.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="legătura-cu-infrastructura-de-identitate-de-astăzi">Legătura cu infrastructura de identitate de astăzi<a href="https://eidkit.ro/blog/eidas-2-termenul-2027-companii-romania#leg%C4%83tura-cu-infrastructura-de-identitate-de-ast%C4%83zi" class="hash-link" aria-label="Direct link to Legătura cu infrastructura de identitate de astăzi" title="Direct link to Legătura cu infrastructura de identitate de astăzi">​</a></h2>
<p>Există o continuitate directă între ce e disponibil acum și ce va fi obligatoriu în 2027. EUDI Wallet va fi populat, în România, cu date din CEI. Fluxurile de KYC bazate pe NFC care citesc cipul CEI astăzi sunt arhitectural compatibile cu ce va presupune acceptarea credențialelor EUDI Wallet mâine — același nivel de asigurare, aceeași bază de date de identitate, aceleași certificate MAI în lanțul de verificare.</p>
<p>Companiile care integrează astăzi citirea CEI prin NFC pentru onboarding și verificare de identitate nu construiesc o soluție temporară. Construiesc infrastructura de identitate pe care vor trebui să o aibă în 2027 — cu un an sau doi avans față de obligația legală.</p>
<hr>
<p><em>Scriem despre CEI — capabilitățile sale, provocările de integrare și contextul reglementar din jurul său. Dacă un subiect de aici este relevant pentru ce construiești, <a href="mailto:hello@eidkit.ro" target="_blank" rel="noopener noreferrer">scrie-ne</a>.</em></p>]]></content>
        <author>
            <name>Cătălin Toma</name>
            <uri>https://linkedin.com/company/eidkit</uri>
        </author>
        <category label="eidas" term="eidas"/>
        <category label="eudi-wallet" term="eudi-wallet"/>
        <category label="kyc" term="kyc"/>
        <category label="regulament" term="regulament"/>
        <category label="romania" term="romania"/>
        <category label="banci" term="banci"/>
        <category label="fintech" term="fintech"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Ce înseamnă să integrezi CEI prin NFC. Un ghid pentru ingineri.]]></title>
        <id>https://eidkit.ro/blog/integrarea-cei-nfc-android</id>
        <link href="https://eidkit.ro/blog/integrarea-cei-nfc-android"/>
        <updated>2026-03-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Cardul electronic de identitate român nu este un simplu card NFC. Are patru applet-uri distincte, două faze de autentificare și formate de date specifice implementării românești care nu apar în nicio documentație publică completă. O evaluare tehnică pentru Android și iOS.
]]></summary>
        <content type="html"><![CDATA[<p><em>Acesta este al treilea articol din seria noastră despre carta electronică de identitate. Articolele anterioare acoperă <a href="https://eidkit.ro/blog/problema-adresei-carte-electronica-identitate">problema adresei care strică fluxurile KYC</a> și <a href="https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei">ce poate semna buletinul tău electronic</a>.</em></p>
<p>Dacă ai mai integrat un pașaport electronic sau un alt document de identitate cu cip, vei intra în acest proiect cu un set de presupuneri rezonabile. Cele mai multe dintre ele sunt parțial greșite pentru CEI.</p>
<p>Nu este că standardele ICAO nu se aplică — se aplică, ca punct de plecare. Problema este că CEI este un card de identitate național cu extensii specifice care nu apar nicăieri documentate complet în public. Ce urmează este o hartă a terenului bazată pe implementări complete pentru Android și iOS, testate pe carduri CEI reale.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ce-știi-deja--și-ce-se-aplică">Ce știi deja — și ce se aplică<a href="https://eidkit.ro/blog/integrarea-cei-nfc-android#ce-%C8%99tii-deja--%C8%99i-ce-se-aplic%C4%83" class="hash-link" aria-label="Direct link to Ce știi deja — și ce se aplică" title="Direct link to Ce știi deja — și ce se aplică">​</a></h2>
<p>Orice card de identitate electronic bazat pe standardele ICAO folosește <strong>PACE</strong> (Password Authenticated Connection Establishment) pentru a stabili un canal securizat înainte de a permite citirea oricărui datum. CEI face același lucru, cu codul CAN — 6 cifre tipărite pe fața cardului — ca parolă.</p>
<p>Rezultatul PACE este un canal Secure Messaging (SM) care împachetează toate comenzile APDU ulterioare. Orice comandă trimisă raw după stabilirea canalului este respinsă de card — comportament standard, nu specific CEI.</p>
<p>Autentificarea pasivă funcționează după principii cunoscute pe ambele platforme: cipul conține un Security Object Document care înlănțuie hash-urile SHA-256 ale grupelor de date până la certificatul rădăcină CSCA al MAI. Verificarea arată diferit în funcție de platformă, dar principiul este același:</p>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Android (Kotlin)</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">iOS (Swift)</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>Pe Android, jMRTD gestionează parsarea SOD-ului. Verificarea lanțului se face manual față de certificatul CSCA distribuit în bundle cu SDK-ul:</p><div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> sod </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SODFile</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sodRaw</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">inputStream</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> dsc </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">docSigningCertificate</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> csca </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> assets</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">open</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal singleline string" style="color:#e3116c">"csca_romania.der"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">use</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    CertificateFactory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getInstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal singleline string" style="color:#e3116c">"X.509"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">generateCertificate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">it</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> X509Certificate</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dsc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">verify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">csca</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">publicKey</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// aruncă excepție dacă invalid</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Pe iOS nu există echivalent jMRTD. SOD-ul este un CMS SignedData — trebuie parsat direct din ASN.1, iar verificarea lanțului se face prin <code>SecTrust</code> cu ancora setată la certificatul CSCA, fără a folosi store-ul de sistem:</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> sod </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token class-name">SodVerifier</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">parse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sodBytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">guard</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> dsc </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">SecCertificateCreateWithData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token nil constant" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">dscDer </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token class-name">CFData</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> trust</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">SecTrust</span><span class="token operator" style="color:#393A34">?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">SecTrustCreateWithCertificates</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dsc</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">SecPolicyCreateBasicX509</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">trust</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">SecTrustSetAnchorCertificates</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">trust</span><span class="token operator" style="color:#393A34">!</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">csca</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token class-name">CFArray</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">SecTrustSetAnchorCertificatesOnly</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">trust</span><span class="token operator" style="color:#393A34">!</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// nu folosi store-ul de sistem</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> error</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">CFError</span><span class="token operator" style="color:#393A34">?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> trusted </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">SecTrustEvaluateWithError</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">trust</span><span class="token operator" style="color:#393A34">!</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">error</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div>
<p>Autentificarea pasivă trebuie să ruleze întotdeauna înainte de a folosi datele citite. Până aici, un inginer cu experiență în documente ICAO va fi confortabil. Aceasta este și cam limita terenului familiar.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="unde-presupunerile-încep-să-se-destrame">Unde presupunerile încep să se destrame<a href="https://eidkit.ro/blog/integrarea-cei-nfc-android#unde-presupunerile-%C3%AEncep-s%C4%83-se-destrame" class="hash-link" aria-label="Direct link to Unde presupunerile încep să se destrame" title="Direct link to Unde presupunerile încep să se destrame">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cipul-are-patru-applet-uri-nu-unul">Cipul are patru applet-uri, nu unul<a href="https://eidkit.ro/blog/integrarea-cei-nfc-android#cipul-are-patru-applet-uri-nu-unul" class="hash-link" aria-label="Direct link to Cipul are patru applet-uri, nu unul" title="Direct link to Cipul are patru applet-uri, nu unul">​</a></h3>
<p>Documentele de călătorie ICAO standard au o structură de applet relativ predictibilă. CEI nu urmează același tipar. Cipul conține patru applet-uri cu roluri distincte:</p>
<table><thead><tr><th>Applet</th><th>Rol</th></tr></thead><tbody><tr><td>AID1 / National App</td><td>Punct de intrare PACE, găzduiește parametrii de securitate</td></tr><tr><td>ICAO LDS</td><td>Fotografie, semnătură olografă digitizată, SOD pentru autentificare pasivă</td></tr><tr><td>EDATA</td><td>Date personale: nume, CNP, adresă de domiciliu</td></tr><tr><td>GenPKI</td><td>Chei și certificate pentru autentificare activă și semnare</td></tr></tbody></table>
<p>Applet-ul ESIGN există pe cip și apare în unele documente de referință. Nu este folosit. Semnarea se face prin GenPKI, printr-o comandă diferită de ce ai presupune din lectura standardelor.</p>
<p>Fiecare applet urmează propriul flux de selecție și autentificare. Nu selectezi un applet și citești ce ai nevoie.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="două-faze-cerințe-diferite">Două faze, cerințe diferite<a href="https://eidkit.ro/blog/integrarea-cei-nfc-android#dou%C4%83-faze-cerin%C8%9Be-diferite" class="hash-link" aria-label="Direct link to Două faze, cerințe diferite" title="Direct link to Două faze, cerințe diferite">​</a></h3>
<p>Citirea datelor de pe CEI se împarte natural în două faze:</p>
<p><strong>Faza 1 — doar CAN:</strong> accesează datele disponibile fără PIN — fotografia titularului, semnătura olografă digitizată și datele necesare pentru autentificarea pasivă. Această fază folosește applet-ul ICAO standard.</p>
<p><strong>Faza 2 — CAN + PIN de 4 cifre:</strong> accesează datele personale complete din applet-ul EDATA, inclusiv adresa de domiciliu — care nu mai apare tipărită pe cardul fizic.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ordinea-operațiilor-înainte-de-pace-nu-este-documentată--și-contează">Ordinea operațiilor înainte de PACE nu este documentată — și contează<a href="https://eidkit.ro/blog/integrarea-cei-nfc-android#ordinea-opera%C8%9Biilor-%C3%AEnainte-de-pace-nu-este-documentat%C4%83--%C8%99i-conteaz%C4%83" class="hash-link" aria-label="Direct link to Ordinea operațiilor înainte de PACE nu este documentată — și contează" title="Direct link to Ordinea operațiilor înainte de PACE nu este documentată — și contează">​</a></h3>
<p>Ce trebuie să faci <em>înainte</em> de PACE depinde de ce vrei să faci <em>după</em> PACE, iar regulile sunt asimetrice în funcție de scenariu. Faza 1 cere o pregătire diferită față de Faza 2 și GenPKI. Dacă pregătirea nu este cea corectă, eșuările apar în puncte neașteptate cu coduri de eroare care nu indică problema reală.</p>
<p>Situația este diferită pe cele două platforme din motive arhitecturale:</p>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Android (Kotlin)</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">iOS (Swift)</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>Stack-ul NFC Android pornește în contextul MF — niciun AID nu este pre-selectat. Aceasta este starea corectă pentru Faza 1: PACE funcționează direct în context MF, după care SM SELECT ICAO oferă acces la DG2/DG7/SOD.</p><div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Faza 1: nicio pre-selecție necesară — stack-ul Android pornește în MF</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">isoDep</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">timeout </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20_000</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// timeout-ul implicit este insuficient pentru CEI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> paceResult </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ps</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">doPACE</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">canKey</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> paceOid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> paceParams</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> wrapper </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> paceResult</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">wrapper</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// toate comenzile de acum înainte trec prin wrapper</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Faza 2: SELECT AID1 înainte de PACE — chip-ul cere context AID1 pentru EDATA/GenPKI</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>iOS pre-selectează automat primul AID din lista <code>select-identifiers</code> din <code>Info.plist</code> la conectare. Dacă ICAO AID este primul, sesiunea pornește în context ICAO — dar PACE nu funcționează în context ICAO (MSE SET AT returnează SW=6985).</p><p>Soluția: un SELECT MF explicit înainte de PACE mută sesiunea din contextul ICAO în contextul MF, replicând starea de start Android.</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Faza 1: iOS conectează în contextul ICAO (ICAO AID este primul în Info.plist)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// PACE nu funcționează în context ICAO — SELECT MF înainte de PACE</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> selectMF </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">NFCISO7816APDU</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">instructionClass</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> instructionCode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xA4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                               p1Parameter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> p2Parameter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0x0C</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                               data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Data</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0x3F</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> expectedResponseLength</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> tag</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">sendCommand</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">apdu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> selectMF</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// acum PACE funcționează — context MF, la fel ca Android</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Faza 2: SELECT AID1 înainte de PACE — același comportament ca Android</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div>
<p>Comportamentul asimetric al pregătirii pre-PACE nu este documentat nicăieri — a fost descoperit prin eliminare pe ambele platforme.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="formatele-de-date-unde-implementarea-românească-diverge">Formatele de date: unde implementarea românească diverge<a href="https://eidkit.ro/blog/integrarea-cei-nfc-android#formatele-de-date-unde-implementarea-rom%C3%A2neasc%C4%83-diverge" class="hash-link" aria-label="Direct link to Formatele de date: unde implementarea românească diverge" title="Direct link to Formatele de date: unde implementarea românească diverge">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="dg1-nu-este-mrz">DG1 nu este MRZ<a href="https://eidkit.ro/blog/integrarea-cei-nfc-android#dg1-nu-este-mrz" class="hash-link" aria-label="Direct link to DG1 nu este MRZ" title="Direct link to DG1 nu este MRZ">​</a></h3>
<p>Acesta este momentul în care codul care funcționează perfect la pașapoarte se rupe complet, pe ambele platforme. Datele de identitate returnate de applet-ul EDATA nu sunt în formatul MRZ pe care îl parsează bibliotecile ICAO standard — sunt într-un format ASN.1 specific implementării românești, cu diacritice corecte și câmpuri structurate diferit:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">SEQUENCE (0x30)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  [0] (0x80)  lastName     UTF-8  ex. "TOMA"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  [1] (0x81)  firstName    UTF-8  ex. "CĂTĂLIN"  (cu diacritice)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  [2] (0x82)  sex          UTF-8  "M" sau "F"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  [3] (0x83)  dateOfBirth  UTF-8  DDMMYYYY</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  [4] (0x84)  cnp          UTF-8  13 cifre</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  [5] (0x85)  nationality  UTF-8  "ROU"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Android (Kotlin)</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">iOS (Swift)</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><code>jMRTD</code>'s <code>DG1File</code> nu poate parsa acest format. Este nevoie de un parser propriu:</p><div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// jMRTD nu ajută aici — format ASN.1 specific românesc</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> tags </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">parseContextTags</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dg1Bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// parser propriu</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> lastName  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0x80</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Charsets</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">UTF_8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> firstName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0x81</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Charsets</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">UTF_8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// diacriticele sunt corecte</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> cnp       </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0x84</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Charsets</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">UTF_8</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Nu există nicio bibliotecă iOS care să parseze acest format. Același parser ASN.1 propriu:</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// nicio bibliotecă iOS nu parsează acest format</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> tags </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">parseContextTags</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dg1Bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// parser propriu</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> lastName  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0x80</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">flatMap </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token short-argument">$0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> encoding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">utf8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> firstName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0x81</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">flatMap </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token short-argument">$0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> encoding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">utf8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// diacriticele sunt corecte</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> cnp       </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0x84</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">flatMap </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token short-argument">$0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> encoding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">utf8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div>
<p>Formatul nu este documentat public — a fost determinat prin inspecție directă a bytes returnați de card.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cele-două-chei-criptografice-din-genpki">Cele două chei criptografice din GenPKI<a href="https://eidkit.ro/blog/integrarea-cei-nfc-android#cele-dou%C4%83-chei-criptografice-din-genpki" class="hash-link" aria-label="Direct link to Cele două chei criptografice din GenPKI" title="Direct link to Cele două chei criptografice din GenPKI">​</a></h3>
<p>GenPKI conține două chei distincte, pe curbe eliptice diferite, cu comportamente interne diferite la semnare:</p>
<table><thead><tr><th>Operațiune</th><th>PIN</th><th>Comportament intern</th></tr></thead><tbody><tr><td>Autentificare activă</td><td>4 cifre</td><td>Cheie pe secp384r1, referință 0x81</td></tr><tr><td>Semnare document</td><td>6 cifre</td><td>Cheie pe brainpoolP384r1, referință 0x8E</td></tr></tbody></table>
<p>A le confunda produce semnături incorecte fără niciun mesaj de eroare care să indice cauza. Comportamentul este identic pe Android și iOS — aceasta este o constrângere a cipului, nu a platformei.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="lucruri-care-se-rup-înainte-să-ajungi-la-logica-de-business">Lucruri care se rup înainte să ajungi la logica de business<a href="https://eidkit.ro/blog/integrarea-cei-nfc-android#lucruri-care-se-rup-%C3%AEnainte-s%C4%83-ajungi-la-logica-de-business" class="hash-link" aria-label="Direct link to Lucruri care se rup înainte să ajungi la logica de business" title="Direct link to Lucruri care se rup înainte să ajungi la logica de business">​</a></h2>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Android (Kotlin)</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">iOS (Swift)</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><strong>Furnizorul criptografic</strong> trebuie înregistrat explicit, în ordinea corectă, înainte de orice operație pe cip. Ordinea greșită produce eșuări silențioase:</p><div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Security</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">removeProvider</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal singleline string" style="color:#e3116c">"BC"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Security</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">insertProviderAt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">BouncyCastleProvider</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><strong>Android 13+</strong> a schimbat API-ul pentru interceptarea tag-urilor NFC. Dacă suporți versiuni mai vechi, gestionezi două variante cu comportamente ușor diferite.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><strong>Entitlements:</strong> sesiunea NFC necesită atât formatul <code>TAG</code> cât și <code>PACE</code> în fișierul <code>.entitlements</code>. Dacă lipsește <code>PACE</code>, sesiunea pornește dar PACE eșuează fără un mesaj de eroare clar.</p><p><strong><code>Info.plist</code></strong> trebuie să conțină <code>NFCReaderUsageDescription</code> și lista de <code>select-identifiers</code> cu cel puțin AID-ul ICAO (<code>A0000002471001</code>) — altfel iOS nu va livra tag-ul aplicației.</p></div></div></div>
<p><strong>PIN counter query nu funcționează</strong> în modul SM, pe nicio platformă. Nu există cale să interoghezi numărul de încercări rămase înainte de a trimite PIN-ul efectiv. Tratezi <code>SW=63CX</code> în răspunsul la VERIFY (X = încercări rămase) și <code>SW=6983</code> pentru card blocat — detaliu care afectează direct UX-ul aplicației.</p>
<hr>
<p><em>Scriem despre CEI — capabilitățile sale, provocările de integrare și contextul reglementar din jurul său. Dacă un subiect de aici este relevant pentru ce construiești, <a href="mailto:hello@eidkit.ro" target="_blank" rel="noopener noreferrer">scrie-ne</a>.</em></p>]]></content>
        <author>
            <name>Cătălin Toma</name>
            <uri>https://linkedin.com/company/eidkit</uri>
        </author>
        <category label="cei" term="cei"/>
        <category label="nfc" term="nfc"/>
        <category label="android" term="android"/>
        <category label="ios" term="ios"/>
        <category label="kotlin" term="kotlin"/>
        <category label="swift" term="swift"/>
        <category label="pace" term="pace"/>
        <category label="tehnic" term="tehnic"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Legea semnăturii electronice din 2024, explicată. Ce poate face buletinul tău electronic și ce nu poate face încă.]]></title>
        <id>https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei</id>
        <link href="https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei"/>
        <updated>2026-03-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Legea 214/2024 a intrat în vigoare în octombrie 2024 și a schimbat fundamental cadrul juridic al semnăturii electronice în România. Buletinul electronic îți oferă o semnătură cu valoare juridică — dar nu în toate situațiile. Iată ce spune legea cu exactitate, unde funcționează și unde nu.
]]></summary>
        <content type="html"><![CDATA[<p><em>Acesta este al doilea articol din seria noastră despre carta electronică de identitate. Primul acoperă <a href="https://eidkit.ro/blog/problema-adresei-carte-electronica-identitate">problema adresei care strică fluxurile KYC</a>. Al treilea intră în detaliile tehnice: <a href="https://eidkit.ro/blog/integrarea-cei-nfc-android">ce înseamnă să integrezi CEI prin NFC</a>.</em></p>
<p>Pe 8 octombrie 2024 a intrat în vigoare <a href="https://legislatie.just.ro/Public/DetaliiDocument/285178" target="_blank" rel="noopener noreferrer">Legea nr. 214/2024</a> privind utilizarea semnăturii electronice — cel mai important act normativ din acest domeniu din România din 2001 încoace. A abrogat vechea lege a semnăturii electronice, a clarificat cadrul juridic pentru toate cele trei tipuri de semnături și a dat, pentru prima dată, o bază legală clară semnăturii de pe noua carte electronică de identitate.</p>
<p>Multă lume a înțeles asta ca pe un anunț simplu: <em>buletinul tău poate semna acte cu valoare juridică.</em> Adevărul este mai nuanțat și merită explicat corect — mai ales că diferența dintre ce <em>poți</em> semna cu CEI și ce <em>nu poți</em> semna are consecințe practice imediate.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="trei-tipuri-de-semnătură-trei-niveluri-de-securitate">Trei tipuri de semnătură, trei niveluri de securitate<a href="https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei#trei-tipuri-de-semn%C4%83tur%C4%83-trei-niveluri-de-securitate" class="hash-link" aria-label="Direct link to Trei tipuri de semnătură, trei niveluri de securitate" title="Direct link to Trei tipuri de semnătură, trei niveluri de securitate">​</a></h2>
<p>Legea, urmând Regulamentul european eIDAS, recunoaște trei tipuri de semnătură electronică. Nu sunt interschimbabile.</p>
<p><strong>Semnătura electronică simplă (SES)</strong>
Cel mai de bază nivel. Un exemplu: numele tău scris la finalul unui e-mail sau o imagine PNG cu semnătura ta lipită într-un document Word. Legea îi recunoaște valoarea juridică în circumstanțe limitate: acte cu valoare sub jumătate din salariul minim brut (~925 RON la momentul actual), dacă cealaltă parte recunoaște documentul prin comportament (de exemplu, execută obligațiile din el), sau dacă ambele părți, ambele persoane juridice, au agreat dinainte în scris că acceptă acest tip de semnătură.</p>
<p><strong>Semnătura electronică avansată (AdES)</strong>
Un nivel mai sus. Trebuie să fie legată unic de semnatar, să permită identificarea acestuia, să fie creată cu date de semnare aflate sub controlul exclusiv al semnatarului și să fie capabilă să detecteze orice modificare ulterioară a documentului semnat. Semnătura de pe CEI intră în această categorie — este creată cu un certificat emis de Ministerul Afacerilor Interne, stocat pe cipul cardului, sub controlul titularului prin PIN.</p>
<p><strong>Semnătura electronică calificată (QES)</strong>
Cel mai înalt nivel. O semnătură avansată care, în plus, este creată printr-un dispozitiv calificat de creare a semnăturii și se bazează pe un certificat calificat emis de un prestator de servicii de încredere calificat (QTSP) — o entitate acreditată și supravegheată de stat. Sunt câțiva astfel de furnizori în România: certSIGN, DigiSign, CertDigital, Trans Sped și alții. Certificatul se obține separat, contra cost, de obicei pe un token USB sau în cloud.</p>
<p>Semnătura de pe CEI <strong>nu este calificată.</strong> Este avansată, cu un certificat emis de o autoritate publică — ceea ce o plasează într-o subcategorie cu efecte juridice extinse față de o semnătură avansată obișnuită, dar tot sub nivelul calificată.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ce-poate-face-semnătura-de-pe-cei-conform-art-4-din-legea-2142024">Ce poate face semnătura de pe CEI, conform Art. 4 din Legea 214/2024<a href="https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei#ce-poate-face-semn%C4%83tura-de-pe-cei-conform-art-4-din-legea-2142024" class="hash-link" aria-label="Direct link to Ce poate face semnătura de pe CEI, conform Art. 4 din Legea 214/2024" title="Direct link to Ce poate face semnătura de pe CEI, conform Art. 4 din Legea 214/2024">​</a></h2>
<p>Articolul 4 alineatul (5) din lege prevede că o semnătură electronică avansată produce aceleași efecte juridice ca o semnătură olografă <strong>dacă</strong> este îndeplinită cel puțin una din următoarele condiții:</p>
<p><strong>a)</strong> actul a fost semnat cu o semnătură electronică avansată creată cu un certificat emis de o autoritate sau instituție publică din România <strong>sau</strong> de un prestator de servicii de încredere calificat</p>
<p><strong>b)</strong> documentul electronic este recunoscut de cel căruia îi este opus — inclusiv prin executarea obligațiilor din document</p>
<p><strong>c)</strong> părțile au agreat expres, printr-un înscris separat semnat olograf sau cu semnătură calificată, că vor conferi semnăturii avansate efectele juridice ale semnăturii olografe</p>
<p>CEI satisface condiția <strong>(a)</strong> în mod direct: certificatul este emis de MAI, care este o autoritate publică din România. Asta înseamnă că, pentru orice act pe care legea îl cere în formă scrisă ca <strong>condiție de probă</strong> (<em>ad probationem</em>) sau pentru care nu impune nicio formă specială, semnătura de pe CEI este echivalentă cu o semnătură olografă — fără alte condiții suplimentare.</p>
<p>Exemple concrete unde funcționează: contracte de prestări servicii, contracte de consultanță, contracte de muncă (prin coroborare cu OUG 36/2021 care permite AdES pentru contracte individuale de muncă), corespondență oficială, cereri administrative simple, acorduri comerciale între profesioniști.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ce-nu-poate-face-semnătura-de-pe-cei">Ce nu poate face semnătura de pe CEI<a href="https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei#ce-nu-poate-face-semn%C4%83tura-de-pe-cei" class="hash-link" aria-label="Direct link to Ce nu poate face semnătura de pe CEI" title="Direct link to Ce nu poate face semnătura de pe CEI">​</a></h2>
<p>Există două categorii de situații unde semnătura avansată de pe CEI nu este suficientă, indiferent de ce spune legea în teorie.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-actele-care-cer-forma-scrisă-ad-validitatem">1. Actele care cer forma scrisă <em>ad validitatem</em><a href="https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei#1-actele-care-cer-forma-scris%C4%83-ad-validitatem" class="hash-link" aria-label="Direct link to 1-actele-care-cer-forma-scrisă-ad-validitatem" title="Direct link to 1-actele-care-cer-forma-scrisă-ad-validitatem">​</a></h3>
<p>Unele acte juridice sunt valide doar dacă sunt în formă scrisă — nu ca o condiție de probă, ci ca o condiție de validitate. Exemple: contracte de ipotecă, contracte de donație, statute de asociere pentru persoane juridice. Legea spune că, pentru aceste acte, forma electronică este valabilă dacă documentul este semnat cu semnătură calificată <strong>sau</strong> cu semnătură avansată care produce efectele semnăturii olografe în condițiile legii.</p>
<p>CEI poate tehnic satisface această condiție (certificat MAI = autoritate publică = condiția (a) îndeplinită), dar în practică notarii și registrele publice cer semnătură calificată. Și au dreptul să o facă, deoarece legea nu le interzice să impună cerințe tehnice mai stricte în procedurile lor interne.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-platformele-automatizate-ale-statului--și-aceasta-este-problema-reală">2. Platformele automatizate ale statului — și aceasta este problema reală<a href="https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei#2-platformele-automatizate-ale-statului--%C8%99i-aceasta-este-problema-real%C4%83" class="hash-link" aria-label="Direct link to 2. Platformele automatizate ale statului — și aceasta este problema reală" title="Direct link to 2. Platformele automatizate ale statului — și aceasta este problema reală">​</a></h3>
<p><strong>ANAF / SPV:</strong> La data publicării acestui articol, <a href="https://validsoftware.ro/probleme-cu-cartea-electronica-de-identitate-ce-nu-functioneaza-si-ce-solutii-ofera-guvernul-martie-2026/" target="_blank" rel="noopener noreferrer">Spațiul Privat Virtual al ANAF nu recunoaște semnătura de pe CEI</a>. Platformele cu validare automată verifică certificatele fără intervenție umană și acceptă exclusiv semnături calificate. Poți semna un document <em>corect și legal</em> cu CEI, dar platforma îl va respinge automat. Sunt necesare: D212, D112, D300 și orice altă declarație fiscală.</p>
<p><strong>ONRC:</strong> Același lucru. Înregistrarea actelor societare, modificările statutare, orice operațiune cu efect juridic la Registrul Comerțului necesită semnătură calificată.</p>
<p><strong>SICAP/SEAP:</strong> Participarea la licitații publice necesită semnătură calificată.</p>
<p>Motivul tehnic: aceste platforme au fost construite și configurate înainte ca CEI să existe la scară națională. <a href="https://alfasign.ro/semnatura-electronica-de-pe-cei-in-relatie-cu-statul/" target="_blank" rel="noopener noreferrer">Validarea automată acceptă exclusiv semnături calificate</a> — singurele cu o structură bine-definită și verificabilă instantaneu. Certificatul avansat de pe CEI, deși legal valid, nu trece prin același canal tehnic.</p>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Distincția importantă</div><div class="admonitionContent_BuS1"><p>Legea nu zice că semnătura de pe CEI este refuzată legal de ANAF. Problema nu este juridică — este tehnică. Documentul semnat cu CEI este valabil. Platforma nu știe să îl proceseze. Sunt două lucruri diferite, și confuzia dintre ele a creat multă frustrare.</p></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="o-excepție-care-merită-menționată-sistemele-electronice-închise">O excepție care merită menționată: sistemele electronice închise<a href="https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei#o-excep%C8%9Bie-care-merit%C4%83-men%C8%9Bionat%C4%83-sistemele-electronice-%C3%AEnchise" class="hash-link" aria-label="Direct link to O excepție care merită menționată: sistemele electronice închise" title="Direct link to O excepție care merită menționată: sistemele electronice închise">​</a></h2>
<p>Art. 4 alin. (5) lit. d) din lege permite semnăturii avansate să producă efectele semnăturii olografe și în cadrul unui <strong>sistem electronic închis</strong> — o platformă utilizată de un set definit de participanți, care respectă un proces de auditare a securității. Asta înseamnă că o companie privată poate construi un flux de semnare care acceptă CEI și să îi confere deplină valoare juridică în raporturile interne sau cu clienții săi, dacă arhitectura sistemului respectă condițiile legii.</p>
<p>Acesta este spațiul unde sectorul privat poate și ar trebui să se miște mai rapid decât statul.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="certificatul-de-pe-cei-câteva-detalii-tehnice-relevante">Certificatul de pe CEI: câteva detalii tehnice relevante<a href="https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei#certificatul-de-pe-cei-c%C3%A2teva-detalii-tehnice-relevante" class="hash-link" aria-label="Direct link to Certificatul de pe CEI: câteva detalii tehnice relevante" title="Direct link to Certificatul de pe CEI: câteva detalii tehnice relevante">​</a></h2>
<p>Legea 214/2024 conține o prevedere specifică pentru certificatul de pe CEI: prin excepție de la regula generală de 2 ani pentru semnăturile avansate, certificatul emis de MAI și înscris pe carta electronică de identitate este valabil pentru <strong>maximum 5 ani</strong> (Art. 3 alin. 5). Valabilitatea concretă o stabilește MAI la emitere.</p>
<p>Certificatul acoperă semnătura electronică avansată. Nu este un certificat calificat. Dacă ai nevoie de semnătură calificată pentru SPV sau ONRC, trebuie să obții separat un certificat de la un furnizor acreditat — certSIGN, DigiSign, CertDigital sau altul din lista aprobată de Autoritatea pentru Digitalizarea României.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="unde-funcționează-bine-acum-sectorul-privat">Unde funcționează bine acum: sectorul privat<a href="https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei#unde-func%C8%9Bioneaz%C4%83-bine-acum-sectorul-privat" class="hash-link" aria-label="Direct link to Unde funcționează bine acum: sectorul privat" title="Direct link to Unde funcționează bine acum: sectorul privat">​</a></h2>
<p>Dacă platformele automatizate ale statului sunt excepția problematică, tot sectorul privat este câmpul liber. Certificatul de pe CEI este emis de MAI — autoritate publică — ceea ce înseamnă că satisface direct condiția (a) din Art. 4(5). Orice companie care construiește un flux de semnare cu CEI nu are nevoie de condiții suplimentare: nici acord prealabil între părți, nici recunoaștere tacită. Semnătura este valabilă din prima.</p>
<p>Domeniile cu cel mai mare potențial practic:</p>
<p><strong>Resurse umane și contracte de muncă.</strong> OUG 36/2021 permite explicit semnătura electronică avansată pentru contractele individuale de muncă și toate documentele aferente. Companiile care angajează remote sau care procesează volume mari de contracte HR au nevoie de exact asta — identitatea verificată și contractul semnat, în același flux.</p>
<p><strong>Fintech și onboarding financiar.</strong> Contracte de servicii, acorduri de mandat, documente de consimțământ, contracte de credit (cu excepția ipotecilor care necesită notar). O platformă fintech care construiește onboardingul pe CEI obține verificarea identității, adresa de domiciliu și semnătura legal valabilă dintr-o singură interacțiune NFC.</p>
<p><strong>Imobiliare — chirii.</strong> Contractele de închiriere sunt acte <em>ad probationem</em>, nu <em>ad validitatem</em>. Semnătura avansată de pe CEI este pe deplin suficientă. Platformele proptech care vor să elimine prezența fizică la semnarea contractului de chirie au baza legală.</p>
<p><strong>Asigurări.</strong> Contracte de polițe, mandate de brokeraj, declarații de daună. ASF (Autoritatea de Supraveghere Financiară) a împins în mod activ spre fluxuri digitale. Companiile de asigurări au nevoie de verificare a identității la onboarding <em>și</em> de semnătură pe documente de poliță — CEI rezolvă ambele.</p>
<p><strong>Telecomunicații.</strong> Contractele de abonament sunt acorduri comerciale standard, integral valabile cu semnătură avansată. Orange, Vodafone, Digi — fiecare are fricțiune masivă la onboarding în prezent.</p>
<p><strong>Servicii medicale private.</strong> Formulare de consimțământ, acorduri de tratament, documente de internare în rețelele private de clinici.</p>
<p><strong>Platforme de freelancing și colaborare B2B.</strong> Contracte de colaborare, contracte de prestări servicii între profesioniști. Conform Legii 214/2024, în relațiile B2B între profesioniști cu un acord prealabil, orice semnătură electronică avansată este valabilă.</p>
<p><strong>Servicii juridice.</strong> Contracte de asistență juridică, împuterniciri, fluxuri interne de documente pentru cabinete de avocatură.</p>
<p><strong>Banking — contracte cu clienții.</strong> Distinct de problema SPV/ANAF: contractele de servicii bancare cu persoane fizice, acordurile de mandat pentru investiții, documentele de onboarding pentru conturi noi — toate sunt relații private, nu interacțiuni cu platforme automatizate ale statului. CEI este valabilă.</p>
<p>Numitorul comun al tuturor acestor domenii: au nevoie de identitate verificată <em>și</em> de semnătură <em>și</em> beneficiază de eliminarea fricțiunii din procesul de onboarding sau semnare. CEI este singurul mecanism disponibil în România care oferă toate trei simultan, din telefon, fără hardware suplimentar, fără o vizită la un birou.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ce-urmează">Ce urmează<a href="https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei#ce-urmeaz%C4%83" class="hash-link" aria-label="Direct link to Ce urmează" title="Direct link to Ce urmează">​</a></h2>
<p>Situația nu este statică. Guvernul a anunțat că lucrează la compatibilizarea tehnică a platformelor statului cu semnătura de pe CEI, deși nu există un termen public asumat. Presiunea vine din mai multe direcții: numărul de CEI în circulație crește rapid, Regulamentul eIDAS 2.0 obligă instituțiile să accepte mijloacele de identificare electronică recunoscute, iar EUDI Wallet — portofelul european de identitate digitală — trebuie să fie disponibil în România până la finalul lui 2026.</p>
<p>Deocamdată, situația practică este simplă: semnătura de pe CEI funcționează bine în relațiile private și acolo unde există o persoană care verifică documentul. Nu funcționează (încă) pe platformele automatizate ale statului.</p>
<hr>
<p><em>Scriem despre CEI — capabilitățile sale, provocările de integrare și contextul reglementar din jurul său. Dacă un subiect de aici este relevant pentru ce construiești, <a href="mailto:hello@eidkit.ro" target="_blank" rel="noopener noreferrer">scrie-ne</a>.</em></p>]]></content>
        <author>
            <name>Cătălin Toma</name>
            <uri>https://linkedin.com/company/eidkit</uri>
        </author>
        <category label="semnatura-electronica" term="semnatura-electronica"/>
        <category label="legea-214-2024" term="legea-214-2024"/>
        <category label="cei" term="cei"/>
        <category label="eidas" term="eidas"/>
        <category label="romania" term="romania"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Adresa ta e pe buletin. Banca nu știe cum să o citească.]]></title>
        <id>https://eidkit.ro/blog/problema-adresei-carte-electronica-identitate</id>
        <link href="https://eidkit.ro/blog/problema-adresei-carte-electronica-identitate"/>
        <updated>2026-03-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Noua carte electronică de identitate nu mai tipărește adresa de domiciliu. Adresa există pe cip — dar băncile, notariatele și instituțiile publice nu știu cum să o acceseze. Ce se întâmplă, de ce contează și ce presupune o integrare corectă.
]]></summary>
        <content type="html"><![CDATA[<p><em>Acesta este primul articol din seria noastră despre carta electronică de identitate. Al doilea acoperă <a href="https://eidkit.ro/blog/legea-214-2024-semnatura-electronica-cei">ce poate semna buletinul tău și ce nu poate semna încă</a>.</em></p>
<p>Odată cu introducerea noii Cărții Electronice de Identitate, adresa de domiciliu a dispărut de pe suprafața fizică a documentului. Nu mai există stradă, număr, oraș, județ tipărite pe verso. Toate aceste informații sunt stocate exclusiv pe cipul din interiorul cărții, accesibile doar prin NFC sau printr-un cititor de carduri.</p>
<p>În teorie, este un pas înainte. Adresa poate fi actualizată electronic atunci când te muți, fără să fie necesară emiterea unui nou document. În practică, tranziția a generat o criză care devine tot mai vizibilă.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="problema-pe-scurt">Problema, pe scurt<a href="https://eidkit.ro/blog/problema-adresei-carte-electronica-identitate#problema-pe-scurt" class="hash-link" aria-label="Direct link to Problema, pe scurt" title="Direct link to Problema, pe scurt">​</a></h2>
<p>Milioane de români dețin acum un act de identitate care conține legal adresa lor de domiciliu — dar nu o pot prezenta unui funcționar bancar, notar sau angajat al statului într-un format pe care acesta să îl poată citi.</p>
<p>Până în această săptămână, Guvernul a înregistrat <a href="https://www.digi24.ro/stiri/actualitate/social/guvernul-anunta-solutii-la-sesizarile-romanilor-privind-cartea-de-identitate-electronica-principala-problema-lipsa-adresei-3697043" target="_blank" rel="noopener noreferrer">peste 300 de sesizări</a> în categoria „Pașaport și Carte de Identitate" pe platforma fara-hartie.gov.ro. Cea mai frecventă problemă: lipsa adresei tipărite. Bănci, notariate, școli, birouri ANAF și autorități locale continuă să solicite o <em>adeverință de domiciliu</em> separată — un document care atestă adresa deja prezentă, tehnic vorbind, pe actul pe care îl țin în mână.</p>
<p>O persoană a povestit că a ajuns la notar pentru un act de vânzare-cumpărare și a fost trimisă acasă pentru că CEI „nu este suficientă pentru dovada domiciliului." Alta a pățit același lucru la bancă. <a href="https://www.capital.ro/obligatoriu-pentru-romanii-cu-buletin-electronic-documentul-de-care-au-nevoie-cetatenii-care-au-carte-de-identitate-electronica.html" target="_blank" rel="noopener noreferrer">Un tânăr de 34 de ani</a>: <em>„Am făcut buletinul electronic pentru că am înțeles că e mai modern și mai sigur. Nimeni nu mi-a spus că voi avea nevoie de o adeverință de fiecare dată când trebuie să dovedesc adresa."</em></p>
<p>Asta se întâmplă când infrastructura avansează înainte ca instituțiile să fie pregătite să o folosească.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ce-a-făcut-guvernul">Ce a făcut Guvernul<a href="https://eidkit.ro/blog/problema-adresei-carte-electronica-identitate#ce-a-f%C4%83cut-guvernul" class="hash-link" aria-label="Direct link to Ce a făcut Guvernul" title="Direct link to Ce a făcut Guvernul">​</a></h2>
<p>Guvernul a reacționat rapid. Pe 25 martie 2026 — acum două zile — <a href="https://ziare.com/carte-electronica-identitate/probleme-banci-notari-2002776" target="_blank" rel="noopener noreferrer">serviciile de evidență a persoanelor au primit instrucțiunea</a> să verifice ele însele adresele în baza de date națională, fără să mai condiționeze preluarea dosarului de prezentarea unui document fizic.</p>
<p>Băncile au primit acces tehnic direct la baza de date a evidenței persoanelor și, conform anunțului guvernamental, nu mai trebuie să solicite adeverința.</p>
<p>Pentru notari, se testează un mecanism similar.</p>
<p>Pentru toți ceilalți — cetățeni care trebuie să dovedească adresa într-un loc care nu are încă acces la baza de date — Ministerul Afacerilor Interne a <a href="https://www.avocatnet.ro/articol_70442/Problema-adresei-de-pe-noile-buletine-rezolvat%C4%83-MAI-a-lansat-o-aplica%C8%9Bie-care-cite%C8%99te-informa%C8%9Biile-de-pe-c%C4%83r%C8%9Bile-electronice-de-identitate.html" target="_blank" rel="noopener noreferrer">lansat aplicația mobilă <strong>RoCEIReader</strong></a>. Apropiați buletinul de telefon, introduceți codul CAN de 6 cifre și PIN-ul de 4 cifre, iar aplicația citește adresa de pe cip și permite salvarea ei ca PDF.</p>
<p>Disponibilă momentan doar pentru Android. Versiunea iOS „urmează în curând."</p>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Forma acestei soluții</div><div class="admonitionContent_BuS1"><p>Răspunsul Guvernului la „instituțiile nu pot citi cipul" este o aplicație pentru cetățeni, prin care aceștia citesc cipul ei înșiși și produc un PDF. Acel PDF este apoi prezentat instituției care nu putea citi cipul.</p><p>Problema a fost parțial convertită dintr-o provocare de integrare tehnică în birocrație — birocrație digitală, dar tot birocrație. Funcționează și e mai bine decât nimic. Dar ilustrează bine distanța dintre ce <em>este</em> CEI — un card inteligent NFC cu securitate criptografică și date semnate de stat — și ce sunt pregătite majoritatea sistemelor să facă cu el.</p></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="opțiunile-pentru-citirea-adresei">Opțiunile pentru citirea adresei<a href="https://eidkit.ro/blog/problema-adresei-carte-electronica-identitate#op%C8%9Biunile-pentru-citirea-adresei" class="hash-link" aria-label="Direct link to Opțiunile pentru citirea adresei" title="Direct link to Opțiunile pentru citirea adresei">​</a></h2>
<p>Tranziția are consecințe reale pentru oricine construiește software care necesită o adresă de domiciliu verificată în România. Fluxul vechi — scanează actul, extrage adresa prin OCR de pe verso — nu mai funcționează. Adresa nu mai e pe verso.</p>
<p>Alternativele, aproximativ în ordinea robusteții:</p>
<p><strong>Acces direct la baza de date guvernamentală</strong>
Băncile au primit acces direct la registrul DGEP. Curat, fără NFC, fără interacțiune suplimentară din partea utilizatorului dincolo de CNP. Accesul necesită un acord formal cu autoritatea guvernamentală și nu este disponibil oricărei companii private care îl solicită.</p>
<p><strong>Citirea cipului prin NFC</strong>
Cardul este citit direct folosind codul CAN tipărit pe fața documentului. Adresa este furnizată exact așa cum o deține statul — semnată criptografic, verificabilă față de lanțul de certificate al Ministerului, fără dependență de o bază de date externă. Adresa se află în applet-ul EDATA al cardului, în spatele unui canal securizat PACE și al unui PIN de 4 cifre. Citirea corectă implică gestionarea unor formate de date specifice implementării românești, pe care bibliotecile ICAO standard nu le acoperă din cutie.</p>
<p><strong>Certificatul produs de utilizator</strong>
Soluția de compromis facilitată acum prin RoCEIReader. Valabilă legal. Introduce un pas manual pentru utilizator, o fereastră de valabilitate de 6 luni și fricțiune tocmai acolo unde fluxurile de onboarding pierd cei mai mulți utilizatori.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="imaginea-de-ansamblu">Imaginea de ansamblu<a href="https://eidkit.ro/blog/problema-adresei-carte-electronica-identitate#imaginea-de-ansamblu" class="hash-link" aria-label="Direct link to Imaginea de ansamblu" title="Direct link to Imaginea de ansamblu">​</a></h2>
<p>Problema adresei este simptomul cel mai vizibil, dar CEI este capabilă de mult mai mult decât a reușit să asimileze orice instituție până acum.</p>
<p>Cipul conține date biometrice, fotografia titularului și două chei criptografice susținute de certificate emise de MAI. Una este pentru semnătura electronică avansată — conform Legii 214/2024, un document semnat cu acest certificat are aceeași valoare juridică ca o semnătură olografă. Cealaltă este pentru autentificarea activă: o dovadă criptografică că cipul este autentic și nu clonat.</p>
<p>Și totuși, <a href="https://validsoftware.ro/probleme-cu-cartea-electronica-de-identitate-ce-nu-functioneaza-si-ce-solutii-ofera-guvernul-martie-2026/" target="_blank" rel="noopener noreferrer">platforma SPV a ANAF respinge semnătura de pe CEI</a>. Acceptă doar semnături de pe certificate calificate achiziționate separat, de la furnizori comerciali autorizați. Cardul îți oferă o semnătură legal valabilă. Portalul propriu al Guvernului nu o acceptă.</p>
<p>Cardul este înaintea ecosistemului. Ecosistemul recuperează decalajul, instituție cu instituție. Băncile au recuperat în privința adresei. Notarii sunt aproape. ANAF nu a recuperat în privința semnăturilor. Același tipar se va repeta pentru fiecare instituție care trebuie să interacționeze cu aceste carduri în următorii doi-trei ani.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ce-presupune-citirea-cipului">Ce presupune citirea cipului<a href="https://eidkit.ro/blog/problema-adresei-carte-electronica-identitate#ce-presupune-citirea-cipului" class="hash-link" aria-label="Direct link to Ce presupune citirea cipului" title="Direct link to Ce presupune citirea cipului">​</a></h2>
<p>Pentru cei curioși din punct de vedere tehnic: cipul CEI rulează protocolul PACE (Password Authenticated Connection Establishment) cu AES-256 pentru a stabili un canal securizat înainte ca orice să poată fi citit. După deschiderea canalului, citirea datelor personale necesită selectarea applet-ului corect, verificarea PIN-ului și parsarea răspunsului într-un format ASN.1 specific implementării românești — diferit de formatul MRZ ICAO pe care îl așteaptă majoritatea bibliotecilor.</p>
<p>Autentificarea pasivă — verificarea că datele de pe cip sunt semnate de MAI și nu au fost alterate — trebuie să ruleze întotdeauna înainte de a folosi orice date citite de pe card. Lanțul merge de la grupele de date prin certificatul semnatarului documentului până la certificatul rădăcină CSCA al Ministerului.</p>
<p>Nimic din toate astea nu este exotic. Dar este specific, iar specificul contează. Nu poți integra CEI citind documentația ICAO standard și adaptând un cititor de pașapoarte. Implementarea românească are propria structură de applet-uri, propriile formate de date și propriile cerințe de secvențiere care nu sunt documentate complet nicăieri în mod public.</p>
<hr>
<p>Din iulie 2025, CEI este singurul model de carte de identitate emis la nivel național. Fiecare act de identitate eliberat în România de acum înainte conține un cip pe care titularul nu îl poate prezenta majorității instituțiilor într-un format pe care acestea să îl poată citi.</p>
<p>Decalajul se va închide treptat. Întrebarea pentru oricine construiește în acest spațiu este cât timp este dispus să aștepte și dacă soluția de compromis — certificate PDF ale datelor deja existente pe card — reprezintă fricțiunea acceptabilă pentru produsul său.</p>
<hr>
<p><em>Scriem despre CEI — capabilitățile sale, provocările de integrare și contextul reglementar din jurul său. Dacă un subiect de aici este relevant pentru ce construiești, <a href="mailto:hello@eidkit.ro" target="_blank" rel="noopener noreferrer">scrie-ne</a>.</em></p>]]></content>
        <author>
            <name>Cătălin Toma</name>
            <uri>https://linkedin.com/company/eidkit</uri>
        </author>
        <category label="cei" term="cei"/>
        <category label="kyc" term="kyc"/>
        <category label="identitate" term="identitate"/>
        <category label="romania" term="romania"/>
        <category label="nfc" term="nfc"/>
        <category label="domiciliu" term="domiciliu"/>
    </entry>
</feed>