diff options
Diffstat (limited to 'src/Network/Tox/NodeId.hs')
-rw-r--r-- | src/Network/Tox/NodeId.hs | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/Network/Tox/NodeId.hs b/src/Network/Tox/NodeId.hs index 74239710..dab1b14a 100644 --- a/src/Network/Tox/NodeId.hs +++ b/src/Network/Tox/NodeId.hs | |||
@@ -555,8 +555,14 @@ parseNoSpamJID jid = do | |||
555 | _ -> Left "Hostname should be 43 base64 digits followed by .tox." | 555 | _ -> Left "Hostname should be 43 base64 digits followed by .tox." |
556 | pub <- id2key <$> readEither base64 | 556 | pub <- id2key <$> readEither base64 |
557 | let ustr = Text.unpack u | 557 | let ustr = Text.unpack u |
558 | '$' : b64digits <- Right ustr -- TODO: support 0x prefix also. | 558 | case ustr of |
559 | NoSpam nospam (Just x) <- readEither $ map (\case; '?' -> '0'; c -> c) ustr | 559 | '$' : b64digits -> solveBase64NoSpamID b64digits pub |
560 | '0' : 'x' : hexdigits -> do nospam <- readEither ('0':'x':hexdigits) | ||
561 | return $ NoSpamId nospam pub | ||
562 | |||
563 | solveBase64NoSpamID :: String -> PublicKey -> Either String NoSpamId | ||
564 | solveBase64NoSpamID b64digits pub = do | ||
565 | NoSpam nospam (Just x) <- readEither $ '$' : map (\case; '?' -> '0'; c -> c) b64digits | ||
560 | let nlo = fromIntegral (0x0FFFF .&. nospam) :: Word16 | 566 | let nlo = fromIntegral (0x0FFFF .&. nospam) :: Word16 |
561 | nhi = fromIntegral (0x0FFFF .&. (nospam `shiftR` 16)) :: Word16 | 567 | nhi = fromIntegral (0x0FFFF .&. (nospam `shiftR` 16)) :: Word16 |
562 | sum = x `xor` nlo `xor` nhi `xor` xorsum pub | 568 | sum = x `xor` nlo `xor` nhi `xor` xorsum pub |
@@ -583,7 +589,6 @@ parseNoSpamJID jid = do | |||
583 | let bitpos = q * 6 + p * 2 | 589 | let bitpos = q * 6 + p * 2 |
584 | ac' = ac `xor` shiftR (fromIntegral b `shiftL` 48) bitpos | 590 | ac' = ac `xor` shiftR (fromIntegral b `shiftL` 48) bitpos |
585 | solve ns ac' | 591 | solve ns ac' |
586 | |||
587 | n64' <- solve ns n64 | 592 | n64' <- solve ns n64 |
588 | let nospam' = fromIntegral (n64' `shiftR` 32) | 593 | let nospam' = fromIntegral (n64' `shiftR` 32) |
589 | cksum' = fromIntegral (n64' `shiftR` 16) | 594 | cksum' = fromIntegral (n64' `shiftR` 16) |