2012-12-05 13 views
5
üzerinde SHA1withECDSA imzasını doğrulayın

BouncyCastle kullanarak SHA1withECDSA algoritması tarafından imzalanmış kendinden imzalı sertifikam var. BC altında bunu kolayca doğrulayabilirim, ancak bunu JavaCard üzerinde yaptığımda her zaman yanlış gönderirim (NIST'den Curve secp192r1). Sertifika bekletme işareti düz (X9.62 olmayanlar herhangi bir TAG olmadan yalnızca r + s anlamına gelir).javacard

Bunu doğrulamak için kodum var (sabit olarak yerleştirilmiş değerler ile - tabii ki testler için).

bayt [] 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);  
} 

'...' yerine açık görüş (192bits eğrisi büyük bir karmaşa yapabilir) için bayt.

Belgesi pastebin üzerinde TAGS açıklama ile: Yeni testler:

düzenlemek

Sevar herhangi bir yardım için

http://pastebin.com/gvqYzm2g

Teşekkür Bütün testler aynı veriler üzerinde yeniden (PublicKey, PrivateKey , İmzalanacak mesaj) işareti randomize edilir, böylece 2 işaret (signT - Terminal (BC) tarafından oluşturulan işaret kullanılır, signC - işaret üretir d) Chip tarafından

signT CHIP üzerinde doğrulanamaz, ancak Terminalde doğrulanabilir. signC

  • CHIP yönelik

    Çapraz İlişkisi

  • çalışmıyor edilir

    M.Ö. yönelik

    Çapraz İlişkisi iyi

      çalışır
    • & Terminali

      yüzden API arasındaki çapraz kontrol CHIP doğrulandı

      anahtar çifti iyi oluşturulur, çünkü PrivateKey ve PublicKey BC tarafından CHIP'ye gönderildiğinde CHIP'de üretilen ateşleme CHIP tarafından doğrulanabilir.

      • keypair Sanırım artık kontrol etmelisiniz hiçbir fikrim yok iyi

      üretti. Problem muhtemelen ECDSA adımında d = SHA1 (Mesaj) doldurma dizisi ile olabilir. Karmadan sonra dizi ile ilgili olanlar (karma, eğriden daha kısa ve kartın kopyalanmadan önce dizinin boyutunu bildirmesi gerekir)

    +1

    yararlı olacağını umuyoruz? Yorumlar/cevaplar için geribildirim verdiyseniz hoş olurdu. –

    cevap

    0

    ECDSAwithSHA-1'in Bouncy Castle'dan PrimeCh2S1 ile imzalanması ve doğrulanması benim için iyi çalışıyor.

    Sorununuz muhtemelen imzanın kendisidir.

    İmza, DER kodlu bir yapıdır, iki tamsayı (0x02 etiketi) dizisidir (0x30 etiketi). JavaCard'ta, 56 bayt her zaman beklenir: uzunluk 25'in iki koordinatı artı 6 bayt DER üstbilgisi. JavaCard her zaman her koordinatta baştaki sıfırları bekler.Ancak, BC genellikle koordinatlarda sıfırlar olmadan imzalar üretir, bu yüzden imza 56 bayttan daha kısa olabilir ve bu nedenle JavaCard karışıktır.

    Ters yön, her zaman Tamam, çünkü BC imzayı oluştururken ekleyemese de, baştaki sıfırları işleyebilir.

    Yapmanız gerekenler: BC imza mekanizmasını kendi kodunuzla sarmak ve HER ZAMAN, BC imzanızdaki koordinatlara baştaki sıfırları eklemek. Bunu yaparsanız, hem BC hem de JavaCard'ta imzayı doğrulayabilirsiniz.

    kodumu nakletmek istiyorum, fakat maalesef ticari bir güvenlik projesinin bir parçasıdır

    ...