nss/certdb.h を使うには Ubuntu では libnss-db も必要
nss-3.14.1 で Ubuntu 12.04.1 LTS。情報は2013-03-08時点のものを元にしている。まぁ、NSSは今後もそんなに変わらんと思うんだけど
libnss3 だけで /usr/include/nss/ 下の全てのヘッダは入るのだけど certdb.h を使う場合にはlibnss-db も必要。
NSS Security Util の certutil と pk12util のソースを上記ヘッダとUbuntuのライブラリとリンクする形で改変してビルドして http://dmiyakawa.blogspot.jp/2013/03/nss-security-tool-openssl-pkcs12.html で使えるか確認するときのMakefileは例えば以下のようになった
なお、nss 本体のソースはそのままだと /usr/include/nss を見てくれない。下記に適当に書いたツールも貼っとく
#!/usr/bin/python import re import subprocess import sys if len(sys.argv) < 2: print >> sys.stderr, "argument(s) required" sys.exit(1); pass p = subprocess.Popen(["ls", "/usr/include/nss/"], stdout=subprocess.PIPE); p.wait() lst = [] for line in p.stdout: lst.append(line.strip()) pass r = re.compile(r'#include "(.*\.h)"') for file_name in sys.argv[1:]: # read contents and rewrite header if needed f = file(file_name) lines = [] for line in f: stripped = line.rstrip() m = r.match(stripped) if m: header_file = m.group(1) if (header_file in lst): lines.append('#include <nss/%s>' % header_file) pass else: lines.append(stripped) pass else: lines.append(stripped) pass pass # push modified contents back to the original file f = file(file_name, 'w') for line in lines: print >>f, line pass
やってる途中で自明なミスがあって2つ目のPythonスクリプトに通した結果ファイルが順に結合されて全ファイルに展開されるということがあった。それより前はもう少し手動でやってたのだが、怠惰になった。
一点だけてで修正する場所がある。certext.c は必要もないのに certdb/xconst.h をincludeしており、ここを真面目に取ってくるとcertdb地獄 (certdbと関係するほぼ全てのソースをなし崩し的に取ってこないといけない) にはまる。単にコメントあうとで上手くいった。
libnss3 だけで /usr/include/nss/ 下の全てのヘッダは入るのだけど certdb.h を使う場合にはlibnss-db も必要。
NSS Security Util の certutil と pk12util のソースを上記ヘッダとUbuntuのライブラリとリンクする形で改変してビルドして http://dmiyakawa.blogspot.jp/2013/03/nss-security-tool-openssl-pkcs12.html で使えるか確認するときのMakefileは例えば以下のようになった
certutil: certutil.c certext.c keystuff.c secutil.c basicutil.c secpwd.c pppolicy.c moreoids.c
gcc -Wall $^ -lnss3 -lnss_db -lnspr4 -lsmime3 -I/usr/include/nspr/ -o $@
pk12util: pk12util.c secutil.c basicutil.c secpwd.c pppolicy.c
gcc -Wall $^ -lnss3 -lnspr4 -lsmime3 -I/usr/include/nspr/ -o $@
なお、nss 本体のソースはそのままだと /usr/include/nss を見てくれない。下記に適当に書いたツールも貼っとく
#!/bin/bash
BASE_DIR=/../nss-3.14.1/mozilla/security/nss
CERTUTIL_FILES=(${BASE_DIR}/cmd/certutil/certutil.{c,h}
${BASE_DIR}/cmd/certutil/{keystuff,certext}.c
${BASE_DIR}/cmd/lib/{basicutil,secutil,secpwd,pppolicy,moreoids}.c
)
PK12UTIL_FILES=(${BASE_DIR}/cmd/pk12util/pk12util.{c,h}
${BASE_DIR}/cmd/lib/{basicutil,secutil}.{c,h}
${BASE_DIR}/cmd/lib/{secpwd,pppolicy}.c
)
FILES=(${CERTUTIL_FILES[@]} ${PK12UTIL_FILES[@]})
for path in ${FILES[@]}
do
basename=${path##*/}
if [ ! -e $basename ]; then
echo "cp $path $basename"
cp $path $basename
echo "./convert_header.py $basename"
./convert_header.py $basename
fi
done
#!/usr/bin/python import re import subprocess import sys if len(sys.argv) < 2: print >> sys.stderr, "argument(s) required" sys.exit(1); pass p = subprocess.Popen(["ls", "/usr/include/nss/"], stdout=subprocess.PIPE); p.wait() lst = [] for line in p.stdout: lst.append(line.strip()) pass r = re.compile(r'#include "(.*\.h)"') for file_name in sys.argv[1:]: # read contents and rewrite header if needed f = file(file_name) lines = [] for line in f: stripped = line.rstrip() m = r.match(stripped) if m: header_file = m.group(1) if (header_file in lst): lines.append('#include <nss/%s>' % header_file) pass else: lines.append(stripped) pass else: lines.append(stripped) pass pass # push modified contents back to the original file f = file(file_name, 'w') for line in lines: print >>f, line pass
やってる途中で自明なミスがあって2つ目のPythonスクリプトに通した結果ファイルが順に結合されて全ファイルに展開されるということがあった。それより前はもう少し手動でやってたのだが、怠惰になった。
一点だけてで修正する場所がある。certext.c は必要もないのに certdb/xconst.h をincludeしており、ここを真面目に取ってくるとcertdb地獄 (certdbと関係するほぼ全てのソースをなし崩し的に取ってこないといけない) にはまる。単にコメントあうとで上手くいった。