#!/usr/bin/env escript %% -*- erlang -*- -define(CATLFISH_VER, "catlfish-0.10.0-dev"). -define(PLOP_VER, "plop-0.10.0-dev"). -define(LAGER_VER, "lager-3.2.2"). write_reply(Bin) -> Length = size(Bin), file:write(standard_io, <>). verify(RootCerts, DBEntry) -> try case catlfish:verify_entry(tlv:decodelist(DBEntry), RootCerts) of {ok, _MTLHash} -> write_reply(<<0:8>>); {error, Reason} -> ReasonBin = list_to_binary(io_lib:format("~p", [Reason])), write_reply(<<1:8, ReasonBin/binary>>) end catch Type:What -> [CrashFunction | Stack] = erlang:get_stacktrace(), ErrorBin = list_to_binary(io_lib:format("Crash: ~p ~p~n~p~n~p~n", [Type, What, CrashFunction, Stack])), write_reply(<<2:8, ErrorBin/binary>>) end. loop(RootCerts) -> {ok, LengthBin} = file:read(standard_io, 4), <> = list_to_binary(LengthBin), case Length of 0 -> none; _ -> {ok, DBEntry} = file:read(standard_io, Length), verify(RootCerts, list_to_binary(DBEntry)), loop(RootCerts) end. add_lib(Dirs, Name) -> add_lib(Dirs, Dirs, Name). add_lib(AllDirs, [], Name) -> {ok, Cwd} = file:get_cwd(), io:format(standard_error, "Could not add lib ~p: tried directories ~p cwd: ~p~n", [Name, AllDirs, Cwd]), halt(1); add_lib(AllDirs, [Dir | Rest], Name) -> Path = Dir ++ "/" ++ Name ++ ".ez/" ++ Name ++ "/ebin", case code:add_path(Path) of true -> ok; {error, bad_directory} -> add_lib(AllDirs, Rest, Name) end. main([KnownRoots]) -> [ScriptFile | _] = init:get_plain_arguments(), BaseDir = filename:dirname(ScriptFile), LibDirs = [BaseDir ++ "/../lib", "../lib"], add_lib(LibDirs, ?CATLFISH_VER), add_lib(LibDirs, ?LAGER_VER), add_lib(LibDirs, ?PLOP_VER), Certs = x509:read_pemfiles_from_dir(KnownRoots), loop(Certs).