2014-06-05 6 views
1

ECDSA를 사용하여 서명 코드를 구현하려고합니다. 하지만 설치 단계에서 항상 오류 SW (6F00)가 표시됩니다. 매개 변수를 여러 번 변경해 보았습니다. (예 : ALG_EC_FP/ALG_EC_F2M, LENGTH_EC_FP_xxx/LENGTH_EC_F2M_xxx) 내 코드에서 내 실수를 말씀해 주시겠습니까? (버전 - JCDK 2.2.1, JDK 1.4.2)Javacard에서 ECDSA를 사용하여 서명하는 방법


package Test; 

import javacard.framework.*; 
import javacard.security.*; 
import javacardx.crypto.*; 

public class Test extends Applet{ 

private byte[] PLAINTEXT ; 
private ECPrivateKey objECDSAPriKey=null; // Object for ECDSA Private Key 
private ECPublicKey objECDSAPubKey=null; // Object for ECDSA Public Key 
private KeyPair objECDSAKeyPair=null;  // Object for ECDSA Key Pair 
private Signature objECDSASign=null;  // Object for ECDSA Signature 

final static short BAS = 0; 

//------------------------------------------------------------------------ 
public static void install(byte[] bArray, short bOffset, byte bLength){ 
    new Test(bArray, bOffset, bLength); 
} 

private Test(byte bArray[], short bOffset, byte bLength){ 
    PLAINTEXT = new byte[0x100] ; // Data file 
    Util.arrayFillNonAtomic(PLAINTEXT, BAS, (short)0x100, (byte)0); 

    // Error position (6F00) 
    objECDSAKeyPair= new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_192);   // Error position (6F00) 

    // Create Signature Object 
    objECDSASign = Signature.getInstance(Signature.ALG_ECDSA_SHA, false); 

    register(); 
} 

//------------------------------------------------------------------------ 
public void process(APDU apdu){ 
    byte buf[] = apdu.getBuffer(); 

    switch(buf[1]) 
    { 
    case (byte)0xA4: break; 

    case (byte)0x46: 
    objECDSAKeyPair.genKeyPair(); 
    objECDSAPriKey = (ECPrivateKey)objECDSAKeyPair.getPrivate(); 
    objECDSAPubKey = (ECPublicKey)objECDSAKeyPair.getPublic(); 
    break; 

    case (byte)0x2E: 
    short Le = apdu.setOutgoing(); 
    short sSignLen=0 ; 

    // Init with Private Key 
    objECDSASign.init(objECDSAPriKey, Signature.MODE_SIGN); 
    //objECDSASign.init(objECDSAKeyPair.getPrivate(), Signature.MODE_SIGN); 

    // Sign Data 
    sSignLen = objECDSASign.sign(PLAINTEXT, BAS, Le, buf, BAS); 

    apdu.setOutgoingLength(sSignLen); 
    apdu.sendBytes(BAS, sSignLen); 
    break; 

    default: 
    ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); 
    } 

    return; 
} } 

나는 JCOP 카드의 사양을 가지고, 나는 사양에 카드 지원 ECC 읽어 보시기 바랍니다. 하지만 사양이 카드의 사양이고 카드가 ECC를 실제로 지원하는지 의심 스럽습니다. 그 방법을 확인할 수 있습니까 ???

미리 감사드립니다.

+0

당신이 명확히 수 있을까? GlobalPlatform 카드 매니저를 통한 애플릿 설치 중? 그렇다면 패키지를로드하는 동안 또는 애플릿을 설치 (선택 가능)하는 동안? 또는 사용자 정의 APDU 명령 중 하나를 애플릿에 보낼 때? –

+0

이 설치 단계에서 --------> objECDSAKeyPair = new KeyPair (KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_192); 그리고 매개 변수를 변경했지만 오류가 발생했습니다 (6F00) – user2642459

답변

2

try 
    { 
    // Error position (6F00) 
    objECDSAKeyPair= new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_192); 
    } 
    catch(CryptoException c) 
    {  
     //this line will give you the reason of problem ![see image][1] 
     byte reason = c.getReason(); 
    } 

에 코드를 수정하십시오 * 이미지 링크 : 정확히 당신이 오류를 얻을 때 http://i.stack.imgur.com/dFXVd.png

+0

정말 고마워요 !! 너는 나의 영웅이야. 이유 코드 3 (NO_SUCH_ALGORITHM)이 있습니다. 나는 그 카드를 나에게주는 사람에게 말할 수있다. 다시 감사합니다. ^^ – user2642459

+0

당신은 환영합니다 :) –