@@ -4,12 +4,16 @@ defmodule WebPushElixir do
4
4
@ auth_info "Content-Encoding: auth" <> << 0 >>
5
5
@ one_buffer << 1 >>
6
6
7
- def gen_keypair do
7
+ def gen_key_pair ( ) do
8
8
{ public , private } = :crypto . generate_key ( :ecdh , :prime256v1 )
9
9
10
+ { Base . url_encode64 ( public , padding: false ) , Base . url_encode64 ( private , padding: false ) }
11
+ end
12
+
13
+ def output_key_pair ( { public , private } ) do
10
14
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 } )
13
17
14
18
Logger . info ( % { :subject => "mailto:[email protected] " } )
15
19
end
@@ -76,4 +80,31 @@ defmodule WebPushElixir do
76
80
77
81
cipher_text <> cipher_tag
78
82
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
79
110
end
0 commit comments