Current section
Files
Jump to
Current section
Files
lib/cert.ex
defmodule CA.KEP do
require Record
Record.defrecord(:certAttrs, serial: "", cn: "", givenName: "", surname: "", o: "", title: "", ou: "", c: "", locality: "")
def extract(code, person) do
case :lists.keyfind(code, 2, person) do
false -> ""
{_, _, {:printable, str}} -> str
{_, _, {:utf8, str}} -> str
end
end
def parseSignData(bin) do
{_, {:ContentInfo, _, ci}} = :KEP.decode(:ContentInfo, bin)
{:ok, {:SignedData, _, alg, x, c, x1, x2}} = :KEP.decode(:SignedData, ci)
parseSignDataCert({alg,x,c,x1,x2})
end
def parseSignDataCert({_,_,:asn1_NOVALUE,_,_}), do: []
def parseSignDataCert({_,_,[cert],_,_}), do: parseCert(cert)
def parseAttrs(attrs) do
certAttrs(
o: extract({2, 5, 4, 10}, attrs),
ou: extract({2, 5, 4, 11}, attrs),
title: extract({2, 5, 4, 12}, attrs),
cn: extract({2, 5, 4, 3}, attrs),
givenName: extract({2, 5, 4, 42}, attrs),
surname: extract({2, 5, 4, 4}, attrs),
locality: extract({2, 5, 4, 7}, attrs),
serial: extract({2, 5, 4, 5}, attrs),
c: extract({2, 5, 4, 6}, attrs)
)
end
def parseCert(cert) do
{:Certificate, a, _, _} = cert
{:Certificate_toBeSigned, _ver, _sel, _alg, issuer, _val, issuee, _, _, _, _} = a
person = :lists.flatten(:erlang.element(2, issuee))
ca = :lists.flatten(:erlang.element(2, issuer))
{parseAttrs(person),parseAttrs(ca)}
end
end