@@ -22,8 +22,7 @@ import fr.acinq.eclair.crypto.Sphinx.RouteBlinding.{BlindedRoute, BlindedRouteDe
2222import fr .acinq .eclair .wire .protocol
2323import fr .acinq .eclair .wire .protocol ._
2424import fr .acinq .eclair .{BlockHeight , CltvExpiry , CltvExpiryDelta , MilliSatoshiLong , ShortChannelId , UInt64 , randomBytes , randomKey }
25- import fr .acinq .eclair .{CltvExpiry , CltvExpiryDelta , MilliSatoshiLong , ShortChannelId , UInt64 , randomBytes , randomKey }
26- import org .json4s .JsonAST ._
25+ import org .json4s .DefaultFormats
2726import org .json4s .jackson .JsonMethods
2827import org .scalatest .funsuite .AnyFunSuite
2928import scodec .bits ._
@@ -453,22 +452,22 @@ class SphinxSpec extends AnyFunSuite {
453452 assert(decryptionError == expected)
454453 }
455454
455+ case class TestVector (encodedFailureMessage : String , hops : Seq [TestHop ])
456+ case class TestHop (sharedSecret : String , encryptedMessage : String )
457+ implicit val formats : DefaultFormats .type = DefaultFormats
458+
456459 test(" attributable error test vector" ) {
457460 val src = Source .fromFile(new File (getClass.getResource(s " /attributable_error.json " ).getFile))
458- try {
459- val testVector = JsonMethods .parse(src.mkString).asInstanceOf [JObject ].values
460- val encodedFailureMessage = ByteVector .fromValidHex(testVector(" encodedFailureMessage" ).asInstanceOf [String ])
461- val expected = FailureMessageCodecs .failureOnionPayload(0 ).decode(encodedFailureMessage.bits).require.value
462- val hops = testVector(" hops" ).asInstanceOf [List [Map [String , String ]]]
463- val sharedSecrets = hops.map(hop => ByteVector32 (ByteVector .fromValidHex(hop(" sharedSecret" )))).reverse
464- val encryptedMessage = hops.map(hop => ByteVector .fromValidHex(hop(" encryptedMessage" ))).last
465- val nodeIds = (1 to 5 ).map(_ => randomKey().publicKey)
466- val Right (DecryptedFailurePacket (originNode, failureMessage)) = AttributableErrorPacket .decrypt(encryptedMessage, sharedSecrets.zip(nodeIds))
467- assert(originNode == nodeIds.last)
468- assert(failureMessage == expected)
469- } finally {
470- src.close()
471- }
461+ val testVector = JsonMethods .parse(src.mkString).extract[TestVector ]
462+ src.close()
463+ val encodedFailureMessage = ByteVector .fromValidHex(testVector.encodedFailureMessage)
464+ val expected = FailureMessageCodecs .failureOnionPayload(0 ).decode(encodedFailureMessage.bits).require.value
465+ val sharedSecrets = testVector.hops.map(hop => ByteVector32 (ByteVector .fromValidHex(hop.sharedSecret))).reverse
466+ val encryptedMessage = testVector.hops.map(hop => ByteVector .fromValidHex(hop.encryptedMessage)).last
467+ val nodeIds = (1 to testVector.hops.length).map(_ => randomKey().publicKey)
468+ val Right (DecryptedFailurePacket (originNode, failureMessage)) = AttributableErrorPacket .decrypt(encryptedMessage, sharedSecrets.zip(nodeIds))
469+ assert(originNode == nodeIds.last)
470+ assert(failureMessage == expected)
472471 }
473472
474473 test(" create blinded route (reference test vector)" ) {
0 commit comments