bolt4

Onion routing protocol, per BOLT #4 (docs.ppad.tech/bolt4).
git clone git://git.ppad.tech/bolt4.git
Log | Files | Refs | README | LICENSE

commit 18c61f7f7383139dd03474b981f87c0244ab76c6
parent 62af5202761b82a58c373be9e3591e51e8fb95da
Author: Jared Tobin <jared@jtobin.io>
Date:   Sat, 10 Oct 2026 13:50:20 +0400

test: add route-blinding and blinded-payment vectors

From route-blinding-test.json: check the encrypted_data_tlv encoding,
per-hop shared secrets, rho keys and blinded node ids, nextEphemeral,
createBlindedPath output for both sub-paths, and unblinding (decrypted
data, next path key and blinded private key) at every hop.

Bob's and Eve's encrypted_data are not checked: their data carries
unknown odd TLVs, which BlindedHopData cannot represent. The blinded
private key is assembled from exported primitives, as the library
has no function for it.

From blinded-payment-onion-test.json: check that construct reproduces
the spec onion, that every hop forwards exactly the next spec onion
(Carol, Dave and Eve using their blinded private keys), and that each
blinded hop decrypts its data and derives the next path key.

Diffstat:
Mtest/Main.hs | 317+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtest/Vectors.hs | 577+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 894 insertions(+), 0 deletions(-)

