@@ -4,12 +4,16 @@ defmodule WebPushElixir do
44 @ auth_info "Content-Encoding: auth" <> << 0 >>
55 @ one_buffer << 1 >>
66
7- def gen_keypair do
7+ def gen_key_pair ( ) do
88 { public , private } = :crypto . generate_key ( :ecdh , :prime256v1 )
99
10+ { Base . url_encode64 ( public , padding: false ) , Base . url_encode64 ( private , padding: false ) }
11+ end
12+
13+ def output_key_pair ( { public , private } ) do
1014 fn ->
11- Logger . info ( % { :public_key => Base . url_encode64 ( public , padding: false ) } )
12- Logger . info ( % { :private_key => Base . url_encode64 ( private , padding: false ) } )
15+ Logger . info ( % { :public_key => public } )
16+ Logger . info ( % { :private_key => private } )
1317
1418 Logger . info ( % { :subject => "mailto:admin@email.com" } )
1519 end
@@ -76,4 +80,31 @@ defmodule WebPushElixir do
7680
7781 cipher_text <> cipher_tag
7882 end
83+
84+ def get_headers ( audience , content_encoding , expiration \\ 12 * 3600 ) do
85+ expiration_timestamp = DateTime . to_unix ( DateTime . utc_now ( ) ) + expiration
86+
87+ public_key = Base . url_decode64! ( System . get_env ( "PUBLIC_KEY" ) , padding: false )
88+ private_key = Base . url_decode64! ( System . get_env ( "PRIVATE_KEY" ) , padding: false )
89+
90+ payload =
91+ % {
92+ aud: audience ,
93+ exp: expiration_timestamp ,
94+ sub: System . get_env ( "SUBJECT" )
95+ }
96+ |> JOSE.JWT . from_map ( )
97+
98+ jwk =
99+ { :ECPrivateKey , 1 , private_key , { :namedCurve , { 1 , 2 , 840 , 10045 , 3 , 1 , 7 } } , public_key , nil }
100+ |> JOSE.JWK . from_key ( )
101+
102+ { _ , jwt } = JOSE.JWS . compact ( JOSE.JWT . sign ( jwk , % { "alg" => "ES256" } , payload ) )
103+
104+ headers ( content_encoding , jwt , System . get_env ( "PUBLIC_KEY" ) )
105+ end
106+
107+ defp headers ( "aesgcm" , jwt , pub ) do
108+ % { "Authorization" => "WebPush " <> jwt , "Crypto-Key" => "p256ecdsa=" <> pub }
109+ end
79110end
0 commit comments