server_certificate_database: migrate to crypto/hash APIs

MERGED2026server_certificate_databasecrypto
2026. 8. 18.zbnerd 프로필 이미지zbnerd

Chromium의 components/server_certificate_database에서 deprecated된 crypto/sha2.h 의존성을 제거하고 새로운 crypto/hash.h API로 마이그레이션한 작업입니다.

문제 설명

Chromium의 기존 SHA-256 API를 제공하는 crypto/sha2.h는 제거될 예정이며, 호출부를 새로운 crypto/hash.h API로 이전해야 합니다.

components/server_certificate_database에서는 다음 두 파일이 crypto/sha2.h를 include하고 있었습니다.

  • server_certificate_database.cc
  • server_certificate_database_nss_migrator.cc

server_certificate_database.cc에서는 인증서 DER 데이터의 SHA-256 해시를 계산하기 위해 crypto::SHA256Hash()를 사용하고 있었습니다.

반면 server_certificate_database_nss_migrator.cc에서는 crypto/sha2.h를 include하고 있었지만, 실제 SHA-256 API는 사용하지 않고 있었습니다.

주요 문제는 다음과 같습니다.

  • 제거 예정인 crypto/sha2.h에 의존하고 있음
  • 기존 crypto::SHA256Hash() API를 사용하고 있음
  • NSS migrator에 사용되지 않는 SHA-2 헤더가 포함되어 있음
  • 향후 crypto/sha2.h 제거 시 빌드가 실패할 수 있음

관련 Chromium 이슈는 Bug 372283556입니다.

해결 내용

1. SHA-2 헤더 마이그레이션

server_certificate_database.cc의 기존 헤더를 새로운 hash API 헤더로 교체했습니다.

-#include "crypto/sha2.h"
+#include "crypto/hash.h"

2. SHA-256 함수 마이그레이션

인증서 DER 데이터의 SHA-256 해시를 생성하는 기존 호출을 새로운 API로 변경했습니다.

-sha256hash_hex = base::HexEncodeLower(crypto::SHA256Hash(cert));
+sha256hash_hex = base::HexEncodeLower(crypto::hash::Sha256(cert));

기존 코드와 변경된 코드 모두 다음 작업을 수행합니다.

  1. 인증서 DER 데이터의 SHA-256 해시 계산
  2. 32바이트 해시 결과 생성
  3. 해시 결과를 소문자 hexadecimal 문자열로 변환
  4. 데이터베이스의 sha256hash_hex 값으로 저장

따라서 저장되는 해시 값과 데이터베이스 형식에는 변화가 없습니다.

3. 사용되지 않는 헤더 제거

server_certificate_database_nss_migrator.cc에서는 SHA-2 API를 직접 사용하지 않으므로 기존 헤더를 제거했습니다.

-#include "crypto/sha2.h"

초기 patchset에서는 이를 crypto/hash.h로 교체했지만, 해당 파일에서 hash API를 사용하지 않는다는 리뷰 피드백을 받았습니다.

피드백을 반영하여 불필요한 crypto/hash.h도 제거하고, 해당 파일에는 crypto hash 관련 헤더가 남지 않도록 수정했습니다.

4. 최종 변경 파일

  • components/server_certificate_database/server_certificate_database.cc
  • components/server_certificate_database/server_certificate_database_nss_migrator.cc

최종 변경 규모는 다음과 같습니다.

2 files changed, 2 insertions(+), 3 deletions(-)

테스트 파일이나 BUILD.gn 파일은 변경하지 않았습니다.

테스트 방법

1. 관련 빌드 타깃 확인

다음 명령어로 server_certificate_database 관련 타깃이 정상적으로 컴파일되는지 확인했습니다.

autoninja -C out/Default components/server_certificate_database:unit_tests

빌드는 성공적으로 완료되었습니다.

현재 사용한 out/Default 설정은 Linux 빌드이므로, is_chromeos 조건부 소스인 server_certificate_database_nss_migrator.cc는 이 빌드에서 직접 컴파일되지 않습니다.

2. Deprecated API 잔존 검사

대상 디렉터리에 기존 SHA-2 헤더와 API가 남아 있지 않은지 확인했습니다.

확인 항목은 다음과 같습니다.

  • crypto/sha2.h include가 남아 있지 않음
  • crypto::SHA256Hash() 호출이 남아 있지 않음
  • server_certificate_database.cc에서 crypto/hash.h 사용
  • crypto::hash::Sha256() 호출 사용
  • NSS migrator에 불필요한 hash 관련 헤더가 없음

3. Diff 검사

다음 검사를 통해 whitespace 오류나 잘못된 diff가 없는지 확인했습니다.

git diff --check

검사를 통과했습니다.

4. Gerrit Presubmit

새 patchset 업로드 과정에서 Gerrit upload presubmit을 실행했습니다.

0 Presubmit Messages
0 Presubmit Warnings
0 Presubmit ERRORS

모든 presubmit 검사를 통과했습니다.

배운 점

  • Deprecated API 마이그레이션에서는 헤더 이름을 기계적으로 교체하기보다 각 파일이 해당 API를 실제 사용하는지 확인해야 합니다.
  • 기존 헤더의 심볼을 사용하지 않는 파일에서는 새로운 헤더로 교체하는 대신 include를 완전히 제거하는 것이 적절합니다.
  • crypto::SHA256Hash()crypto::hash::Sha256()는 모두 고정 크기 SHA-256 결과를 제공하므로 기존 base::HexEncodeLower() 호출 구조를 유지할 수 있습니다.
  • public API나 데이터베이스 형식을 변경하지 않고 내부 crypto 의존성만 안전하게 교체할 수 있었습니다.
  • Gerrit 리뷰 피드백을 반영할 때는 실제 심볼 사용 여부를 다시 검색하고 최소한의 변경만 유지하는 것이 중요합니다.
  • 별도의 테스트 코드를 추가하지 않고 기존 관련 타깃 빌드와 presubmit으로 마이그레이션을 검증했습니다.

참고 자료