-
ML-DSA라는 NIST 지정 양자내성 서명 알고리듬의 Go 구현 과정에서 서명 검증이 실패하는 문제 발생
-
Claude Code v2.0.28이 테스트 코드와 소스 경로만으로 복잡한 저수준 버그를 신속히 찾아냄
- 문제 원인은 Verify 단계에서 w1의 상위 비트를 중복 계산한 함수 병합 오류로 확인
- 이어진 두 번째 실험에서도 Claude가 Montgomery 상수 계산 오류와 서명 길이 불일치 버그를 각각 찾아냄
- 세 번의 시도 모두 성공적으로 버그를 식별해, AI의 저수준 디버깅 활용 가능성을 보여줌
ML-DSA 구현과 초기 문제
- 작성자는 NIST가 지정한 ML-DSA(Post-Quantum Signature Algorithm) 를 Go 언어로 새로 구현
- 4일간의 라이브코딩 후 테스트에서 Verify 함수가 모든 서명을 거부하는 문제 발생
- 테스트 로그에는 invalid signature 오류가 반복 출력됨
- 피로로 인해 디버깅을 중단하고, Claude Code에 문제를 분석하도록 요청
Claude Code의 첫 번째 디버깅
- Claude Code v2.0.28(모델 Opus 4.1, 시스템 프롬프트 없음)에 다음 정보를 제공
- 테스트 실행 명령(bin/go test crypto/internal/fips140/mldsa)
- 코드 위치(src/crypto/internal/fips140/mldsa)
- “서명이 항상 거부된다”는 설명과 “w1이 다르다”는 힌트
- Claude는 몇 분 만에 완전한 수정 제안을 반환
- 원인은 HighBits와 w1Encode를 하나로 합친 뒤, Verify에서 이미 상위 비트를 생성한 UseHint 결과에 다시 상위 비트를 취한 것
- 즉, w1의 상위 비트를 두 번 계산한 구조적 오류
- Claude는 코드 로드를 마친 직후 원인을 파악하고, 자체 테스트를 작성해 가설을 검증
- 제안된 수정은 완벽하지 않았으나, 핵심 원인 파악으로 디버깅 시간을 단축
- 이후 작성자는 w1Encode를 리팩터링해 상위 비트를 입력으로 받는 구조로 변경, Montgomery 표현 변환 과정도 단축
두 번째 실험: 서명 생성 단계의 버그
- 서명 생성 구현에서도 테스트 실패 발생
- 첫 번째 버그: Montgomery 도메인에서 상수(1, -1) 계산 오류
- 찾기 어려운 문제로, 수많은 printf와 추측이 필요했으며 약 1~2시간 소요
- 두 번째 버그: 서명에 포함되는 값의 길이 오류(32비트 대신 32바이트)
- 작성자는 이 두 버그가 Claude의 성능 검증에 적합하다고 판단하고, 이전 버전 코드로 Claude Code를 재실행
Claude Code의 두 번째 디버깅 결과
- 첫 번째 프롬프트에서 Claude는 printf 디버깅과 값 추적을 수행하며 잘못된 상수를 찾아 수정
- 처리 시간은 인간보다 짧았으며, 테스트 실패 원인을 정확히 식별
- 두 번째 프롬프트에서는 서명 길이 불일치 문제를 찾아냄
- Claude는 여러 경로를 탐색한 후, 할당 길이만 수정하는 제안을 제시
- 제안된 수정은 완전하지 않았으나, 핵심 오류 위치를 정확히 지적
- 세 번의 독립적 시도 모두에서 Claude가 정확한 버그 원인을 단독으로 찾아냄
AI 디버깅의 효율성과 시사점
- Claude의 접근은 테스트 실패 원인 탐색에 특화된 자동화 도우미로서 효과적
- 사용자는 Claude의 수정안을 그대로 적용하지 않고, 버그 위치만 확인 후 직접 수정
- 작성자는 “테스트 실패 시 자동으로 LLM이 원인을 분석해 알려주는 도구”의 필요성을 언급
- 단순 채팅이나 자동 PR 생성보다 테스트 기반 디버깅 에이전트 형태가 이상적이라 평가
후원 및 기타 정보
- 작성자의 오픈소스 유지보수는 Geomys를 통해 지원받으며,
Smallstep, Ava Labs, Teleport, Tailscale, Sentry 등이 후원
- Ava Labs는 암호 프로토콜의 지속 가능한 오픈소스 개발의 중요성을 강조
- Teleport는 사용자 계정 탈취 방지 및 접근 제어 강화를 위한 Teleport Identity 플랫폼을 소개
부록: 이미지 및 개인 언급
- 글에는 Microsoft Office의 클리피(Clippy) 가 “w1의 상위 비트를 두 번 취했다”는 말풍선과 함께 등장
- 마지막에는 고양이 사진이 포함되어 있으며, AI에 대한 감정적 논쟁을 완화하는 유머로 제시됨