1%% -*- mode: erlang; tab-width: 4; indent-tabs-mode: 1; st-rulers: [70] -*-
2%% vim: ts=4 sw=4 ft=erlang noet
3%%%-------------------------------------------------------------------
4%%% @author Andrew Bennett <potatosaladx@gmail.com>
5%%% @copyright 2014-2015, Andrew Bennett
6%%% @doc PKCS-7
7%%% See RFC 2315: https://tools.ietf.org/html/rfc2315
8%%% @end
9%%% Created :  22 Jul 2015 by Andrew Bennett <potatosaladx@gmail.com>
10%%%-------------------------------------------------------------------
11-module(jose_jwa_pkcs7).
12
13%% API
14-export([pad/1]).
15-export([unpad/1]).
16
17%%====================================================================
18%% API functions
19%%====================================================================
20
21-spec pad(binary()) -> binary().
22pad(Bin) ->
23	Size = 16 - (byte_size(Bin) rem 16),
24	pad(Size, Bin).
25
26-spec unpad(binary()) -> binary().
27unpad(Data) ->
28	P = binary:last(Data),
29	Size = byte_size(Data) - P,
30	case Data of
31		<< Bin:Size/binary, P >> -> Bin;
32		<< Bin:Size/binary, P, P >> -> Bin;
33		<< Bin:Size/binary, P, P, P >> -> Bin;
34		<< Bin:Size/binary, P, P, P, P >> -> Bin;
35		<< Bin:Size/binary, P, P, P, P, P >> -> Bin;
36		<< Bin:Size/binary, P, P, P, P, P, P >> -> Bin;
37		<< Bin:Size/binary, P, P, P, P, P, P, P >> -> Bin;
38		<< Bin:Size/binary, P, P, P, P, P, P, P, P >> -> Bin;
39		<< Bin:Size/binary, P, P, P, P, P, P, P, P, P >> -> Bin;
40		<< Bin:Size/binary, P, P, P, P, P, P, P, P, P, P >> -> Bin;
41		<< Bin:Size/binary, P, P, P, P, P, P, P, P, P, P, P >> -> Bin;
42		<< Bin:Size/binary, P, P, P, P, P, P, P, P, P, P, P, P >> -> Bin;
43		<< Bin:Size/binary, P, P, P, P, P, P, P, P, P, P, P, P, P >> -> Bin;
44		<< Bin:Size/binary, P, P, P, P, P, P, P, P, P, P, P, P, P, P >> -> Bin;
45		<< Bin:Size/binary, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P >> -> Bin;
46		<< Bin:Size/binary, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P >> -> Bin;
47		_ -> erlang:error({badarg, Data})
48	end.
49
50%%%-------------------------------------------------------------------
51%%% Internal functions
52%%%-------------------------------------------------------------------
53
54%% @private
55pad(P= 1, Bin) -> << Bin/binary, P >>;
56pad(P= 2, Bin) -> << Bin/binary, P, P >>;
57pad(P= 3, Bin) -> << Bin/binary, P, P, P >>;
58pad(P= 4, Bin) -> << Bin/binary, P, P, P, P >>;
59pad(P= 5, Bin) -> << Bin/binary, P, P, P, P, P >>;
60pad(P= 6, Bin) -> << Bin/binary, P, P, P, P, P, P >>;
61pad(P= 7, Bin) -> << Bin/binary, P, P, P, P, P, P, P >>;
62pad(P= 8, Bin) -> << Bin/binary, P, P, P, P, P, P, P, P >>;
63pad(P= 9, Bin) -> << Bin/binary, P, P, P, P, P, P, P, P, P >>;
64pad(P=10, Bin) -> << Bin/binary, P, P, P, P, P, P, P, P, P, P >>;
65pad(P=11, Bin) -> << Bin/binary, P, P, P, P, P, P, P, P, P, P, P >>;
66pad(P=12, Bin) -> << Bin/binary, P, P, P, P, P, P, P, P, P, P, P, P >>;
67pad(P=13, Bin) -> << Bin/binary, P, P, P, P, P, P, P, P, P, P, P, P, P >>;
68pad(P=14, Bin) -> << Bin/binary, P, P, P, P, P, P, P, P, P, P, P, P, P, P >>;
69pad(P=15, Bin) -> << Bin/binary, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P >>;
70pad(P=16, Bin) -> << Bin/binary, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P >>.
71