2012-12-05 10 views
5

Ich habe selbst signiertes Zertifikat signiert von SHA1withECDSA Algorithmus BouncyCastle. Unter BC kann ich es leicht überprüfen, aber wenn ich es auf JavaCard mache, sende ich jedes Mal falsch (Kurve secp192r1 von NIST). Certificate hold sign in plain (nicht X9.62 bedeutet nur R + s ohne TAGs).SHA1withECDSA Unterschrift auf Javacard

Es ist mein Code, um es zu überprüfen (mit Werten als konstant geputtet - für Tests natürlich).

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);  
} 

'...' anstelle von Bytes für klare Sicht (192bits Kurve kann großes Durcheinander tun).

Zertifikat mit TAGS Erklärung auf Pastebin:

http://pastebin.com/gvqYzm2g

Vielen Dank für jede Hilfe

Sevar

edit: Neue Tests: Alle Tests wieder auf dieselben Daten (PublicKey, PrivateKey , Nachricht zu unterzeichnen) Zeichen ist randomisiert, so werde ich 2 Zeichen (signT - Zeichen von Terminal (BC) erzeugt, signC - Zeichen generieren d von Chip)

signt kippt auf CHIP überprüft werden, sondern kann auf Terminal überprüft werden. signC auf CHIP prüft & Terminal-

so checkte ich Kreuzung zwischen API

  • Kreuz Beziehung zu BC gerichtet funktioniert gut

  • Kreuz Beziehung zu CHIP gerichtet nicht

    wird funktionieren

Paar Schlüssel generiert gut, weil, wenn ich PrivateKey und PublicKey von BC zu CHIP erzeugt setzen, dann s Ignatur, die auf dem CHIP erzeugt wird, kann durch CHIP verifiziert werden.

  • KeyPair gut erzeugt

Ich habe keine Ahnung, was ich jetzt überprüfen sollte. Problem dürfte beim Füllen von Array im ECDSA-Schritt e = SHA1 (Message) sein. Was passiert mit Array nach Hash (Hash ist kürzer als Kurve und Karte muss Größe des Arrays vor der Kopie deklarieren)

+1

Wie ergeht Sie mit diesem Sevar nützlich sein wird? Es wäre schön, wenn Sie Feedback zu den Kommentaren/Antworten etc. geben würden. –

Antwort

0

Signieren und Verifizieren von ECDSAwithSHA-1 mit Prime192v1 von Bouncy Castle zu JavaCard funktioniert gut für mich.

Ihr Problem ist wahrscheinlich Format der Signatur selbst.

Signatur ist eine DER codierte Struktur, er eine Sequenz (tag 0x30) von zwei ganzen Zahlen (tag 0x02). In JavaCard werden immer 56 Bytes erwartet: zwei Koordinaten der Länge 25 plus 6 Bytes DER-Header. JavaCard erwartet immer führende Nullen in jeder Koordinate.BC produziert jedoch oft Signaturen ohne führende Nullen in Koordinaten, so dass die Signatur kürzer als 56 Byte sein kann und deshalb ist JavaCard verwirrt.

Die umgekehrte Richtung ist immer OK, weil BC führende Nullen verarbeiten kann, obwohl sie beim Erstellen der Signatur nicht hinzugefügt werden.

Was Sie tun sollten: Wickeln Sie den BC-Signaturmechanismus mit Ihrem eigenen Code und fügen Sie immer führende Nullen zu den Koordinaten in Ihrer BC-Signatur hinzu. Wenn Sie dies tun, können Sie die Signatur sowohl in BC als auch in JavaCard überprüfen.

Ich mag würde meinen Code schreiben, aber leider ist es ein Teil eines kommerziellen Sicherheitsprojektes ...

Verwandte Themen