/// <summary> /// This method takes the required VAPID parameters and returns the required /// header to be added to a Web Push Protocol Request. /// </summary> /// <param name="audience">This must be the origin of the push service.</param> /// <param name="subject">This should be a URL or a 'mailto:' email address</param> /// <param name="publicKey">The VAPID public key as a base64 encoded string</param> /// <param name="privateKey">The VAPID private key as a base64 encoded string</param> /// <param name="expiration">The expiration of the VAPID JWT.</param> /// <returns>A dictionary of header key/value pairs.</returns> public static Dictionary <string, string> GetVapidHeaders(string audience, string subject, string publicKey, string privateKey, long expiration = -1) { ValidateAudience(audience); ValidateSubject(subject); ValidatePublicKey(publicKey); ValidatePrivateKey(privateKey); var decodedPrivateKey = UrlBase64.Decode(privateKey); if (expiration == -1) { expiration = UnixTimeNow() + 43200; } var header = new Dictionary <string, object> { { "typ", "JWT" }, { "alg", "ES256" } }; var jwtPayload = new Dictionary <string, object> { { "aud", audience }, { "exp", expiration }, { "sub", subject } }; var signingKey = ECKeyHelper.GetPrivateKey(decodedPrivateKey); var signer = new JWSSigner(signingKey); var token = signer.GenerateSignature(header, jwtPayload); var results = new Dictionary <string, string> { { "Authorization", "WebPush " + token }, { "Crypto-Key", "p256ecdsa=" + publicKey } }; return(results); }
public void TestGenerateSignature() { var decodedPrivateKey = UrlBase64.Decode(TestPrivateKey); var privateKey = ECKeyHelper.GetPrivateKey(decodedPrivateKey); var header = new Dictionary <string, object>(); header.Add("typ", "JWT"); header.Add("alg", "ES256"); var jwtPayload = new Dictionary <string, object>(); jwtPayload.Add("aud", "aud"); jwtPayload.Add("exp", 1); jwtPayload.Add("sub", "subject"); var signer = new JWSSigner(privateKey); var token = signer.GenerateSignature(header, jwtPayload); var tokenParts = token.Split('.'); Assert.AreEqual(3, tokenParts.Length); var encodedHeader = tokenParts[0]; var encodedPayload = tokenParts[1]; var signature = tokenParts[2]; var decodedHeader = Encoding.UTF8.GetString(UrlBase64.Decode(encodedHeader)); var decodedPayload = Encoding.UTF8.GetString(UrlBase64.Decode(encodedPayload)); Assert.AreEqual(@"{""typ"":""JWT"",""alg"":""ES256""}", decodedHeader); Assert.AreEqual(@"{""aud"":""aud"",""exp"":1,""sub"":""subject""}", decodedPayload); var decodedSignature = UrlBase64.Decode(signature); var decodedSignatureLength = decodedSignature.Length; var isSignatureLengthValid = decodedSignatureLength == 66 || decodedSignatureLength == 64; Assert.AreEqual(true, isSignatureLengthValid); }
/// <summary> /// This method takes the required VAPID parameters and returns the required /// header to be added to a Web Push Protocol Request. /// </summary> /// <param name="audience">This must be the origin of the push service.</param> /// <param name="subject">This should be a URL or a 'mailto:' email address</param> /// <param name="publicKey">The VAPID public key as a base64 encoded string</param> /// <param name="privateKey">The VAPID private key as a base64 encoded string</param> /// <param name="expiration">The expiration of the VAPID JWT.</param> /// <returns>A dictionary of header key/value pairs.</returns> public static Dictionary <string, string> GetVapidHeaders(string audience, string subject, string publicKey, string privateKey, long expiration = -1) { ValidateAudience(audience); ValidateSubject(subject); ValidatePublicKey(publicKey); ValidatePrivateKey(privateKey); byte[] decodedPrivateKey = UrlBase64.Decode(privateKey); if (expiration == -1) { expiration = UnixTimeNow() + 43200; } Dictionary <string, object> header = new Dictionary <string, object>(); header.Add("typ", "JWT"); header.Add("alg", "ES256"); Dictionary <string, object> jwtPayload = new Dictionary <string, object>(); jwtPayload.Add("aud", audience); jwtPayload.Add("exp", expiration); jwtPayload.Add("sub", subject); ECPrivateKeyParameters signingKey = ECKeyHelper.GetPrivateKey(decodedPrivateKey); JWSSigner signer = new JWSSigner(signingKey); string token = signer.GenerateSignature(header, jwtPayload); Dictionary <string, string> results = new Dictionary <string, string>(); results.Add("Authorization", "WebPush " + token); results.Add("Crypto-Key", "p256ecdsa=" + publicKey); return(results); }