암호화 모듈을 pure Java모듈을 사용하다가 native를 사용하면 더 빠를 것이라는 의견이 있어 JNI with C++로 구현하였다.
테스트 중 native에서 자꾸만 "stack corruption detected: aborted" 에러가 발생하며 앱이 죽는 문제가 발생했다.
죽는 상황은 encryption/decryption시 원본 데이터의 크기가 native에서 선언 된 임시 버퍼인 unsigned char 배열의 크기보다 큰 경우에만 발생하였다.
어제/오늘 총 6시간 가까이 소스를 아무리 봐도... 로그를 아무리 확인해봐도... 문법적으로, 논리적으로 틀린곳이 없었다..
에러 내용으로 유추해보면 임시 버퍼를 잘 못 건들거나, 원본 데이터나 결과 데이터를 잘 못 조작하는 경우이고, 원본/결과 데이터를 건드는 곳은 전혀 문제가 없음을 확인했다.
임시 버퍼의 마지막 원소 다음 위치의 값을 확인한 결과 EVP_CipherUpdate실행 후 변경되는 것을 확인하였다. 하지만 EVP_CipherUpdate이 결과값을 리턴하는 것은 정확히 임시버퍼의 크기만큼여서 의심하지 않고 넘어갔었는데.. 결국 EVP_CipherUpdate에서 결과 값 외에도 뭔가 건드는 것이 있는 것으로 판단되어 임시버퍼의 크기를 암호화 알고리즘의 블럭 사이즈만큼 크게 잡아주니 정상 처리 된다.
=> update함수에 대한 설명을 좀 찾아보니 out length + BLOCK_SIZE - 1 만큼의 크기를 out buffer로 잡아주어야 된다고 되어 있다 ㅡㅡ;
'develop > 보안' 카테고리의 다른 글
Let's encrypt로 무료 SSL 발급시 아파치 설정 (0) | 2024.04.17 |
---|---|
공인인증서의 PKI Extension에 포함되는 주 항목들 (0) | 2013.04.18 |