PGP public key decoding

114 views
Skip to first unread message

Serge

unread,
Jul 9, 2021, 3:09:11 PM7/9/21
to Erlang Questions
Does anyone have an idea how to decode a PGP public key using public_key module?

I am doing this:

1> {ok, B} = file:read_file(PGPPubKeyFile),
2> B1 = re:replace(B, <<"-----BEGIN PGP PUBLIC KEY BLOCK-----">>, <<"-----BEGIN RSA PUBLIC KEY-----">>, [{return, binary}]),
3> B2 = re:replace(B1,  <<"-----END PGP PUBLIC KEY BLOCK-----">>,   <<"-----END RSA PUBLIC KEY-----">>,   [{return, binary}]),
4> B3 = re:replace(B2,  <<"\n.+(\n-----END)">>,    <<"\\1">>, [{return, binary}]), % Remove checksum
5> B4 = re:replace(B3,  <<"\nVersion:.+\n\r?\n">>, <<"\n">>,  [{return, binary}]), % Remove version
6> [Entry] = public_key:pem_decode(B4),
7> public_key:pem_entry_decode(Entry).                                                
** exception error: no match of right hand side value {error,{asn1,{{wrong_tag,{{expected,16},
                                                                               {got,131097,{131097,<<"\r">>}}}},
                                                                   [{'OTP-PUB-KEY',match_tags,2,
                                                                                   [{file,"OTP-PUB-KEY.erl"},{line,23999}]},
                                                                    {'OTP-PUB-KEY',dec_RSAPublicKey,2,
                                                                                   [{file,"OTP-PUB-KEY.erl"},{line,2957}]},
                                                                    {'OTP-PUB-KEY',decode,2,
                                                                                   [{file,"OTP-PUB-KEY.erl"},{line,1232}]},
                                                                    {public_key,der_decode,2,
                                                                                [{file,"public_key.erl"},{line,318}]},
                                                                    {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,689}]},
                                                                    {shell,exprs,7,[{file,"shell.erl"},{line,686}]},
                                                                    {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
                                                                    {shell,eval_loop,3,[{file,"shell.erl"},{line,627}]}]}}}
    in function  public_key:der_decode/2 (public_key.erl, line 322)

Max Lapshin

unread,
Jul 9, 2021, 7:43:44 PM7/9/21
to Serge, Erlang Questions
https://datatracker.ietf.org/doc/html/rfc4880

1. maybe it is not base64, but radix64 and it could be another thing?
2. is it really ASN?

Stanislav Ledenev

unread,
Jul 10, 2021, 6:59:21 AM7/10/21
to Serge, Erlang Questions
Your Entry is already decoded, so no need to decode it again.
It must be something like {'RSAPublicKey',.....}

пт, 9 июл. 2021 г. в 22:09, Serge <sal...@gmail.com>:

Serge

unread,
Jul 11, 2021, 9:12:54 PM7/11/21
to Max Lapshin, Erlang Questions
I followed the key re-formatting advice mentioned here:

However, as shown, public_key:pem_entry_decode/1 fails.

Serge

unread,
Jul 11, 2021, 9:15:09 PM7/11/21
to Stanislav Ledenev, Erlang Questions
Oh, I see. I thought the two functions public_key:pem_decode/1 and public_key:pem_entry_decode/1 need to be used in succession to decode the entry.
Reply all
Reply to author
Forward
0 new messages