Skip to content

Commit c95c7c7

Browse files
committed
Fix VAPID signature
1 parent 075be10 commit c95c7c7

3 files changed

Lines changed: 14 additions & 2 deletions

File tree

src/Simplex/Messaging/Crypto.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ module Simplex.Messaging.Crypto
9595
encodePrivKey,
9696
decodePrivKey,
9797
pubKeyBytes,
98+
encodeBigInt,
9899
uncompressEncodePoint,
99100
uncompressDecodePoint,
100101
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
@@ -107,11 +107,11 @@ mkVapidHeader VapidKey {key, fp} uriAuthority expire = do
107107
{ iss = Nothing,
108108
iat = Nothing,
109109
exp = Just expire,
110-
aud = Just $ T.decodeUtf8 uriAuthority,
110+
aud = Just . T.decodeUtf8 $ "https://" <> uriAuthority,
111111
sub = Just "https://github.com/simplex-chat/simplexmq/"
112112
}
113113
jwt = JWTToken jwtHeader jwtClaims
114-
signedToken <- signedJWTToken key jwt
114+
signedToken <- signedJWTTokenRawSign key jwt
115115
pure $ "vapid t=" <> signedToken <> ",k=" <> fp
116116

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

0 commit comments

Comments
 (0)