2012-12-05 7 views
5

ho un'autocertificazione firmata da algoritmo SHA1withECDSA utilizzando BouncyCastle. Sotto BC posso verificarlo facilmente, ma quando lo faccio su JavaCard mi invia ogni volta false (Curve secp192r1 da NIST). Il certificato tiene il segno in chiaro (non X9.62 significa solo r + s senza alcun TAG).Verifica firma SHA1withECDSA su JavaCard

C'è il mio codice per verificare che (con i valori putted costante - per le prove ovviamente).

byte [] certdata = {...}

Signature signature = Signature.getInstance(Signature.ALG_ECDSA_SHA, false); 
    ECPublicKey ecpk = (ECPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PUBLIC,  KeyBuilder.LENGTH_EC_FP_192, true); 

    ecpk.setA(new byte[]{...}, (short)0, (short)0x0018); 
    ecpk.setB(new byte[]{...}, (short)0, (short)0x0018); 
    ecpk.setG(new byte[]{...}, (short)0, (short)0x0031); 
    //Point format: uncompressed tag(0x04), x, y 
    ecpk.setK((short)0x0001); 
    ecpk.setR(new byte[]{}, (short)0, (short)0x0018); 
    ecpk.setW(new byte[]{}, (short)0, (short)0x31); 
    ecpk.setFieldFP(new byte[]{}, (short)0, (short)0x0018); 

    signature.init(ecpk, Signature.MODE_VERIFY); 

    boolean result = signature.verify(certdata, (short)0, (short)certdata.length, signtab, (short)0, (short)signtab.length); 
    if(result) ISOException.throwIt((short)0x0001); 
    else ISOException.throwIt((short)0x0002);  
} 

'...' invece di byte per visione chiara (192bits curva può fare grande disordine).

certificato con TAGS spiegazione pastebin:

http://pastebin.com/gvqYzm2g

Grazie per qualsiasi aiuto

Sevar

Modifica: Nuovi test: Tutti i test ri sulla stessi dati (PublicKey, PrivateKey , Messaggio da firmare) il segno è casuale, quindi userò il segno 2 (signT - segno generato dal Terminale (BC), signC - il segno genera d da Chip)

signt cant essere verificata sul chip, ma può essere verificata su Terminal. signC è verificata CHIP & Terminal

quindi controllato incrocio tra API

  • Relazione trasversale diretto a BC funziona bene

  • Relazione trasversale diretto al chip è non funziona

coppia di chiavi generate bene perché quando ho messo PrivateKey e PublicKey generati da BC a CHIP, quindi s l'ignatura generata sul CHIP può essere verificata da CHIP.

  • coppia di chiavi generata ben

Non ho idea di che cosa dovrei controllare ora. Probabilmente il problema può essere con l'array di riempimento nel passo ECDSA e = SHA1 (Messaggio). Cosa succede con l'array dopo l'hash (l'hash è più corto della curva e la carta deve dichiarare la dimensione dell'array prima della copia)

+1

Come stai cavando con questo Sevar? Sarebbe bello se avessi fornito feedback per i commenti/le risposte, ecc. –

risposta

0

Firma e verifica di ECDSAwithSHA-1 con Prime192v1 da Bouncy Castle a JavaCard funziona bene per me.

Il problema è probabilmente il formato della firma stessa.

Signature è una struttura codificato DER, è una sequenza (tag 0x30) di due numeri interi (tag 0x02). In JavaCard, sono sempre previsti 56 byte: due coordinate di lunghezza 25 più 6 byte di intestazioni DER. JavaCard si aspetta sempre zeri iniziali in ogni coordinata.Tuttavia, BC spesso produce firme senza zeri iniziali in coordinate, quindi la firma può essere inferiore a 56 byte ed è per questo che JavaCard è confuso.

La direzione opposta è sempre OK, poiché BC può gestire zeri iniziali, sebbene non li aggiunga durante la creazione della firma.

Cosa si deve fare: avvolgere il meccanismo di firma BC con il proprio codice e SEMPRE aggiungere zeri iniziali alle coordinate nella propria firma BC. Se lo fai, sarai in grado di verificare la firma sia in BC che in JavaCard.

vorrei inviare il mio codice, ma purtroppo si tratta di una parte di un progetto di sicurezza commerciale ...