2016-08-31 1 views
-2

이 코드를 작성했으며 jcIDE로 디버깅했습니다. 줄 signature.sign ('' ')에 0x6f00 오류가 있습니다. 나는 서명 작업을 위해 "00 00 00 00 04 01 02 03 04"을 보냈습니다
. 내 키는 RSA -1024입니다javacard 2.2.1의 Sign Method에서 0x6f00 오류가 발생했습니다.

RSAPrivateKey thePrivateKey = (RSAPrivateKey) KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PRIVATE, KeyBuilder.LENGTH_RSA_1024, NO_EXTERNAL_ACCESS); 
    RSAPublicKey thePublickKey = (RSAPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC, KeyBuilder.LENGTH_RSA_1024, NO_EXTERNAL_ACCESS); 

    public void generatesignature(APDU apdu) 
    { 

    if(!Pin.isValidated()) 
      ISOException.throwIt (ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED); 


    byte[] buffer=apdu.getBuffer(); 


    // data field of the command APDU 
    short numdata=(short) buffer[ISO7816.OFFSET_LC]; 

    byte p1=(byte)buffer[ISO7816.OFFSET_P1]; 

    thePrivateKey=(RSAPrivateKey)PrivateKeyArray[p1]; 
    thePublickKey=(RSAPublicKey)PublicKeyArray[p1]; 


    // receive data starting from the offset 
    // ISO.OFFSET_CDATA 
    short inputlength= (short) apdu.setIncomingAndReceive(); 

    // it is an error if the number of data bytes 
    // read does not match the number in Lc byte 
    if (inputlength == 0) 
     ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); 

    try 
    {   
    //convert input to hash 

    MessageDigest digest=MessageDigest.getInstance(MessageDigest.ALG_SHA,false); 

    short hashlength=digest.doFinal(buffer,ISO7816.OFFSET_CDATA,numdata,Input_Hash,(short)0); 


    Signature signature=Signature.getInstance(Signature.ALG_RSA_SHA_PKCS1,false); 
    signature.init(thePrivateKey,Signature.MODE_SIGN); 

    short hashlength=signature.sign(Input_Hash,(short)0,hashlength,Input_Sign, (short)0); 



     Util.arrayCopy(Input_Sign,(short)0, buffer, (short)0, signLength); 
     apdu.setOutgoingAndSend((short)0, ((short)signLength)); 


    } 
    catch (CryptoException c) { 
    short reason = c.getReason(); 
    ISOException.throwIt(reason);  // for check 
    } 
    } 

모두가 도와 줄 수 정확히 라인 짧은 hashlength에 = signature.sign (Input_Hash, (짧은) 0, hashlength), Input_Sign, (짧은 0); 문제가 있습니다. 나는 catch를 사용하지만 코드는 절대로 catch에 들어 가지 않습니다. 실제 젬 알토에 apdutool에서 이 enter image description here

내 결과 2.2.1 카드 enter image description here

+0

첫째 : 코드가 불완전하므로 하드 아무것도 –

+0

초 말 : ('짧은 signature.sign을 ... '가 유효하지 않다. 변수 이름을 제공해야한다. –

+1

'generateignature()'메서드를 실행할 때'signature! = null'인가?'Input_Hash'와 'Input_Sign''! = null'입니까? 그리고 적어도 hashlength 요소를 가지고 있습니까? 마지막으로, 코드는 실제로 어디에서 실패합니까?'short signature.sign ...'줄은 n입니다. 유효한 구조가 아니며 컴파일도하지 않습니다! 그렇다면 실제로 어떤 코드를 사용 했습니까? –

답변

0
 byte[] buffer=apdu.getBuffer(); 

    short numdata=(short) buffer[ISO7816.OFFSET_LC]; 


    short inputlength= (short) apdu.setIncomingAndReceive(); 

    if (inputlength == 0) 
     ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); 



     //sign 
     Signature signature=Signature.getInstance(Signature.ALG_RSA_SHA_PKCS1,false); 
     signature.init(thePrivateKey,Signature.MODE_SIGN); 
     signLength=signature.sign(buffer,(short)(ISO7816.OFFSET_CDATA & 0xFF), inputlength, buffer, (short)(0)); 

     apdu.setOutgoingAndSend((short)0,signLength);