diff --git a/test/Main.hs b/test/Main.hs @@ -98,6 +98,8 @@ main = defaultMain $ testGroup "ppad-bolt4" [ onionVectorTests , errorVectorTests , traceVectorTests + , routeBlindingTests + , blindedPaymentTests ] , testGroup "multi-hop" [ multiHopTests @@ -1974,3 +1976,318 @@ traceVectorTests = testGroup "returning errors trace" [ pkt <- unhex V.tracePacket0 unwrapError sss (ErrorPacket pkt) @?= Attributed 4 traceFailure ] + +-- Spec vectors: route-blinding-test.json ----------------------------------- + +-- | Blinded private key HMAC256("blinded_node_id", ss) * k, where +-- ss = ECDH(k, path_key). The library has no function for this, so +-- it is assembled from exported primitives. +blindedPrivKey + :: BS.ByteString -> Secp256k1.Projective -> Maybe BS.ByteString +blindedPrivKey k pathKey = do + SharedSecret ss <- computeSharedSecret k pathKey + let SHA256.MAC tweak = SHA256.hmac "blinded_node_id" ss + blindSecKey k (BlindingFactor tweak) + +rbBobData :: IO BlindedHopData +rbBobData = do + scid <- assertScid 0 0 1729 + pure emptyHopData + { bhdPadding = Just (BS.replicate 26 0) + , bhdShortChannelId = Just scid + , bhdPaymentRelay = Just (PaymentRelay 36 150 10000) + , bhdPaymentConstraints = Just (PaymentConstraints 748005 1500) + , bhdAllowedFeatures = Just BS.empty + } + +rbCarolData :: IO BlindedHopData +rbCarolData = do + scid <- assertScid 0 0 1105 + override <- unhex V.rbDavePathKey + pure emptyHopData + { bhdShortChannelId = Just scid + , bhdNextPathKeyOverride = Just override + , bhdPaymentRelay = Just (PaymentRelay 48 100 500) + , bhdPaymentConstraints = Just (PaymentConstraints 747969 1500) + , bhdAllowedFeatures = Just BS.empty + } + +rbDaveData :: IO BlindedHopData +rbDaveData = do + scid <- assertScid 0 0 561 + pure emptyHopData + { bhdPadding = Just (BS.replicate 35 0) + , bhdShortChannelId = Just scid + , bhdPaymentRelay = Just (PaymentRelay 144 250 0) + , bhdPaymentConstraints = Just (PaymentConstraints 747921 1500) + , bhdAllowedFeatures = Just BS.empty + } + +rbEveData :: IO BlindedHopData +rbEveData = pure emptyHopData + { bhdPadding = Just (BS.replicate 26 0) + , bhdPathId = Just (BS.pack [0xde, 0xad, 0xbe, 0xef]) + , bhdPaymentConstraints = Just (PaymentConstraints 747777 1500) + , bhdAllowedFeatures = Just (BS.cons 0x02 (BS.replicate 14 0)) + } + +-- | A hop of route-blinding-test.json. 'rbUnknown' holds the unknown +-- odd TLVs that the hop's data carries in addition to 'rbData'. +data RbHop = RbHop + { rbData :: !BlindedHopData + , rbUnknown :: ![TlvRecord] + , rbNodeId :: !Secp256k1.Projective + , rbTlvs :: !BS.ByteString + , rbPathPrivKey :: !BS.ByteString + , rbPathKey :: !Secp256k1.Projective + , rbSharedSecret :: !BS.ByteString + , rbRho :: !BS.ByteString + , rbEncrypted :: !BS.ByteString + , rbBlindedNodeId :: !BS.ByteString + , rbNodeKey :: !BS.ByteString + , rbBlindedKey :: !BS.ByteString + , rbNextPathKey :: !Secp256k1.Projective + } + +rbHops :: IO (RbHop, RbHop, RbHop, RbHop) +rbHops = do + bob <- hop rbBobData [TlvRecord 561 (BS.pack [0x12, 0x34, 0x56])] + ( V.rbBobNodeId, V.rbBobTlvs, V.rbBobPathPrivKey, V.rbBobPathKey + , V.rbBobSharedSecret, V.rbBobRho, V.rbBobEncryptedData + , V.rbBobBlindedNodeId ) + (V.rbBobNodeKey, V.rbBobBlindedPrivKey, V.rbBobNextPathKey) + carol <- hop rbCarolData [] + ( V.rbCarolNodeId, V.rbCarolTlvs, V.rbCarolPathPrivKey + , V.rbCarolPathKey, V.rbCarolSharedSecret, V.rbCarolRho + , V.rbCarolEncryptedData, V.rbCarolBlindedNodeId ) + (V.rbCarolNodeKey, V.rbCarolBlindedPrivKey, V.rbCarolNextPathKey) + dave <- hop rbDaveData [] + ( V.rbDaveNodeId, V.rbDaveTlvs, V.rbDavePathPrivKey, V.rbDavePathKey + , V.rbDaveSharedSecret, V.rbDaveRho, V.rbDaveEncryptedData + , V.rbDaveBlindedNodeId ) + (V.rbDaveNodeKey, V.rbDaveBlindedPrivKey, V.rbDaveNextPathKey) + eve <- hop rbEveData [TlvRecord 65535 (BS.pack [0x06, 0xc1])] + ( V.rbEveNodeId, V.rbEveTlvs, V.rbEvePathPrivKey, V.rbEvePathKey + , V.rbEveSharedSecret, V.rbEveRho, V.rbEveEncryptedData + , V.rbEveBlindedNodeId ) + (V.rbEveNodeKey, V.rbEveBlindedPrivKey, V.rbEveNextPathKey) + pure (bob, carol, dave, eve) + where + hop mkData unknown (nid, tlvs, ppk, pk, ss, rho, enc, bid) + (nk, bk, npk) = + RbHop <$> mkData <*> pure unknown <*> unhexPoint nid + <*> unhex tlvs <*> unhex ppk <*> unhexPoint pk <*> unhex ss + <*> unhex rho <*> unhex enc <*> unhex bid <*> unhex nk + <*> unhex bk <*> unhexPoint npk + +routeBlindingTests :: TestTree +routeBlindingTests = testGroup "route-blinding-test.json" [ + testCase "encrypted_data_tlv encoding" $ do + (bob, carol, dave, eve) <- rbHops + mapM_ (\h -> do + -- unknown odd TLVs are the last records in the vectors + encodeBlindedHopData (rbData h) <> encodeTlvStream (rbUnknown h) + @?= rbTlvs h + decodeBlindedHopData (rbTlvs h) @?= Just (rbData h)) + [bob, carol, dave, eve] + + , testCase "per-hop shared secret and rho" $ do + (bob, carol, dave, eve) <- rbHops + mapM_ (\h -> do + ss <- demand "computeSharedSecret" $ + computeSharedSecret (rbPathPrivKey h) (rbNodeId h) + ss @?= SharedSecret (rbSharedSecret h) + deriveBlindingRho ss @?= DerivedKey (rbRho h) + deriveBlindedNodeId ss (rbNodeId h) + @?= Just (rbBlindedNodeId h)) + [bob, carol, dave, eve] + + , testCase "nextEphemeral yields the next path key pair" $ do + (bob, carol, dave, eve) <- rbHops + mapM_ (\(h, nxt) -> do + let ss = SharedSecret (rbSharedSecret h) + nextEphemeral (rbPathPrivKey h) (rbPathKey h) ss + @?= Just (rbPathPrivKey nxt, rbPathKey nxt)) + [(bob, carol), (dave, eve)] + + , testCase "createBlindedPath (Bob -> Carol)" $ do + (bob, carol, _, _) <- rbHops + path <- either (assertFailure . show) pure $ + createBlindedPath (rbPathPrivKey bob) + [(rbNodeId bob, rbData bob), (rbNodeId carol, rbData carol)] + bpIntroductionNode path @?= rbNodeId bob + bpBlindingKey path @?= rbPathKey bob + case bpBlindedHops path of + [b, c] -> do + bhBlindedNodeId b @?= rbBlindedNodeId bob + bhBlindedNodeId c @?= rbBlindedNodeId carol + -- Bob's data in the vector carries an unknown TLV (561) + -- that BlindedHopData cannot represent, so only Carol's + -- encrypted_data can be reproduced. + bhEncryptedData c @?= rbEncrypted carol + _ -> assertFailure "expected 2 blinded hops" + + , testCase "createBlindedPath (Dave -> Eve)" $ do + (_, _, dave, eve) <- rbHops + path <- either (assertFailure . show) pure $ + createBlindedPath (rbPathPrivKey dave) + [(rbNodeId dave, rbData dave), (rbNodeId eve, rbData eve)] + bpIntroductionNode path @?= rbNodeId dave + bpBlindingKey path @?= rbPathKey dave + case bpBlindedHops path of + [d, e] -> do + bhBlindedNodeId d @?= rbBlindedNodeId dave + bhBlindedNodeId e @?= rbBlindedNodeId eve + -- Eve's data carries an unknown TLV (65535); see above. + bhEncryptedData d @?= rbEncrypted dave + _ -> assertFailure "expected 2 blinded hops" + + , testCase "unblinding at each hop" $ do + (bob, carol, dave, eve) <- rbHops + mapM_ (\h -> do + case processBlindedHop (rbNodeKey h) (rbPathKey h) + (rbEncrypted h) of + Left e -> assertFailure ("processBlindedHop: " ++ show e) + Right (dat, npk) -> do + dat @?= rbData h + npk @?= rbNextPathKey h + blindedPrivKey (rbNodeKey h) (rbPathKey h) + @?= Just (rbBlindedKey h)) + [bob, carol, dave, eve] + ] + +-- Spec vectors: blinded-payment-onion-test.json ---------------------------- + +bpBobData :: IO BlindedHopData +bpBobData = do + scid <- assertScid 0 0 1 + pure emptyHopData + { bhdPadding = Just (BS.replicate 32 0) + , bhdShortChannelId = Just scid + , bhdPaymentRelay = Just (PaymentRelay 50 0 10000) + , bhdPaymentConstraints = Just (PaymentConstraints 750150 50) + , bhdAllowedFeatures = Just BS.empty + } + +bpCarolData :: IO BlindedHopData +bpCarolData = do + scid <- assertScid 0 0 2 + override <- unhex V.rbDavePathKey + pure emptyHopData + { bhdShortChannelId = Just scid + , bhdNextPathKeyOverride = Just override + , bhdPaymentRelay = Just (PaymentRelay 75 150 100) + , bhdPaymentConstraints = Just (PaymentConstraints 750100 50) + , bhdAllowedFeatures = Just BS.empty + } + +bpDaveData :: IO BlindedHopData +bpDaveData = do + scid <- assertScid 0 0 3 + pure emptyHopData + { bhdPadding = Just (BS.replicate 34 0) + , bhdShortChannelId = Just scid + , bhdPaymentRelay = Just (PaymentRelay 25 100 0) + , bhdPaymentConstraints = Just (PaymentConstraints 750025 50) + , bhdAllowedFeatures = Just BS.empty + } + +bpEveData :: IO BlindedHopData +bpEveData = do + pathId <- unhex "c9cf92f45ade68345bc20ae672e2012f4af487ed4415" + pure emptyHopData + { bhdPadding = Just (BS.replicate 28 0) + , bhdPathId = Just pathId + , bhdPaymentConstraints = Just (PaymentConstraints 750000 50) + , bhdAllowedFeatures = Just BS.empty + } + +-- | Per hop: (key the onion is encrypted to, onion received, payload +-- without length prefix). +bpRoute :: IO [(BS.ByteString, Secp256k1.Projective, BS.ByteString, + BS.ByteString)] +bpRoute = do + alice <- unhex V.onionNodeKey0 + bob <- unhex V.rbBobNodeKey + -- Carol, Dave and Eve decrypt with their blinded private keys + carol <- unhex V.rbCarolBlindedPrivKey + dave <- unhex V.rbDaveBlindedPrivKey + eve <- unhex V.rbEveBlindedPrivKey + mapM (\(k, pub, onion, pl) -> do + p <- unhexPoint pub + o <- unhex onion + body <- unhex pl >>= unprefix + pure (k, p, o, body)) + [ (alice, V.bpAlicePubKey, V.bpAliceOnion, V.bpAlicePayload) + , (bob, V.bpBobPubKey, V.bpBobOnion, V.bpBobPayload) + , (carol, V.bpCarolPubKey, V.bpCarolOnion, V.bpCarolPayload) + , (dave, V.bpDavePubKey, V.bpDaveOnion, V.bpDavePayload) + , (eve, V.bpEvePubKey, V.bpEveOnion, V.bpEvePayload) + ] + +blindedPaymentTests :: TestTree +blindedPaymentTests = testGroup "blinded-payment-onion-test.json" [ + testCase "construct reproduces the spec onion" $ do + route <- bpRoute + sk <- unhex V.bpSessionKey + ad <- unhex V.bpAssocData + hops <- mapM (\(_, pub, _, body) -> do + hp <- demand "decodeHopPayload" (decodeHopPayload body) + encodeHopPayload hp @?= body + pure (Hop pub hp)) route + expected <- unhex V.bpAliceOnion + case construct sk hops ad of + Left e -> assertFailure ("construct failed: " ++ show e) + Right (pkt, _) -> encodeOnionPacket pkt @?= expected + + , testCase "each hop forwards the spec onion" $ do + route <- bpRoute + ad <- unhex V.bpAssocData + let go [] = assertFailure "no hops" + go ((k, _, onion, body) : rest) = do + pkt <- demand "decodeOnionPacket" (decodeOnionPacket onion) + case (process k pkt ad, rest) of + (Left e, _) -> assertFailure ("process failed: " ++ show e) + (Right (Forward fi), (_, _, next, _) : _) -> do + encodeHopPayload (fiPayload fi) @?= body + encodeOnionPacket (fiNextPacket fi) @?= next + go rest + (Right (Receive ri), []) -> + encodeHopPayload (riPayload ri) @?= body + (Right _, _) -> assertFailure "unexpected result" + go route + + , testCase "blinded hops decrypt their data and next path key" $ do + bobKey <- unhex V.rbBobNodeKey + carolKey <- unhex V.rbCarolNodeKey + daveKey <- unhex V.rbDaveNodeKey + eveKey <- unhex V.rbEveNodeKey + firstPathKey <- unhexPoint V.rbBobPathKey + bobNext <- unhexPoint V.bpBobNextPathKey + carolNext <- unhexPoint V.bpCarolNextPathKey + daveNext <- unhexPoint V.bpDaveNextPathKey + eveNext <- unhexPoint V.bpEveNextPathKey + bobBody <- unhex V.bpBobPayload >>= unprefix + bobHp <- demand "decodeHopPayload" (decodeHopPayload bobBody) + hpCurrentPathKey bobHp @?= Just (Secp256k1.serialize_point firstPathKey) + let encOf pl = do + body <- unhex pl >>= unprefix + hp <- demand "decodeHopPayload" (decodeHopPayload body) + demand "encrypted_recipient_data" (hpEncryptedData hp) + bobData <- bpBobData + carolData <- bpCarolData + daveData <- bpDaveData + eveData <- bpEveData + hops <- sequence + [ (,,,,) bobKey firstPathKey <$> encOf V.bpBobPayload + <*> pure bobData <*> pure bobNext + , (,,,,) carolKey bobNext <$> encOf V.bpCarolPayload + <*> pure carolData <*> pure carolNext + , (,,,,) daveKey carolNext <$> encOf V.bpDavePayload + <*> pure daveData <*> pure daveNext + , (,,,,) eveKey daveNext <$> encOf V.bpEvePayload + <*> pure eveData <*> pure eveNext + ] + mapM_ (\(k, pk, enc, dat, npk) -> + processBlindedHop k pk enc @?= Right (dat, npk)) hops + ] diff --git a/test/Vectors.hs b/test/Vectors.hs @@ -521,3 +521,580 @@ tracePacket0 = BS.concat , "ed4e28f7cd13a7fe3f72a409bc3bdabfe0ba47a6d861e21f64d2fac706dab18b" , "3e546df4" ] + +-- route-blinding-test.json ---------------------------------------------- + +-- | Bob's node id. +rbBobNodeId :: BS.ByteString +rbBobNodeId = + "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c" + +-- | Bob's encoded encrypted_data_tlv. +rbBobTlvs :: BS.ByteString +rbBobTlvs = BS.concat + [ "011a000000000000000000000000000000000000000000000000000002080000" + , "0000000006c10a0800240000009627100c06000b69e505dc0e00fd0231031234" + , "56" + ] + +-- | Path private key at Bob (the session key for the first hop of a path). +rbBobPathPrivKey :: BS.ByteString +rbBobPathPrivKey = + "0202020202020202020202020202020202020202020202020202020202020202" + +-- | Path key at Bob. +rbBobPathKey :: BS.ByteString +rbBobPathKey = + "024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766" + +-- | Shared secret at Bob. +rbBobSharedSecret :: BS.ByteString +rbBobSharedSecret = + "76771bab0cc3d0de6e6f60147fd7c9c7249a5ced3d0612bdfaeec3b15452229d" + +-- | rho key at Bob. +rbBobRho :: BS.ByteString +rbBobRho = "ba217b23c0978d84c4a19be8a9ff64bc1b40ed0d7ecf59521567a5b3a9a1dd48" + +-- | Bob's encrypted_data. +rbBobEncryptedData :: BS.ByteString +rbBobEncryptedData = BS.concat + [ "cd4100ff9c09ed28102b210ac73aa12d63e90852cebc496c49f57c49982088b4" + , "9f2e70b99287fdee0aa58aa39913ab405813b999f66783aa2fe637b3cda91ffc" + , "0913c30324e2c6ce327e045183e4bffecb" + ] + +-- | Bob's blinded node id. +rbBobBlindedNodeId :: BS.ByteString +rbBobBlindedNodeId = + "03da173ad2aee2f701f17e59fbd16cb708906d69838a5f088e8123fb36e89a2c25" + +-- | Carol's node id. +rbCarolNodeId :: BS.ByteString +rbCarolNodeId = + "027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007" + +-- | Carol's encoded encrypted_data_tlv. +rbCarolTlvs :: BS.ByteString +rbCarolTlvs = BS.concat + [ "020800000000000004510821031b84c5567b126440995d3ed5aaba0565d71e18" + , "34604819ff9c17f5e9d5dd078f0a0800300000006401f40c06000b69c105dc0e" + , "00" + ] + +-- | Path private key at Carol (the session key for the first hop of a path). +rbCarolPathPrivKey :: BS.ByteString +rbCarolPathPrivKey = + "0a2aa791ac81265c139237b2b84564f6000b1d4d0e68d4b9cc97c5536c9b61c1" + +-- | Path key at Carol. +rbCarolPathKey :: BS.ByteString +rbCarolPathKey = + "034e09f450a80c3d252b258aba0a61215bf60dda3b0dc78ffb0736ea1259dfd8a0" + +-- | Shared secret at Carol. +rbCarolSharedSecret :: BS.ByteString +rbCarolSharedSecret = + "dc91516ec6b530a3d641c01f29b36ed4dc29a74e063258278c0eeed50313d9b8" + +-- | rho key at Carol. +rbCarolRho :: BS.ByteString +rbCarolRho = "d1e62bae1a8e169da08e6204997b60b1a7971e0f246814c648125c35660f5416" + +-- | Carol's encrypted_data. +rbCarolEncryptedData :: BS.ByteString +rbCarolEncryptedData = BS.concat + [ "cc0f16524fd7f8bb0b1d8d40ad71709ef140174c76faa574cac401bb8992fef7" + , "6c4d004aa485dd599ed1cf2715f57ff62da5aaec5d7b10d59b04d8a9d77e472b" + , "9b3ecc2179334e411be22fa4c02b467c7e" + ] + +-- | Carol's blinded node id. +rbCarolBlindedNodeId :: BS.ByteString +rbCarolBlindedNodeId = + "02e466727716f044290abf91a14a6d90e87487da160c2a3cbd0d465d7a78eb83a7" + +-- | Dave's node id. +rbDaveNodeId :: BS.ByteString +rbDaveNodeId = + "032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e668680991" + +-- | Dave's encoded encrypted_data_tlv. +rbDaveTlvs :: BS.ByteString +rbDaveTlvs = BS.concat + [ "0123000000000000000000000000000000000000000000000000000000000000" + , "0000000000020800000000000002310a060090000000fa0c06000b699105dc0e" + , "00" + ] + +-- | Path private key at Dave (the session key for the first hop of a path). +rbDavePathPrivKey :: BS.ByteString +rbDavePathPrivKey = + "0101010101010101010101010101010101010101010101010101010101010101" + +-- | Path key at Dave. +rbDavePathKey :: BS.ByteString +rbDavePathKey = + "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f" + +-- | Shared secret at Dave. +rbDaveSharedSecret :: BS.ByteString +rbDaveSharedSecret = + "dc46f3d1d99a536300f17bc0512376cc24b9502c5d30144674bfaa4b923d9057" + +-- | rho key at Dave. +rbDaveRho :: BS.ByteString +rbDaveRho = "393aa55d35c9e207a8f28180b81628a31dff558c84959cdc73130f8c321d6a06" + +-- | Dave's encrypted_data. +rbDaveEncryptedData :: BS.ByteString +rbDaveEncryptedData = BS.concat + [ "0fa0a72cff3b64a3d6e1e4903cf8c8b0a17144aeb249dcb86561adee1f679ee8" + , "db3e561d9c43815fd4bcebf6f58c546da0cd8a9bf5cebd0d554802f6c0255e28" + , "e4a27343f761fe518cd897463187991105" + ] + +-- | Dave's blinded node id. +rbDaveBlindedNodeId :: BS.ByteString +rbDaveBlindedNodeId = + "036861b366f284f0a11738ffbf7eda46241a8977592878fe3175ae1d1e4754eccf" + +-- | Eve's node id. +rbEveNodeId :: BS.ByteString +rbEveNodeId = + "02edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145" + +-- | Eve's encoded encrypted_data_tlv. +rbEveTlvs :: BS.ByteString +rbEveTlvs = BS.concat + [ "011a00000000000000000000000000000000000000000000000000000604dead" + , "beef0c06000b690105dc0e0f020000000000000000000000000000fdffff0206" + , "c1" + ] + +-- | Path private key at Eve (the session key for the first hop of a path). +rbEvePathPrivKey :: BS.ByteString +rbEvePathPrivKey = + "62e8bcd6b5f7affe29bec4f0515aab2eebd1ce848f4746a9638aa14e3024fb1b" + +-- | Path key at Eve. +rbEvePathKey :: BS.ByteString +rbEvePathKey = + "03e09038ee76e50f444b19abf0a555e8697e035f62937168b80adf0931b31ce52a" + +-- | Shared secret at Eve. +rbEveSharedSecret :: BS.ByteString +rbEveSharedSecret = + "352a706b194c2b6d0a04ba1f617383fb816dc5f8f9ac0b60dd19c9ae3b517289" + +-- | rho key at Eve. +rbEveRho :: BS.ByteString +rbEveRho = "719d0307340b1c68b79865111f0de6e97b093a30bc603cebd1beb9eef116f2d8" + +-- | Eve's encrypted_data. +rbEveEncryptedData :: BS.ByteString +rbEveEncryptedData = BS.concat + [ "da1a7e5f7881219884beae6ae68971de73bab4c3055d9865b1afb60724a2e4d3" + , "f0489ad884f7f3f77149209f0df51efd6b276294a02e3949c7254fbc8b5cab58" + , "212d9a78983e1cf86fe218b30c4ca8f6d8" + ] + +-- | Eve's blinded node id. +rbEveBlindedNodeId :: BS.ByteString +rbEveBlindedNodeId = + "021982a48086cb8984427d3727fe35a03d396b234f0701f5249daa12e8105c8dae" + +-- | Bob's node private key. +rbBobNodeKey :: BS.ByteString +rbBobNodeKey = + "4242424242424242424242424242424242424242424242424242424242424242" + +-- | Bob's blinded private key. +rbBobBlindedPrivKey :: BS.ByteString +rbBobBlindedPrivKey = + "d12fec0332c3e9d224789a17ebd93595f37d37bd8ef8bd3d2e6ce50acb9e554f" + +-- | Next path key after Bob (override if present). +rbBobNextPathKey :: BS.ByteString +rbBobNextPathKey = + "034e09f450a80c3d252b258aba0a61215bf60dda3b0dc78ffb0736ea1259dfd8a0" + +-- | Carol's node private key. +rbCarolNodeKey :: BS.ByteString +rbCarolNodeKey = + "4343434343434343434343434343434343434343434343434343434343434343" + +-- | Carol's blinded private key. +rbCarolBlindedPrivKey :: BS.ByteString +rbCarolBlindedPrivKey = + "bfa697fbbc8bbc43ca076e6dd60d306038a32af216b9dc6fc4e59e5ae28823c1" + +-- | Next path key after Carol (override if present). +rbCarolNextPathKey :: BS.ByteString +rbCarolNextPathKey = + "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f" + +-- | Dave's node private key. +rbDaveNodeKey :: BS.ByteString +rbDaveNodeKey = + "4444444444444444444444444444444444444444444444444444444444444444" + +-- | Dave's blinded private key. +rbDaveBlindedPrivKey :: BS.ByteString +rbDaveBlindedPrivKey = + "cebc115c7fce4c295dc396dea6c79115b289b8ceeceea2ed61cf31428d88fc4e" + +-- | Next path key after Dave (override if present). +rbDaveNextPathKey :: BS.ByteString +rbDaveNextPathKey = + "03e09038ee76e50f444b19abf0a555e8697e035f62937168b80adf0931b31ce52a" + +-- | Eve's node private key. +rbEveNodeKey :: BS.ByteString +rbEveNodeKey = + "4545454545454545454545454545454545454545454545454545454545454545" + +-- | Eve's blinded private key. +rbEveBlindedPrivKey :: BS.ByteString +rbEveBlindedPrivKey = + "ff4e07da8d92838bedd019ce532eb990ed73b574e54a67862a1df81b40c0d2af" + +-- | Next path key after Eve (override if present). +rbEveNextPathKey :: BS.ByteString +rbEveNextPathKey = + "038fc6859a402b96ce4998c537c823d6ab94d1598fca02c788ba5dd79fbae83589" + +-- blinded-payment-onion-test.json --------------------------------------- + +-- | Session key. +bpSessionKey :: BS.ByteString +bpSessionKey = + "0303030303030303030303030303030303030303030303030303030303030303" + +-- | Associated data. +bpAssocData :: BS.ByteString +bpAssocData = + "4242424242424242424242424242424242424242424242424242424242424242" + +-- | Public key the onion is encrypted to at Alice. +bpAlicePubKey :: BS.ByteString +bpAlicePubKey = + "02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619" + +-- | Alice's payload, with its length prefix. +bpAlicePayload :: BS.ByteString +bpAlicePayload = "14020301ae2d04030b6e5e0608000000000000000a" + +-- | Public key the onion is encrypted to at Bob. +bpBobPubKey :: BS.ByteString +bpBobPubKey = + "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c" + +-- | Bob's payload, with its length prefix. +bpBobPayload :: BS.ByteString +bpBobPayload = BS.concat + [ "740a4fcd7b00ff9c09ed28102b210ac73aa12d63e90852cebc496c49f57c499a" + , "2888b49f2e72b19446f7e60a818aa2938d8c625415b992b8928a7321edb8f7ce" + , "a40de362bed082ad51acc6156dca5532fb680c21024d4b6cd1361032ca9bd2ae" + , "b9d900aa4d45d9ead80ac9423374c451a7254d0766" + ] + +-- | Public key the onion is encrypted to at Carol. +bpCarolPubKey :: BS.ByteString +bpCarolPubKey = + "02e466727716f044290abf91a14a6d90e87487da160c2a3cbd0d465d7a78eb83a7" + +-- | Carol's payload, with its length prefix. +bpCarolPayload :: BS.ByteString +bpCarolPayload = BS.concat + [ "510a4fcc0f16524fd7f8bb0f4e8d40ad71709ef140174c76faa574cac401bb89" + , "92fef76c4d004aa485dd599ed1cf2715f570f656a5aaecaf1ee8dc9d0fa1d424" + , "759be1932a8f29fac08bc2d2a1ed7159f28b" + ] + +-- | Public key the onion is encrypted to at Dave. +bpDavePubKey :: BS.ByteString +bpDavePubKey = + "036861b366f284f0a11738ffbf7eda46241a8977592878fe3175ae1d1e4754eccf" + +-- | Dave's payload, with its length prefix. +bpDavePayload :: BS.ByteString +bpDavePayload = BS.concat + [ "510a4f0fa1a72cff3b64a3d6e1e4903cf8c8b0a17144aeb249dcb86561adee1f" + , "679ee8db3e561d9e49895fd4bcebf6f58d6f61a6d41a9bf5aa4b045343785663" + , "2e8255c351873143ddf2bb2b0832b091e1b4" + ] + +-- | Public key the onion is encrypted to at Eve. +bpEvePubKey :: BS.ByteString +bpEvePubKey = + "021982a48086cb8984427d3727fe35a03d396b234f0701f5249daa12e8105c8dae" + +-- | Eve's payload, with its length prefix. +bpEvePayload :: BS.ByteString +bpEvePayload = BS.concat + [ "6002030186a004030b6dc80a4fda1c7e5f7881219884beae6ae68971de73bab4" + , "c3055d9865b1afb60722a63c688768042ade22f2c22f5724767d171fd221d3e5" + , "79e43b354cc72e3ef146ada91a892d95fc48662f5b158add0af457da12030249" + , "f0" + ] + +-- | Onion received by Alice. +bpAliceOnion :: BS.ByteString +bpAliceOnion = BS.concat + [ "0002531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1f" + , "e337dadf610256c6ab518495dce9cdedf9391e21a71dada75be905267ba82f32" + , "6c0513dda706908cfee834996700f881b2aed106585d61a2690de4ebe5d56ad2" + , "013b520af2a3c49316bc590ee83e8c31b1eb11ff766dad27ca993326b1ed582f" + , "b451a2ad87fbf6601134c6341c4a2deb6850e25a355be68dbb6923dc89444fdd" + , "74a0f700433b667bda345926099f5547b07e97ad903e8a01566a78ae17736623" + , "9e793dac719de805565b6d0a1d290e273f705cfc56873f8b5e28225f7ded7a1d" + , "4ceffae63f91e477be8c917c786435976102a924ba4ba3de6150c829ce01c254" + , "28f2f5d05ef023be7d590ecdf6603730db3948f80ca1ed3d85227e64ef77200b" + , "9b557f427b6e1073cfa0e63e4485441768b98ab11ba8104a6cee1d7af7bb5ee9" + , "c05cf9cf4718901e92e09dfe5cb3af336a953072391c1e91fc2f4b92e124b38e" + , "0c6d17ef6ba7bbe93f02046975bb01b7f766fcfc5a755af11a90cc7eb3505986" + , "b56e07a7855534d03b79f0dfbfe645b0d6d4185c038771fd25b800aa26b2ed2e" + , "30b1e713659468618a2fea04fcd0473284598f76b11b0d159d343bc9711d3bea" + , "8d561547bcc8fff12317c0e7b1ee75bcb8082d762b6417f99d0f71ff7c060f6b" + , "564ad6827edaffa72eefcc4ce633a8da8d41c19d8f6aebd8878869eb518ccc16" + , "dccae6a94c690957598ce0295c1c46af5d7a2f0955b5400526bfd1430f554562" + , "614b5d00feff3946427be520dee629b76b6a9c2b1da6701c8ca628a69d6d40e2" + , "0dd69d6e879d7a052d9c16f544b49738c7ff3cdd0613e9ed00ead7707702d1a6" + , "a0b88de1927a50c36beb78f4ff81e3dd97b706307596eebb363d418a891e1cb4" + , "589ce86ce81cdc0e1473d7a7dd5f6bb6e147c1f7c46fa879b4512c25704da6cd" + , "bb3c123a72e3585dc07b3e5cbe7fecf3a08426eee8c70ddc46ebf98b0bcb14a0" + , "8c469cb5cfb6702acc0befd17640fa60244eca491280a95fbbc5833d26e4be70" + , "fcf798b55e06eb9fcb156942dcf108236f32a5a6c605687ba4f037eddbb1834d" + , "cbcd5293a0b66c621346ca5d893d239c26619b24c71f25cecc275e1ab24436ac" + , "01c80c0006fab2d95e82e3a0c3ea02d08ec5b24eb39205c49f4b549dcab7a889" + , "62336c4624716902f4e08f2b23cfd324f18405d66e9da3627ac34a6873ba2238" + , "386313af20d5a13bbd507fdc73015a17e3bd38fae1145f7f70d7cb8c5e1cdf9c" + , "f06d1246592a25d56ec2ae44cd7f75aa7f5f4a2b2ee49a41a26be4fab3f3f2ce" + , "b7b08510c5e2b7255326e4c417325b333cafe96dde1314a15dd6779a7d5a8a40" + , "622260041e936247eec8ec39ca29a1e18161db37497bdd4447a7d5ef3b8d22a2" + , "acd7f486b152bb66d3a15afc41dc9245a8d75e1d33704d4471e417ccc8d31645" + , "fdd647a2c191692675cf97664951d6ce98237d78b0962ad1433b5a3e49ddddbf" + , "57a391b14dcce00b4d7efe5cbb1e78f30d5ef53d66c381a45e275d2dcf6be559" + , "acb3c42494a9a2156eb8dcf03dd92b2ebaa697ea628fa0f75f125e4a7daa10f8" + , "dcf56ebaf7814557708c75580fad2bbb33e66ad7a4788a7aaac792aaae76138d" + , "7ff09df6a1a1920ddcf22e5e7007b15171b51ff81799355232ce39f7d5ceeaf7" + , "04255d790041d6390a69f42816cba641ec81faa3d7c0fdec59dfe4ca41f31a69" + , "2eaffc66b083995d86c575aea4514a3e09e8b3a1fa4d1591a2505f253ad0b6bf" + , "d9d87f063d2be414d3a427c0506a88ac5bdbef9b50d73bce876f85c196dca435" + , "e210e1d6713695b529ddda3350fb5065a6a8288abd265380917bac8ebbc7d5ce" + , "d564587471dddf90c22ce6dbadea7e7a6723438d4cf6ac6dae27d033a8cadd77" + , "ab262e8defb33445ddb2056ec364c7629c33745e2338" + ] + +-- | Onion received by Bob. +bpBobOnion :: BS.ByteString +bpBobOnion = BS.concat + [ "000280caa47c2a0ea677f6a77529e46caa04212153a8d5f829bee1e7339b17e2" + , "e2a9a3461d10472364a4ff12344beb6df96fb0c38ec47d1e956ddff5a665190f" + , "cca5ed02c3a3903fd8bbd4a4b95b197867c378b67b08f0624cfe80734ba51286" + , "9c0fa22099beb1f6f1ea325b07ce7449736d7ffad79178b428d8ea2d7bc6578f" + , "12dbd788ef933f3b5ba352797c41f6786c3820c96726acf8bddf2cfa5d9c617d" + , "2b0bd5ab7b93f7964c98f44cf47db8422f47d11100236a29579f1cafcd38bd97" + , "9814e1d2bf6d625edf50e1e21bfaf6268e3180dd7aafd3892da281c6dd53c1c3" + , "66d0fdaf670b6ad84a38d6e8a3f4a80d132d686fd3b7443bc2250023bdb93031" + , "90f74c9220481cf99da30b5ec2bdb5a49028f5014e3eaeaa48429a0c78ebd3bb" + , "7c7d582c22b7d547cd269f0c4490373a81bf92687e73dac2075b4bda189ce0be" + , "225f5f510655e37a6e724a1415bede0a076b92a882cc2a82878ba67aaedf7145" + , "4eb42b7f8638df8e21d5f708006e5112e2dc0a4afbcfed9f2c7959be812853ca" + , "8e313fbc99a0f38f1ee4479c96ccb836632b0808401db159bd2637f7a6640132" + , "41e4664e994a0a9a3940115a702c60381e66d291e1ade1be2802e1226e311e32" + , "01a7c9682b6bc4354caff3d439adb1dfee53ad3fb3dd5e169d64796853bb3231" + , "29f41213b166a7cac00f728c3e33bd7e59aa2ac0d1341cdb1532b507a0f446e5" + , "1022a882ac16405442347b70f78c9b6e122f8e70096a4fae4c0405db5b869e0b" + , "7b59b09519c4dbf4d4980483906e837da0bee93f668ffaad37d6a4764211a02f" + , "95ad2dc2d942c198796741c20a3baf8efb5a53bd9c1a0148318d60a97d0013ab" + , "63269097ea295d62c1426d064f0b31c02e74a348ee0509998e701069f5a1e0c1" + , "086aed38d2ec87da69fb57a992d88ace3b4a16b0960f5a94936e2e684a9926cf" + , "4f911969a2a5d31fed0c7616d30197848253170e51274278873b11f3f5cc1b04" + , "b14aa5812524e4d86cbf08306c2aa671288324d7a009b2be533b1d7d0ce6defe" + , "eb630b86a9655f1e6424fcb559ed67457c115fba0d0719374802ea68fab299fd" + , "3f273be86fa3d2e7456020db2f47c6ec16c21ce6ec65de495e20af1941a5dcd6" + , "5d910c1cb93f22e1318c173c645c81aed681c9704a8a541ac3d6ff604f46d026" + , "0468acbfec1b771b9eb8cd49a2124468dae786571895a569aae18438eaee6343" + , "ab2634823119fa2439634645d12e3b4a748b9cc0398b8416a834eb5d9e5cf619" + , "bbfaba4894d1c574c738caf530d0862f4cc75eb52bd3921d2d9edb09940edb1e" + , "3776423b0046d870ccdcc5d61f72e0440b97a93eeef21fb246a779d339be301a" + , "5971400749d6cc9911dfbf9de8ae86fac83c860fdd0e2bfa40af37c99d50e50f" + , "d6e5ae86597a201112ed404042b55e132f243dec481a2adc1d5e4b71e1efdea8" + , "06ea900b2907ce877742d5ecf700ff3640f737863d0dd7207e462ee8d0e17d52" + , "047a88ae7446f419560d23968bf64957949e36953155b0ac2511c66be2890b40" + , "36329a21e132efb635297a64431899e0c351e50c6682c9b4d79b5d122466d02c" + , "d84f206369417d9c194a9349d3c631d72eb7857a9cd542906fc02ad6cdcf9bcf" + , "25ace3d826b6623fa5164351e14d3f0de5c8445a2ba3aae26595d0e31c3e307c" + , "1d56d4274f61f056145c1b8d6880872b9b10a8bfa4a923cad2edbcf5c50eba48" + , "936ed2bcc0be60eb721a74b46704aaae5ad24e2797852195dfacbb30a777d33b" + , "63d4dc4f35cfbe5e88fd1944c55a54fd53581446ea061ad29f4671da819ad748" + , "8c5dfc700f5f7a1b2af0d6a6e9d9ffc570a6d3209614ab4dc43728f3f0cd7eb4" + , "ce36ccd98936bbcbd32627384434bd01e9c0f93b2a5173fba184685e19b9af78" + , "afe876aa4e4b4242382b293133771d95a2bd83fa9c62" + ] + +-- | Next path key after Bob. +bpBobNextPathKey :: BS.ByteString +bpBobNextPathKey = + "034e09f450a80c3d252b258aba0a61215bf60dda3b0dc78ffb0736ea1259dfd8a0" + +-- | Onion received by Carol. +bpCarolOnion :: BS.ByteString +bpCarolOnion = BS.concat + [ "000288b48876fb0dc0d7375233ccaf2910dc0dc81ba52e5a7906f00d75e0d58d" + , "bd4bb7c2714870529410735f0951e72cbe981e2e167c0d8f3de33a36e39e7846" + , "5aea2acad1e23c78b6fd342d63e37d214c912b4a0be344618f779138edc1b42a" + , "5ca3218ca2fea4be427f6cd0d387160db2bf6c2ba8e82941c8cf3626bd6bed71" + , "87f633012ef49df38f6b12963cb639e9eed1b9d269dcebcbd0b25287aa536ec8" + , "5e7320b02e193122199a745ccbaaebd37f5d4b71f52f9b50feeb793eeef56924" + , "a046bc5e7003f6253e0284a8d3fe2e42c3564050f1e753cd32cc258ac0ffa6e0" + , "5eecad5ba1286f78252e60dd884a65405ab673a85ba52adfa65c1086d4bb37ba" + , "2e0848adb2b04379775ad798492b14e8997f30ffa9cf5d432bdf5b246fce008f" + , "d876399beed827db58195f4f6192f6ff4ec63cb17fdcb497cb7aec26846a71dd" + , "8dca02fc3bb14dd7231a4d62a981bec54b71eb20331096dfa214a0ff4489ee96" + , "db663826ae8c850e9f06baa52a47b8eb576363f97e742aab2dc616acc6e74588" + , "e1d2ac16694febc90abaf5b1c684163c0e615a68d32633f01934adc8c6bf91fa" + , "3fd7aad033b7596d60402494e45e2c1632c40f7bfbd88a81a896a1d28ed6338c" + , "83e1eeaa467945d59998eb456c95f94bf1892e8f326ec2d5e0196b7073f106fe" + , "bc6ab8ca5bcc23f77ffc819bc1b5debce418ccc7d8391bbf33bceee6110beba1" + , "70121bd99f54c956e64970bdab31227b03ee0ea3f01fbd9bd74015f6f82d04fa" + , "b072e8f85f4370d09f41ee3e48eb959767bd989abb4eea42c4daa0437a7f747d" + , "7f9b70eb87b9f9b0b6f283b8205912601a432999b8869fd9fe5bad3572edac24" + , "da7184f9298f21ff60923db277264d29c846dd2f228f6fc53b6b60364237de64" + , "773f803f174ed10229c374f603ccc5fd3a62cb413ffe6f5630dc646bb33f231b" + , "2350537ec39e5d3f2fe1a1cb019ed0b18ad14019cad27afcca8ad70387ca1103" + , "94c0432774f1aa1fa404b2e086c84a55388d3bd102501c78ef925cce89d76fa0" + , "4c3f20f2d1f0ce507ac8b37b7913e3949ba12bbc5a4f6bac37c2415622d365bc" + , "8b83709a28e3d46f3850c89a3ff4d027fef6e3e4ce5c6c85f663c7eaec3c9730" + , "106fb82f53249a905533cfabee812aae51965b24b42f7ab471967bc8e73354e6" + , "9141ee26a1f03684d5fb9c256a34de8257210e0390dd3962db521ae0a3bdab28" + , "300610ab2a634b699e5f092da5a061609ef6414bd805c8171f54ad6f285fb64c" + , "e0becca0b61188badcf8ef21190dad629e3fb3e89f55ebba829919540ebf5f8a" + , "e4283836d3c9133c1ca3365f6b9394916730411650686e0c2ab9c53b6cda9efd" + , "d5cfcb53ba9b6962bb6aa49d0a83a87460b60a9c7d2643ee99afe652883795f1" + , "4014ec5df61b1e30c041c1fa6487f3c82f1ded5f83ffbef5017e197b7fb77be3" + , "b36e284a15e57d45bf9316dcaf97eb78ee4642b731ba05c5063bce1333fab4af" + , "6da97c80a96ee599b4df823efbedc250c0abba9783da7ddf2414b2a4774ff288" + , "0a7dc6791103e18b8631e39743cf9e87aed71700daa5dc72fdae520324741f92" + , "ea3d510ff555dea5e45f15cda87272d4559a12d4777680acb06993840e3c748d" + , "a82c16cae556015fb2acd0335da11a3388575394048ab71199793ab706abc9d6" + , "8add2075d79a5cc0f779845ee8b98951be61fd293d6c15b9d4653935bf17cf50" + , "bd31f8b79e60dba0e7fd6864754fd94262485a4f65e7eb3e1922f51b1a4dd2b4" + , "fd2c20d94d1213fbe90bd603dfc7e15176382e3ce0f43f980d44d23bf3c57f54" + , "a15f42c171a8f2511e28ac178c6f01396e50397a57ffb09c5e6c315bd3ae7983" + , "577c1a0386c6d5d9a2223438e321b0fedfdee58fa452d57dc11a256834bb49ac" + , "9deeec88e4bf563c7340f44a240caec941c7e50f09cf" + ] + +-- | Next path key after Carol. +bpCarolNextPathKey :: BS.ByteString +bpCarolNextPathKey = + "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f" + +-- | Onion received by Dave. +bpDaveOnion :: BS.ByteString +bpDaveOnion = BS.concat + [ "0003f25471c0f2ff549a7fd7859100306bb6c294c209f34c77f782897f184b96" + , "7c498efc246bdb8e060a6d1cf8dd0d4d732e33311fb96c9e9f1274005fa3d08b" + , "41704a1b7224c6300a7caead7baa0a8263eba2e0de6956ee8e4a1958264f47e4" + , "cf20d194eb576f5bd249ee4fece563f80fd76dc3eaca8f956188406d83195752" + , "b5c90c4b2a5e7ac3a8d5c62b17b551aff48ef6842a7e9326832c9a4a2fd41501" + , "1150a9e71beb901fd9747bac8add1c694b612730dc86b5b19a0bbbc675947a95" + , "3316e3303d7b30c182f94def9206671edac9a3ec3e52d28fc28247a1c73ab751" + , "bf61c82c3950f617e758f79bd0ba294defb20466eaf1e801462046baad3aec3e" + , "5b8868a7b037f23d73a47a7e74c77107334f37388cff863e452820c61d89728f" + , "a75c84bc7cdfc06dcdd1911f5f803353926d073efd65251380e174913aae0331" + , "8ea5b6f0ec83998c55ab99bef62803ea2da9f6d1ea892b90efc4f8ffb685a520" + , "1a781da2e6ac5923645638c9709ae32171a00c0cd3d8c7eedfb06b4eedc7d3e5" + , "66987e2e3805a038f21d78ded5d6c7137a5e8e592f3180ee4d5f4e1289176f67" + , "fc38690d0958bc82e240b72b10577f340f1e14b8633f0b6d9729ff4618be2a97" + , "2400a015a871ba33be70335f652a8d70f2bd32421d6ac2af781d667dad787d6a" + , "ef4505a15d046579e46eebe757444cffca6d0610f0dd36a7ce57af969bd0c3f7" + , "006298ef406a25f689daf58f875d44d2423ebf195b503f11c37c506ea6abe50a" + , "463f7bb5e9b964604d832724de768513f6b38bf71715e1feea8a6e86797788d4" + , "87146891564919da1372016ed8f08c7fcbff66a4a65a3d0fcd8e3daac6eba41f" + , "5d65ef2d8075364a9e78b3a273549f6eac4abb72e912e237990367e0d43e8994" + , "5f8ac3907be5a6c662139485a50cb5ce3f0ba08586c39f6c515368ec3f91b722" + , "95f1b7a73a9df322ae9a45d363d6c616be3300083764cbdee31221f25a318f09" + , "5feacb09f957c96db30fccca47a0215b576c3ed925a0bad05d6400abe318c11f" + , "36628c387a4ee38832182cd44b3cd48e5422c1f1e3b57218dfe72c611f541512" + , "7720e60f6e2400607e61841b76de1704bcbeb0daf1377ccb2253916de2b6d490" + , "bb71ba0a44fea2e94f2423d723934557d5905e01b2b80232a884e258d46dc92e" + , "a11e0818d0ece5b914f02049866e151801ab8c9aea155479b354dc91151fb9ba" + , "43277458f9760dd859faaa139e3b9ab36a1dbc36a93ef2c90598b20cb30ef3c4" + , "f23a2d6178b4d1da668fb328a25d84d30a132d9f2a6a988cbe2e5c2be01cb6db" + , "4b4725a50d6cdacf5fb083e7d650a25bec1407fbc047d26076c7596429a29606" + , "ad527e97ef0824ad6c1b05831a3e5b71c63a528918a3301cdd4061fc1fcce3da" + , "601961f2602a2b002ac8404125c2d52666263858a923e197efcda873c32d8689" + , "7352e4f2264ad6a1b48acc0fe78ff55cb442cb2bb5fa2880810e1d00aa024705" + , "7fb80b7ed36cf9647af41b44ee4a63ee2d6f652526404572520a7d2d9dcde4e6" + , "2df0c3be89f8471550594cdd16a51a9cacc58729c092c68506162fe65edc2314" + , "055d389f724ced189d826a546b5c4d08a43d977b3cf033de5760b71a7cc38ee5" + , "851592031aafb467a89b3b6c7ed67b15d44c48d6baedce3e95e08ec7c55038f3" + , "eba90ccb900895734f0fb7efe54961ce493369cc56416898a9bed7c2482871c1" + , "5a7f1eb5ed17c33657fc31333539c2dfb59461af09e7049228113b5c9feea5a6" + , "e9959c18c51b19c90995afb9c76f2c0c820964cd7989c993a73925818a656c6a" + , "18dcd1a1e3782b2eae06dd5a41250ec2d1c203626ab9920c1673339eff04b1eb" + , "0cab85ef5909f571f9b83cdf21697c9f5cfa1c76e7bca955510e2126b3bb989a" + , "4ac21cf948f965e48bc363d2997437797b4f770e8b65" + ] + +-- | Next path key after Dave. +bpDaveNextPathKey :: BS.ByteString +bpDaveNextPathKey = + "03e09038ee76e50f444b19abf0a555e8697e035f62937168b80adf0931b31ce52a" + +-- | Onion received by Eve. +bpEveOnion :: BS.ByteString +bpEveOnion = BS.concat + [ "0002ef43c4dfe9aee14248c445406ac7980474ce106c504d9025f57963739130" + , "adfd06eb26201baee8866af2d1b7a7ab26595349dad002af0590193aaa8f400a" + , "b394f5994ec831aeeecb64421c566e3556cbdd7e7e50deb1fc49fd5e007308ab" + , "6494415514abff978899623f9b6065ca1e243bb78170118e8b8c8b53b750b59c" + , "c1ec017d167adbb3aabab7c2d84fbf94f5d827239f4c2b9d2c3cfe68fe5641f2" + , "5e386202a4b6edff2a71e700229df7230c8ca31bd5588f04799e9640c9c20a47" + , "cba713f3cc5ad3202e14bb520880f2a8409d8e7835cae21b48a651c2d47fe6af" + , "785889ab98f1416f6e4ad67a66ae681e9a8828bad3f9b6890221c4a7ec80531d" + , "6b63eb30843f613ce644795bc8bcee60e8f7b36f3fd04de762f103c52efaf36a" + , "2f3bbbaac482d6271dc4180c10bcc076c04d06ea7fd8fb6a647e0e10523b05da" + , "2d89e4139fb55c2315cd01bdcbd57587fef8442d7ff5620630fd2d2e79739d90" + , "be811bf2cba60415d6cba2cea14ba1859f3122cd905c4e12e3e2a1ab6fab54b2" + , "ec40e434626e2d3c3195c02c82a8bd64d226c2328ac72ca12197d9908eaf5433" + , "3717448ce6ed73adc0ac05e2ee1d735131d87918beb8995993dc8f63fe10f2c8" + , "eba2be7ab8bb44d9f78f59ef3e4c180bd75e4eef2381450c6f0480d543997305" + , "f1d07815993b5aca8d88d474966d9abec93bb069a16aa2da75b87f94576e01d0" + , "8a17d3e0e3d0370f010733a7d7affb12cdf94c259a62607fce71003535c47273" + , "05de5ff7bba3840922844b3a45f62c29715fccf440517ef121450f6962396fba" + , "9b07036d085582405dcae6ee95964b66bc7c85b8d02d90091500db3cebf6de58" + , "4f86b7b55335a8c9aa26381b00747f055cc458a2cadfccf9c29702bf941447be" + , "aca6583cca09492a57d4b03b2ca00dbaf41dfd6a9b249381626a7debe475735a" + , "7e39e77a363eccf14669046f656cc09ad448da8d8b545e6a604f46dc481786d0" + , "9a94c63cf23f49ba367d2929466364dbce2a8ffce3dadf8f4cef8a56e1fefa1a" + , "3304a953fe83018e57d8a95694b02d994fea2630a9a3d5f1e2f6d6142d503ec4" + , "152871f7122d7e566a03261f554639e7a759e0e73846f71d5cace37d91336fc9" + , "ca9396bf64ca2cf45fa2db779b3b5c63b04f1c0c1fb79fdfcf5a82b0202df934" + , "ae1720a7ce1e047cbec3f82737b50168c974f4623cacce87e3f5bd5232caca79" + , "56d28ffedcf11ac5998662c5f6b13c6126584ca2e894d3fcbad4d130bbe22e88" + , "a135e0020cdd43853e0b3af3800e9544854d211e873cf68ab683578d501d69ec" + , "5dc7fce42ac436d58243880c1b88227b0681c6c9dd8a8ad0793202b15ab63b78" + , "7b748e258da3e68d0e649fc4ac081a71de8adbc891c113d5f722686b6ac4ed9e" + , "3cc247bc4a4643416f480627e9de20f7307f434a499f5c6951c2e8b3ff51d455" + , "bf65ceb5ee3dee47b968ac2642e13d8a68f903b73627c2e75788fecca5836371" + , "a908eea4f1ea44db2315bc185f77e478efeaaa4da2da13fe7aeaa79ed1d04876" + , "a8b2b7b333c5de8c4c9a50274c2eb7b9bd2a3630c57173174781fc9785235f83" + , "0cefa1c82080eaffdef257f18eedc9ddfd25a696a11a3dc56cd836be72f5f4a2" + , "cbb6316d5d3b1ad91a7ec7d877f28d2c29a5525b0b24362699281b0e3b48f38c" + , "af1085045fe9089f9e6fb29e4b47aa4cecf68c9bf72073469bd9beeea5e88bfe" + , "554cb6a81231149ba7fe7784c154fd8b0f9179ecdf1e9fd5c2939ec1ab16df9c" + , "be9359101ebce933d4f65d3f66f87afaecfe9c046b52f4878b6c430329df7bd8" + , "79fba8864fcbd9b782bf545734699b9b5a66b466dcedc0c9368803b5b0f12329" + , "50cef398ad3e057a5db964bd3e5c8a5717b30b41601a4f11ad63afe404cb6f1e" + , "8ea5fd7a8e085b65ca5136146febf4d47928dcc9a9e0" + ] + +-- | Next path key after Eve. +bpEveNextPathKey :: BS.ByteString +bpEveNextPathKey = + "038fc6859a402b96ce4998c537c823d6ab94d1598fca02c788ba5dd79fbae83589"