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は例えば以下のようになった


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と関係するほぼ全てのソースをなし崩し的に取ってこないといけない) にはまる。単にコメントあうとで上手くいった。



このブログの人気の投稿

LibreOfficeで表紙、目次、本体でフッターのページ番号のスタイルを変える

WiiUのコントローラが通信不良に陥った話

技術書典2 あ-03 『もわねっとのPythonの本』