국내에서 개발되어 국제표준인 ISO/IEC 14888-3 에도 들어가 있는 두 개의 전자서명 알고리즘이다. 이걸 OpenSSL에 어울리도록 코딩한 것이다.
올 봄에 나의 지도교수님의 언질로 만들었던 것인데, 애초의 마음먹은 것과는 달리 뒤에 가니 OpenSSL에 제대로 어울리는 코드는 만들어내지 못한 것 같다. 결정적으로 국내 표준에 명시된 HAS-160을 만들어 넣지 않아서 모양새가 좀 이상하다. 국제 표준(ISO/IEC 14888-3)에 있는 numerical example은 HAS-160을 안 썼다고 하기도 그렇고, 썼다고 하기도 그런 애매한 상태다. 국내 표준에 있는 numerical example과 맞아떨어지는 것을 제대로 구현하려면 HAS-160은 필수. 뭐, 그래서 OpenSSL에 패치를 보내는 거는 지금 상태에서는 적절하지 않고, 시간이 나면 HAS-160 코드를 만들어 넣으려고 했던 것도 시간이 지나니까 귀찮아져서 코드와는 점점 소원해진다.
그랴서... 그냥 썩혀 두기는 아깝고, 제대로 만들어 보자니 귀찮은... 계륵(?)과 비슷한 것이려나. 뭐, 어쨌든 여기에라도 포스팅해서 미끼를 던지고, 관심 두는 사람이 있는지 낚시질이나 해봐야겠다.
2. compiler windows에 cygwin이나 borland c 등을 설치해서 쓸 정도의 사람은 아마도 여기의 설명이 필요 없을 것이니, visuall c++을 사용한다고 가정한다. 설명서에도 나와 있다시피 MS의 MASM이라는 assembler가 아마도 visuall c++에 기본으로 포함돼 있을 것이다.
이 경우에 MASM만을 설치하려면 http://masm32.com/에서 download하여 설치한다. http://www.masm32.com/masmdl.htm에서 다운로드할 수 있다. 여러가지 사이트가 있는데 나의 경우 http://masm32.masmcode.com/masm32/m32v9r.zip 를 설치했다. 설치는 yes-yes-yes 방식-.-;;으로 진행한다. 이렇게 하면 C:\masm32에 설치되고 제일 중요한 assembler인 ml.exe는 C:\masm32\bin에 설치된다. 그런데 문제는 이 경로가 path에 들어가지 않는다. 추가하려면 시작->내컴퓨터(우클릭)->속성->고급탭 에서 path라는 항목을 수정해 준다. 사용자 변수와 시스템 변수가 있는데 해당 컴퓨터를 사용하는 모든 사용자에 적용하게 하려면 시스템 변수를 고쳐 주고 그렇지 않을 경우는 사용자 변수를 고쳐 준다. 나의 경우 사용자 변수 목록에서 PATH항목을 클릭하고 편집을 눌러 수정한다. 변수값 제일 끝에 ;C:\masm32\bin 을 추가해 준다. ;를 꼭 붙여야 한다.
암호 관련 라이브러리들은 대부분 극한의 속도를 목적으로 하기 때문에 assembler를 이용한 빠른 코드를 당근 사용해주는 게 좋겠다.
3. configure 1번의 perl 설치는 사실 configure script를 실행하기 위한 용도이다. cmd창을 띄워서 다음과 같이 실행한다. (시작->실행->cmd.exe)
> cd <현재 소스 루트> > perl Configure VC-WIN32 --prefix=D:/project/lib/ssl
이런 식으로 된다. prefix는 openssl library와 header file들이 설치될 위치이다. 다음으로 실제 compile할 때 사용될 Makefile과 assembly code들을 만든다. 위에서 MASM을 사용하기로 했으니 ms\do_masm을 실행한다.
원래의 설명서에 보면 VC++ environment에서 다음을 진행하라고 되어 있는데, VC++의 명령행 프롬프트는 다음과 같이 띄운다.
사용하는 visual studio의 버젼에 따라서 조금 다를 수는 있다. VC++ 6.0 같은 경우는 일단 cmd 창을 띄운 후(시작->실행->cmd.exe)에 vcvars32.bat 를 실행하면 된다. 이제 library를 build한다.
그런데 visual studio 2005를 사용하는 경우는 cp949에서 특정 문자를 표시할 수 없다는 에러가 나온다. 그럴 경우는 아래 more... 를 참조. 그런 에러가 안 난다면 상관 없다.
more..
이것은 유니코드 어쩌구 저쩌구 하는 말이 나오는데 해당 파일을 code 949로
읽도록 돼 있으나 실제 파일에는 다룰 수 없는 유니코드 문자가 포함돼 있기 때문에 그런다.
유럽사람 이름이다. -.-;; 아마 umlaut 문자일 가능성이 높다. 해결하는 방법은 일단 두가지를 생각해 볼 수 있는데, 첫번째는 무식하지만 쉬운 방법이고, 두번째는 깔끔하지만 익숙하지 않은 사람은 찾기 힘든 방법이다. 그런데 방법을 찾아놨으니 그냥 쓰면 되겠다.
첫번째는 저런 에러가 나는 파일들을 모두 열어서 해당 라인을 삭제해 주면 된다. 또는 해당 파일을 unicode가 들어가지 않도록 저장할 수도 있다. 어느 방법이나, 소스코드에서 다룰 수 없는 유니코드를 없애는 방법이다. 문제가 되는 모든 파일을 건드려야 하니 무식한 방법이다.
두번째는 compiler에 옵션을 하나 주어서 해당 경고를 무시하도록 하는 것이다.
에러는 위와 같은데 C2220은 모든 경고를 오류로 간주해서 컴파일을 멈추도록 하는 것이기 때문에 실제 원인은 C4819이다. cl.exe 명령어의 명령행 옵션을 찾아보면 특정 경고를 무시하도록 하는 것이 있다. /wd<n> 옵션을 사용하는 것이다. 참고로 해당 도움말은 > cl.exe /? 로 볼 수 있다.
ms 디렉토리의 ntdll.mak 파일을 텍스트 에디터로 연다. (notepad로 열면 이상하게 보일 거다. wordpad로 열든가. vim 같은 좋은 에디터를 쓰자. ^^) CFLAG 변수를 지정하는 부분을 찾아서 /wd4819 라는 옵션을 추가해서 소스 코드의 유니코드 관련한 경고를 무시하도록 고친다.
컴파일이 정상적으로 끝났으면 이제 위에서 prefix로 정한 위치에 install을 해야 하는데 그전에 nmake test 를 통해서 library가 잘 만들어졌는지 확인해 볼 수 있다. 하지만 꼭 필요한 것은 아니고, 만족감을 얻고 싶거나, 정말 제대로 만들어졌는지 확인해 봐야 할 경우에만 한다. 마지막에 passed all tests라고 나오면 된다. > nmake -f ms\ntdll.mak test
이제 install을 한다. > nmake -f ms\ntdll.mak install
위와 같이 prefix로 정한 위치에 저런 디렉토리들이 만들어졌고 bin 디렉토리에 libeay32.dll, ssleay32.dll, openssl.exe 같은 파일들이 만들어졌는지 확인한다. 또 include\ssl 디렉토리에 각종 헤더파일들이 역시 존재하는지도 확인한다.
일단, openssl을 단지 "사용"만 하기 위해서는 해당하는 배포판의 package 중에서 설치하면 된다. 그리고 대부분 openssl package가 필요할 때는 package manager가 아마도 알아서 설치했을 것이다. 그러니 보통 사람들은 여기에서 설명하는 과정이란 것이 쓸 데 없는 것에 지나지 않는다. 이 글의 목적은 openssl에 포함돼 있는 crypto library를 이리저리 들여다 보고, 수정도 해 보고, 스스로 컴파일해서 다른 응용 프로그램과 함께 사용해 보는 것이다.
그 다음은 소스코드를 컴파일 가능한 상태로 만든다. 물론, 그냥 이 상태에서 make 명령으로 컴파일해도 컴파일은 되지만, config 같은 명령을 제공하는 소스코드는 config 명령으로 미리 설정해 주는 것이 좋다.
linux-elf 환경으로 설정했다고 나오고 끝난다. 이건 자기 환경에 따라 다를 수도 있다.
어차피 그냥 설치만 하고 끝날 것이 아니기 때문에 Makefile을 잠깐 살펴본다.
소스코드를 build하고 나서 설치할 위치가 나온다. 시스템에 이미 openssl package가 깔려 있을 수도 있으니 겹치지 않도록 저 위치에 그냥 설치하게 둔다.
위의 내용을 참고하여 최소한 프로그램들이 설치되어 있는지 확인한다. 사실 한번이라도 뭔가를 컴파일했던 환경이라면 대부분은 설치되어 있을 것이고, perl 은 혹시 모르니
와 같이 해서 확인한다. 계속해서 Makefile을 살펴보면
어떤 것들을 library에 포함시킬 것인지를 정하고 있다. SDIRS 항목을 잠시 살펴보면 1. 각종 hash function들과 message authentication code가 들어 있다. 2. block cipher (또는 대칭키 암호)들이 들어 있다. 3. 공개키 암호를 구현하기 위한 모듈들이 들어 있다. bn은 32-bit이나 64-bit 이상의 큰 수를 다루기 위한 모듈이다. bn 모듈은 기본적으로 거의 모든 공개키 모듈에서 사용된다. ec는 타원곡선 연산을 위한 모듈이다. 타원곡선 연산은 ecdsa, ecdh 등에서 사용된다. 4. 암호 알고리즘을 구현하기 위한 기타 필수 요소들이다. string buffer, 입출력, random number generation 등등이 들어 있다. 5. 각종 암호학 알고리즘의 입력, 혹은 출력을 표현하기 위한 형식들이 정의된다. 예를 들면 X.509 인증서 형식, ASN.1 데이터 표현형식 pkcs 등의 SSL에서의 인증서 형식 등등이다. 마지막에 써 있듯이 config (혹은 Configure) 명령을 통해서 어떤 모듈을 포함시킬 것인지를 정해 줄 수 있다. 일단은 default 상태로 둔다.
두가지 주요 라이브러리를 생성하고 이것으로부터 shared object 등을 만든다. 사실 SSL 프로토콜을 위해서는 libssl.a가 필요하지만, 암호 라이브러리만을 위해서라면 libcrypto.a 만 있으면 된다. 물론, 다른 입출력이나 데이터 표현과 관련된 기능도 있어야 한다. 그 이후는 특별히 살펴볼 필요는 없을 것 같다.
이제 컴파일을 한다. 컴파일과 설치 자체는 대단히 간단하다. $ make 라고 하면 컴파일이 시작된다. 끝날 때까지 할 일은 없고 기다리면 된다. command prompt가 다시 나오면 끝난 것이다. 이때
와 같이 깨끗하게 끝나야 한다. error가 떴다면 문제를 수정해야 한다. 특별히 컴파일에 문제를 일으킬 만한 것은 당장 생각나지 않으니 일단 패스! -.-;
make까지는 자신의 홈디렉토리에서 수행해도 되지만 /usr/local 과 같은 곳에 설치를 하려면 root 권한이 있어야 한다. root 권한이 없거나 자신의 홈디렉토리에만 설치하고자 할 때는 config 명령으로 소스코드를 설정할 때 설치 디렉토리를 설정해 주어야 한다. $ ./config --prefix=디렉토리이름 과 같은 식으로 하면 된다. config를 다시 했으면 컴파일을 다시 해주는 것이 좋다. 만약 뭔가가 꼬여서 처음의 깨끗한 상태에서 다시 시작하고 싶다면 $ make clean 이라고 한 다음에 다시 make하면 된다.
make가 끝났으면 install을 한다. install은 $ make install 이라고 하면 문제없이 수행되어야 한다. 설치하려는 곳에 권한이 없으면 에러가 출력될 것이다. 이때는 config를 다시 하고 make clean을 수행하고 다시 make하고 이어서 make install을 하는 게 안전하다.
기본적인 설정으로는 shared library를 만들지 않도록 되어 있다. shared library를 만들려면 config 명령에 shared라는 argument를 주면 된다. $ ./config shared 혹은 $ ./config shared --prefix=디렉토리이름