rsa — RSASSA-PSS 검증
상대가 보낸 RSA-PSS 서명이 그 공개키와 메시지에 맞는지 답한다(RFC 8017 §8.1.2). TLS 1.3 의 rsa_pss_rsae_sha256 이 이것이다.
무엇을 약속하고 무엇을 하지 않나
상수 시간을 약속하지 않고 감사받지 않았다. PSS 만 한다 — PKCS#1 v1.5 는 짓지 않는다. RFC 8446 §4.4.3 이 CertificateVerify 에서 금지하기 때문이다. SHA-1 계열, 키 생성, 복호(RSA 암호화)는 없다. 서명 생성도 없다 — TLS 1.3 서버가 언젠가 필요로 할 수 있지만, 먼저 선 것은 키와 서명이 작은
p256 이다.옛 PKCS#1 v1.5 는 패딩이 결정적이고 구조가 얕아 여러 공격이 붙었다. PSS 는 솔트를 섞고 마스크로 덮는다. PSS 검증은 세 조각이다.
① s^e mod n → EM (인코딩된 메시지, emLen = 키 길이)
② MGF1(SHA-256) 로 마스크를 만들어 DB 를 벗긴다
③ H' = SHA-256(0x00×8 ‖ mHash ‖ salt) 가 EM 안의 H 와 같은가①은 bigint 의 mod_exp 이고, ②③이 이 모듈의 몫이다. 0x00×8 여덟 바이트는 장식이 아니다 — 서명 대상과 인증서 서명을 가르려고 규격이 넣은 접두사다. 빼먹으면 다른 문맥의 서명을 재활용할 수 있게 된다.
| op | 하는 일 | 요구 |
|---|---|---|
mgf1 | MGF1-SHA256 마스크 생성 함수 | out ≥ n · w 는 뒷받침 |
pss_verify | EM 이 주어졌을 때 PSS 인코딩이 맞는가 | ②③만 한다 |
verify_pss | 서명 · 모듈러스 · 지수 · 해시 → 0 또는 1 | ①②③ 전부 |
표 50.1 — rsa 의 op
보통은 verify_pss 하나만 쓴다. pss_verify 가 따로 나와 있는 것은 ①과 ②③을 갈라서 시험하려는 것이다.
확인하는 것 — 표준 PSS 시험 벡터(양성), 음성 둘(서명 1 비트 · 해시 1 비트), MGF1 을 참조 구현과 대조, VM·네이티브 일치. 음성이 둘인 까닭은 서명을 바꾼 것과 메시지를 바꾼 것이 다른 실패이기 때문이다 — 하나만 보면 나머지 하나가 통과하는 구현을 거르지 못한다.