Skip to content

Commit 359507c

Browse files
committed
Fix VAPID signature
1 parent 814763b commit 359507c

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

src/Simplex/Messaging/Crypto.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ module Simplex.Messaging.Crypto
9494
encodePrivKey,
9595
decodePrivKey,
9696
pubKeyBytes,
97+
encodeBigInt,
9798
uncompressEncodePoint,
9899
uncompressDecodePoint,
99100
uncompressDecodePrivateNumber,

src/Simplex/Messaging/Notifications/Server/Push.hs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,17 @@ signedJWTToken pk (JWTToken hdr claims) = do
8989
jwtEncode = U.encodeUnpadded . LB.toStrict . J.encode
9090
serialize sig = U.encodeUnpadded $ encodeASN1' DER [Start Sequence, IntVal (EC.sign_r sig), IntVal (EC.sign_s sig), End Sequence]
9191

92+
-- | Does it work with APNS ?
93+
signedJWTTokenRawSign :: EC.PrivateKey -> JWTToken -> IO SignedJWTToken
94+
signedJWTTokenRawSign pk (JWTToken hdr claims) = do
95+
let hc = jwtEncode hdr <> "." <> jwtEncode claims
96+
sig <- EC.sign pk SHA256 hc
97+
pure $ hc <> "." <> serialize sig
98+
where
99+
jwtEncode :: ToJSON a => a -> ByteString
100+
jwtEncode = U.encodeUnpadded . LB.toStrict . J.encode
101+
serialize sig = U.encodeUnpadded $ LB.toStrict $ C.encodeBigInt (EC.sign_r sig) <> C.encodeBigInt (EC.sign_s sig)
102+
92103
readECPrivateKey :: FilePath -> IO EC.PrivateKey
93104
readECPrivateKey f = do
94105
-- this pattern match is specific to APNS key type, it may need to be extended for other push providers

src/Simplex/Messaging/Notifications/Server/Push/WebPush.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,11 @@ mkVapidHeader VapidKey {key, fp} uriAuthority expire = do
109109
{ iss = Nothing,
110110
iat = Nothing,
111111
exp = Just expire,
112-
aud = Just $ T.decodeUtf8 uriAuthority,
112+
aud = Just . T.decodeUtf8 $ "https://" <> uriAuthority,
113113
sub = Just "https://github.com/simplex-chat/simplexmq/"
114114
}
115115
jwt = JWTToken jwtHeader jwtClaims
116-
signedToken <- signedJWTToken key jwt
116+
signedToken <- signedJWTTokenRawSign key jwt
117117
pure $ "vapid t=" <> signedToken <> ",k=" <> fp
118118

119119
wpPushProviderClient :: WebPushConfig -> IORef (Maybe WPCache) -> Manager -> PushProviderClient

0 commit comments

Comments
 (0)