OSSCA Chromium

기여 목록 / 8471207

[WebCrypto] Fix supports() for exportKey and wrapKey

BlinkfixMerged

WebCrypto의 SubtleCrypto.supports()가 "exportKey" 연산에 대해 항상 false를 반환하고, "wrapKey"에서는 export를 지원하지 않는 알고리즘에도 true를 반환하던 문제를 고쳤습니다. 8312049의 후속 CL로, 같은 버그를 이 CL에서 최종적으로 닫았습니다. 2파일 +28/−5.

문제 설명

  • issue url: https://crbug.com/41264071
  • 스펙상 supports()는 연산 이름으로 "exportKey"를 받아야 합니다. 또 "wrapKey"는 additionalAlgorithm이 export key 연산을 지원하지 않으면 false를 반환해야 합니다.
  • Blink는 "exportKey"를 연산으로 인식하지 못해 모든 조회에 false를 반환했습니다.
  • "wrapKey"에서 additionalAlgorithm이 HKDF나 PBKDF2이면 true를 반환했습니다. 그런데 실제 wrapKey()는 8312049 이후 이런 키를 NotSupportedError로 거부하므로, supports()와 실제 동작이 어긋나 있었습니다.
  • 8312049 리뷰에서 davidben@이 이 부분을 지적했고, 그 CL은 범위를 유지하고 TODO를 남긴 뒤 이 CL에서 WPT와 함께 처리하기로 했습니다.

해결 내용

8312049에서 추가한 kWebCryptoOperationExportKey 연산 정보를 그대로 활용했습니다. 수정은 subtle_crypto.cc 한 파일입니다.

  1. 연산 이름 매핑에 "exportKey" → kWebCryptoOperationExportKey를 추가했습니다.
  2. supports()의 "wrapKey" 경로에서 additionalAlgorithm이 exportKey를 지원하는지 먼저 확인하도록 했습니다.
  3. 두 곳에 남아 있던 TODO(crbug.com/41264071) 주석을 지웠습니다.
if (operation == "wrapKey") {
  if (!supportsInternal(script_state, kWebCryptoOperationExportKey,
                        additional_algorithm, length_bits)) {
    return false;
  }
}

리뷰 과정

  • davidben@, dcheng@ 모두 PS1에서 별도 코멘트 없이 Code-Review+1을 주었습니다.
  • PS2는 CQ가 rebase해서 머지한 패치셋입니다.

테스트 방법

  • 기존 WPT WebCryptoAPI/supports.tentative.https.any.js에 테스트 두 개를 추가했습니다.
    • exportKey tests: AES-GCM은 true, HKDF와 PBKDF2는 false
    • wrapKey tests: AES-KW로 AES-GCM을 감싸는 경우는 true, HKDF와 PBKDF2를 감싸는 경우는 false
  • CQ 통과 후 머지. 추가한 WPT는 upstream으로 자동 export되어 web-platform-tests/wpt#63034로 머지되었습니다.

배운 점

  • 이 패치를 통해서 webcrypto의 한 부분을 공부해볼 수 있었습니다. 생각보다 많이 복잡했지만 AI가 많이 도와줘서 수월하게 끝낼 수 있었습니다.

참고 자료