From 166440b34b4d6a0c3df707cb6769ade7fe8111f7 Mon Sep 17 00:00:00 2001
From: benthecarman <benthecarman@live.com>
Date: Tue, 5 Jan 2021 08:19:53 -0600
Subject: [PATCH] Update DLC Oracle Signing Algo (#2465)

---
 .../core/protocol/dlc/SigningVersion.scala    | 34 +++++++++++++++++--
 .../org/bitcoins/core/protocol/tlv/TLV.scala  |  7 ++--
 .../oracle/AttestationVerificationTest.scala  |  2 +-
 .../oracle/config/DLCOracleAppConfig.scala    |  4 +--
 4 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/core/src/main/scala/org/bitcoins/core/protocol/dlc/SigningVersion.scala b/core/src/main/scala/org/bitcoins/core/protocol/dlc/SigningVersion.scala
index 31bef5fd32..e87dbc5dfd 100644
--- a/core/src/main/scala/org/bitcoins/core/protocol/dlc/SigningVersion.scala
+++ b/core/src/main/scala/org/bitcoins/core/protocol/dlc/SigningVersion.scala
@@ -72,9 +72,39 @@ object SigningVersion extends StringFactory[SigningVersion] {
     }
   }
 
-  val latest: SigningVersion = BasicSHA256SigningVersion
+  /** V0 DLC Oracle singing algo, specified in https://github.com/discreetlogcontracts/dlcspecs/pull/113 */
+  final case object DLCOracleV0SigningVersion extends SigningVersion {
 
-  val all: Vector[SigningVersion] = Vector(Mock, BasicSHA256SigningVersion)
+    override def calcNonceTweak(
+        nonce: SchnorrNonce,
+        eventName: String): ByteVector = {
+      val bytes = nonce.bytes ++ CryptoUtil.serializeForHash(eventName)
+
+      CryptoUtil.taggedSha256(bytes, "DLC/oracle/nonce/v0").bytes
+    }
+
+    override def calcAnnouncementHash(eventTLV: OracleEventTLV): ByteVector =
+      CryptoUtil
+        .taggedSha256(eventTLV.bytes, "DLC/oracle/announcement/v0")
+        .bytes
+
+    override def calcOutcomeHash(
+        descriptor: EventDescriptorTLV,
+        byteVector: ByteVector): ByteVector = {
+      descriptor match {
+        case _: EnumEventDescriptorV0TLV | _: RangeEventDescriptorV0TLV |
+            _: DigitDecompositionEventDescriptorV0TLV =>
+          CryptoUtil
+            .taggedSha256(byteVector, "DLC/oracle/attestation/v0")
+            .bytes
+      }
+    }
+  }
+
+  val latest: SigningVersion = DLCOracleV0SigningVersion
+
+  val all: Vector[SigningVersion] =
+    Vector(Mock, BasicSHA256SigningVersion, DLCOracleV0SigningVersion)
 
   override def fromStringOpt(str: String): Option[SigningVersion] = {
     all.find(state => str.toLowerCase() == state.toString.toLowerCase)
diff --git a/core/src/main/scala/org/bitcoins/core/protocol/tlv/TLV.scala b/core/src/main/scala/org/bitcoins/core/protocol/tlv/TLV.scala
index 96ab0a9c10..6fafa3499f 100644
--- a/core/src/main/scala/org/bitcoins/core/protocol/tlv/TLV.scala
+++ b/core/src/main/scala/org/bitcoins/core/protocol/tlv/TLV.scala
@@ -777,8 +777,11 @@ case class OracleAnnouncementV0TLV(
     announcementSignature.bytes ++ publicKey.bytes ++ eventTLV.bytes
 
   override def validateSignature: Boolean = {
-    publicKey.verify(CryptoUtil.sha256(eventTLV.bytes).bytes,
-                     announcementSignature)
+    publicKey.verify(
+      CryptoUtil
+        .taggedSha256(eventTLV.bytes, "DLC/oracle/announcement/v0")
+        .bytes,
+      announcementSignature)
   }
 }
 
diff --git a/dlc-oracle-test/src/test/scala/org/bitcoins/dlc/oracle/AttestationVerificationTest.scala b/dlc-oracle-test/src/test/scala/org/bitcoins/dlc/oracle/AttestationVerificationTest.scala
index f4a4fb48a3..11581bd55b 100644
--- a/dlc-oracle-test/src/test/scala/org/bitcoins/dlc/oracle/AttestationVerificationTest.scala
+++ b/dlc-oracle-test/src/test/scala/org/bitcoins/dlc/oracle/AttestationVerificationTest.scala
@@ -9,7 +9,7 @@ class AttestationVerificationTest extends BitcoinSUnitTest {
 
   behavior of "AttestationVerification"
 
-  val signingVersion = SigningVersion.latest
+  val signingVersion = SigningVersion.BasicSHA256SigningVersion
 
   val enumTlv = OracleAnnouncementV0TLV.fromHex(
     """fdd824a350a5f6214e14574bc925a9d5d211961a8e4e9ed8d3cb8dbc7c65d8da767152759e7d8d7646ded432717c8a4616a8fac714
diff --git a/dlc-oracle/src/main/scala/org/bitcoins/dlc/oracle/config/DLCOracleAppConfig.scala b/dlc-oracle/src/main/scala/org/bitcoins/dlc/oracle/config/DLCOracleAppConfig.scala
index ad9c7688ff..b09cc1b13c 100644
--- a/dlc-oracle/src/main/scala/org/bitcoins/dlc/oracle/config/DLCOracleAppConfig.scala
+++ b/dlc-oracle/src/main/scala/org/bitcoins/dlc/oracle/config/DLCOracleAppConfig.scala
@@ -4,7 +4,7 @@ import com.typesafe.config.Config
 import org.bitcoins.core.config.NetworkParameters
 import org.bitcoins.core.crypto.ExtKeyVersion.SegWitMainNetPriv
 import org.bitcoins.core.hd.HDPurpose
-import org.bitcoins.core.protocol.tlv.EventDescriptorTLV
+import org.bitcoins.core.protocol.tlv.EnumEventDescriptorV0TLV
 import org.bitcoins.core.util.FutureUtil
 import org.bitcoins.core.wallet.keymanagement.KeyManagerParams
 import org.bitcoins.crypto.AesPassword
@@ -65,7 +65,7 @@ case class DLCOracleAppConfig(
       if (migrations == 2 || migrations == 3) { // For V2/V3 migrations
         logger.debug(s"Doing V2/V3 Migration")
 
-        val dummyMigrationTLV = EventDescriptorTLV("fdd8060800010564756d6d79")
+        val dummyMigrationTLV = EnumEventDescriptorV0TLV.dummy
 
         val eventDAO = EventDAO()(ec, appConfig)
         for {