Current section

Files

Jump to
jose src jose_jws_alg_ecdsa.erl
Raw

src/jose_jws_alg_ecdsa.erl

%% -*- mode: erlang; tab-width: 4; indent-tabs-mode: 1; st-rulers: [70] -*-
%% vim: ts=4 sw=4 ft=erlang noet
%%%-------------------------------------------------------------------
%%% @author Andrew Bennett <andrew@pixid.com>
%%% @copyright 2014-2015, Andrew Bennett
%%% @doc
%%%
%%% @end
%%% Created : 23 Jul 2015 by Andrew Bennett <andrew@pixid.com>
%%%-------------------------------------------------------------------
-module(jose_jws_alg_ecdsa).
-behaviour(jose_jws).
-behaviour(jose_jws_alg).
-include("jose_jwk.hrl").
%% jose_jws callbacks
-export([from_map/1]).
-export([to_map/2]).
%% jose_jws_alg callbacks
-export([generate_key/2]).
-export([sign/3]).
-export([verify/4]).
%% API
%% Types
-record(jose_jws_alg_ecdsa, {
digest = undefined :: undefined | sha256 | sha384 | sha512
}).
-type alg() :: #jose_jws_alg_ecdsa{}.
-export_type([alg/0]).
-define(ES256, #jose_jws_alg_ecdsa{digest=sha256}).
-define(ES384, #jose_jws_alg_ecdsa{digest=sha384}).
-define(ES512, #jose_jws_alg_ecdsa{digest=sha512}).
%%====================================================================
%% jose_jws callbacks
%%====================================================================
from_map(F = #{ <<"alg">> := <<"ES256">> }) ->
{?ES256, maps:remove(<<"alg">>, F)};
from_map(F = #{ <<"alg">> := <<"ES384">> }) ->
{?ES384, maps:remove(<<"alg">>, F)};
from_map(F = #{ <<"alg">> := <<"ES512">> }) ->
{?ES512, maps:remove(<<"alg">>, F)}.
to_map(?ES256, F) ->
F#{ <<"alg">> => <<"ES256">> };
to_map(?ES384, F) ->
F#{ <<"alg">> => <<"ES384">> };
to_map(?ES512, F) ->
F#{ <<"alg">> => <<"ES512">> }.
%%====================================================================
%% jose_jws_alg callbacks
%%====================================================================
generate_key(?ES256, _Fields) ->
jose_jws_alg:generate_key({ec, <<"P-256">>}, <<"ES256">>);
generate_key(?ES384, _Fields) ->
jose_jws_alg:generate_key({ec, <<"P-384">>}, <<"ES384">>);
generate_key(?ES512, _Fields) ->
jose_jws_alg:generate_key({ec, <<"P-521">>}, <<"ES512">>).
sign(#jose_jwk{kty={KTYModule, KTY}}, Message, #jose_jws_alg_ecdsa{digest=DigestType}) ->
KTYModule:sign(Message, DigestType, KTY).
verify(#jose_jwk{kty={KTYModule, KTY}}, Message, Signature, #jose_jws_alg_ecdsa{digest=DigestType}) ->
KTYModule:verify(Message, DigestType, Signature, KTY).
%%====================================================================
%% API functions
%%====================================================================
%%%-------------------------------------------------------------------
%%% Internal functions
%%%-------------------------------------------------------------------