2017-12-01 22 views
0

U2F 토큰 중 하나를 사용하면 U2F_REGISTER 응답에서 NIST P-256 ECDSA 서명 확인이 실패합니다.U2F 등록기 서명 확인 실패

나는이 프로토콜의 설명에 따라 일하고 있어요 :

U2F_REGISTER request: 
    b852c99d386769a3289d45708680efcc2350c0a7c152adb93c708b22a55c5d11: challenge 
    8adb4559abbea4a68754314e64aa6785901b6a236db5a14d040916799865e290: application 
U2F_REGISTER response: 
    05: reserved byte 
    user_public_key (NIST P-256): 
    04: key format (uncompressed) 
    db3ca8b3863f2fed19dada227aa8a51dba9bd0ecafcb5313225c04618c9329df: x 
    e540eb5c58d24704e899eaa72feef06722ad4669c5a3d5537ab88dc6a712f96d: y 
    keyhandle 
    40: length (64 bytes) 
    96e7d09341237e1c306a71ed9d59eeb16be621dbb34eb346ca999301ad0bee28f62876fced320734b4f139b89b8608bb4b4cef0f864064c2b3af1966167c4278 
    attestation certificate in X.509 DER format 
    30: sequence 
    82: length (130 bytes) ?? 
     01433081ea... 
    ECDSA signature in X.509 DER format 
    30: sequence 
    44: length (68 bytes) 
     02: integer 
     20: length (32 bytes) 
     6d090eefac83a67f9361adcd391395ab3636470e1eb479dc94e1194dc1f25259: r 
     02: integer 
     20: length (32 bytes) 
     660f7d23cd6b1c74e8499503fd21f6662a3270e916a57096037001baad5c7064: s 

https://fidoalliance.org/specs/fido-u2f-v1.0-nfc-bt-amendment-20150514/fido-u2f-raw-message-formats.html 내가 00 (1 byte) + application (32 bytes) + challenge (32 bytes) + keyhandle (64 bytes this time) + user_public_key (1 + 32 + 32 bytes)의 SHA-256 해시를 계산한다.

그런 다음 ecdsa.Verify(user_public_key, hash, r, s)으로 전화합니다.

내가 가진 U2F 토큰 중 하나 인 ecdsa.Verify는 true (양호)를 반환하지만 다른 하나 (위의 바이트 참조)는 false를 반환합니다. 위의 예에서 내가 뭘 잘못하고 있니?

답변

1

서명을 확인하는 데 잘못된 공개 키를 사용하고있었습니다. 공개 키를 응답에 직접 사용하지 않고 증명 인증서 내에서 공개 키를 사용 했어야합니다. 그렇게함으로써 서명이 올바르게 검증되었습니다.

다음은 서명 확인을 수행하는 Python의 코드 예제입니다. https://github.com/concise/lightu2f.py/blob/20540f75ee5f86a4b2ad4bffe34074760978cbf9/lightu2f.py#L100. 질문의 데이터에서 올바르게 실행됩니다.