server_certificate_database: migrate to crypto/hash APIs
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.ccserver_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));기존 코드와 변경된 코드 모두 다음 작업을 수행합니다.
- 인증서 DER 데이터의 SHA-256 해시 계산
- 32바이트 해시 결과 생성
- 해시 결과를 소문자 hexadecimal 문자열로 변환
- 데이터베이스의
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.cccomponents/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.hinclude가 남아 있지 않음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으로 마이그레이션을 검증했습니다.