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