summaryrefslogtreecommitdiff
path: root/lib/public_key/src/pubkey_pem.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/public_key/src/pubkey_pem.erl')
-rw-r--r--lib/public_key/src/pubkey_pem.erl35
1 files changed, 18 insertions, 17 deletions
diff --git a/lib/public_key/src/pubkey_pem.erl b/lib/public_key/src/pubkey_pem.erl
index 2979f4e172..a33db4ecf0 100644
--- a/lib/public_key/src/pubkey_pem.erl
+++ b/lib/public_key/src/pubkey_pem.erl
@@ -57,7 +57,8 @@
%% Description: Decodes a PEM binary.
%%--------------------------------------------------------------------
decode(Bin) ->
- decode_pem_entries(split_bin(Bin), []).
+ decode_pem_entries(
+ binary:split(Bin, [<<"\r\n">>, <<"\r">>, <<"\n">>], [global]), []).
%%--------------------------------------------------------------------
-spec encode([public_key:pem_entry()]) -> iolist().
@@ -112,7 +113,8 @@ decode_pem_entries([<<>>], Entries) ->
lists:reverse(Entries);
decode_pem_entries([<<>> | Lines], Entries) ->
decode_pem_entries(Lines, Entries);
-decode_pem_entries([Start| Lines], Entries) ->
+decode_pem_entries([StartLine | Lines], Entries) ->
+ Start = strip_tail_whitespace(StartLine),
case pem_end(Start) of
undefined ->
decode_pem_entries(Lines, Entries);
@@ -121,6 +123,20 @@ decode_pem_entries([Start| Lines], Entries) ->
decode_pem_entries(RestLines, [decode_pem_entry(Start, Entry) | Entries])
end.
+strip_tail_whitespace(Bin) when is_binary(Bin) ->
+ strip_tail_whitespace(lists:reverse(binary:bin_to_list(Bin)));
+strip_tail_whitespace([Char|Rest])
+ when Char == $ ;
+ Char == $\t;
+ Char == $\v;
+ Char == $\f;
+ Char == $\r;
+ Char == $\n ->
+ strip_tail_whitespace(Rest);
+strip_tail_whitespace(List) ->
+ binary:list_to_bin(
+ lists:reverse(List)).
+
decode_pem_entry(Start, [<<"Proc-Type: 4,ENCRYPTED", _/binary>>, Line | Lines]) ->
Type = asn1_type(Start),
Cs = erlang:iolist_to_binary(Lines),
@@ -151,21 +167,6 @@ encode_encrypted_private_keyinfo(EncData, EncryptParmams) ->
public_key:der_encode('EncryptedPrivateKeyInfo',
#'EncryptedPrivateKeyInfo'{encryptionAlgorithm = AlgorithmInfo,
encryptedData = EncData}).
-split_bin(Bin) ->
- split_bin(0, Bin).
-
-split_bin(N, Bin) ->
- case Bin of
- <<Line:N/binary, "\r\n", Rest/binary>> ->
- [Line | split_bin(0, Rest)];
- <<Line:N/binary, "\n", Rest/binary>> ->
- [Line | split_bin(0, Rest)];
- <<Line:N/binary>> ->
- [Line];
- _ ->
- split_bin(N+1, Bin)
- end.
-
b64encode_and_split(Bin) ->
split_lines(base64:encode(Bin)).