Bijou64, 보안과 속도를 모두 잡은 새로운 정수 인코딩 방식
Bijou64는 보안 취약점을 해결하고 LEB128보다 빠른 가변 길이 정수 인코딩 방식임
단일 표현 방식(Canonicality)을 통해 보안을 강화하고, 9바이트 이내의 u64 정수를 표현함
SIMD(Single Instruction, Multiple Data) 명령어 사용 시 성능 저하 가능성이 제기됨
SQLite varint 및 QUIC varint 등 기존 인코딩 방식과의 비교 분석이 이루어짐
Bijou64의 설계 원리: 단일 표현 방식
Bijou64는 각 정수를 유일하게 표현하는 단일 표현 방식(Canonicality)을 핵심 설계 원칙으로 삼아 보안 취약점을 해결한다. LEB128과 달리, 동일한 값을 여러 방식으로 인코딩하는 것을 방지하여 악의적인 입력(Adversarial Input)에 대한 방어력을 높인다. 특히, X.509 인증서, JWT, 비트코인 트랜잭션 등에서 발생했던 캐노니컬리제이션 공격(Canonicalisation Attacks)을 원천적으로 차단하는 효과를 가진다.
성능 비교: Bijou64 vs LEB128
벤치마크 결과에 따르면, Bijou64는 LEB128보다 디코딩 속도(Decoding Speed)가 2~10배 빠르다. 특히, 큰 숫자를 처리할 때 LEB128의 연속 비트 스캔(Continuation-bit Scan)으로 인한 성능 저하를 극복한다. 하지만, 작은 숫자(248~65,535)를 인코딩할 때는 LEB128이 약간 더 빠르다. Bijou64는 분기 예측(Branch Prediction)에 유리한 구조를 가지고 있어, 현대 CPU에서 효율적인 성능을 발휘한다.
SIMD 명령어 사용 시의 성능 문제
kstenerud는 SIMD 명령어 사용 시 Bijou64의 성능이 저하될 수 있다고 지적한다. Bijou64의 복잡한 비트 연산은 SIMD의 병렬 처리(Parallelization) 기회를 제한하는 반면, LEB128 또는 sentinel value 방식은 SIMD에 더 적합하다는 것이다. i2talics는 DWARF, WASM과 같은 애플리케이션에서 LEB128이 사용되는 이유로 링킹(Linking) 문제를 언급하며, 비표준 인코딩이 유용할 수 있음을 시사한다.
Bijou64의 잠재적 취약점 및 한계
dzaima는 Bijou64가 범위 검사(Range Check)를 소홀히 할 경우, LEB128과 유사한 취약점을 가질 수 있다고 경고한다. 특히, 첫 번째 바이트가 255인 경우의 처리를 제대로 하지 않으면, 64비트 래핑(Wraparound)으로 인한 문제가 발생할 수 있다. aDyslecticCrow는 악의적인 패킷이 잘못된 오프셋(Incorrect Offset)으로 이어져 메모리 접근 오류를 발생시킬 수 있다고 지적하며, Bijou64의 안전성에 대한 추가적인 검증 필요성을 강조한다.