Reapply "Update generation of SPDX namespace"

This reverts commit 00dd7da92de7d1d306e935aba4f858bfc851e1b5.

With changes to fix gradle configuration.

Bug: b/281085038
Change-Id: I91f981c400a4a9201bdd8f8292ab42538a375079
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
index 32e3732..370ad69 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -4,8 +4,9 @@
 
 import DependenciesPlugin.Companion.computeRoot
 import java.io.File
-import java.net.URI
 import java.nio.file.Paths
+import java.security.MessageDigest
+import java.util.UUID
 import kotlin.reflect.full.declaredMemberProperties
 import org.gradle.api.JavaVersion
 import org.gradle.api.Plugin
@@ -22,6 +23,7 @@
 import org.gradle.nativeplatform.platform.OperatingSystem
 import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
 
+
 class DependenciesPlugin: Plugin<Project> {
 
   override fun apply(target: Project) {
@@ -81,6 +83,43 @@
   return computeRoot(this.projectDir)
 }
 
+// See https://datatracker.ietf.org/doc/html/rfc4122#section-4.3 for the algorithm.
+fun uuid5(namespace: UUID, name: String): UUID? {
+  val md = MessageDigest.getInstance("SHA-1")
+  md.update(uuidToBytes(namespace))
+  md.update(name.encodeToByteArray())
+  val sha1Bytes = md.digest()
+  // Set version 5 (upper 4 bits of octet 6).
+  sha1Bytes[6] = (sha1Bytes[6].toInt() and 0x0f).toByte()
+  sha1Bytes[6] = (sha1Bytes[6].toInt() or 0x50).toByte()
+  // Set two upper bits of octet 8 to 10.
+  sha1Bytes[8] = (sha1Bytes[8].toInt() and 0x3f).toByte()
+  sha1Bytes[8] = (sha1Bytes[8].toInt() or 0x80).toByte()
+  return uuidFromBytes(sha1Bytes)
+}
+
+private fun uuidFromBytes(data: ByteArray): UUID? {
+  assert(data.size >= 16)
+  return UUID(toNetworkOrder(data, 0), toNetworkOrder(data, 8))
+}
+
+private fun uuidToBytes(uuid: UUID): ByteArray? {
+  val result = ByteArray(16)
+  fromNetworkByteOrder(uuid.mostSignificantBits, result, 0)
+  fromNetworkByteOrder(uuid.leastSignificantBits, result, 8)
+  return result
+}
+
+private fun toNetworkOrder(data: ByteArray, dataIndex: Int): Long {
+  var result: Long = 0
+  for (i in 0..7) result = result shl 8 or (data[dataIndex + i].toInt() and 0xff).toLong()
+  return result
+}
+
+private fun fromNetworkByteOrder(value: Long, dest: ByteArray, destIndex: Int) {
+  for (i in 0..7) dest[i + destIndex] = (value shr (7 - i) * 8 and 0xffL).toByte()
+}
+
 fun Project.header(title : String) : String {
   return "****** ${title} ******"
 }
@@ -176,7 +215,8 @@
 }
 
 fun Project.resolve(
-    thirdPartyDependency: ThirdPartyDependency, vararg paths: String) : ConfigurableFileCollection {
+  thirdPartyDependency: ThirdPartyDependency, vararg paths: String,
+) : ConfigurableFileCollection {
   return files(project.getRoot().resolve(thirdPartyDependency.path).resolveAll(*paths))
 }
 
@@ -275,7 +315,7 @@
   debugVariant: Boolean,
   lib: List<File> = listOf(),
   classpath: List<File> = listOf(),
-  pgInputMap: File? = null
+  pgInputMap: File? = null,
 ) : List<String> {
   return buildList {
     add("python3")
diff --git a/d8_r8/main/build.gradle.kts b/d8_r8/main/build.gradle.kts
index bba3b84..ab4f252 100644
--- a/d8_r8/main/build.gradle.kts
+++ b/d8_r8/main/build.gradle.kts
@@ -15,6 +15,7 @@
 import org.spdx.sbom.gradle.extensions.DefaultSpdxSbomTaskExtension
 
 import com.google.gson.Gson
+import java.util.UUID
 
 plugins {
   `kotlin-dsl`
@@ -47,7 +48,7 @@
 }
 
 if (project.hasProperty("spdxVersion")) {
-  project.version = project.property("spdxVersion")
+  project.version = project.property("spdxVersion")!!
 }
 
 spdxSbom {
@@ -65,7 +66,17 @@
       }
       document {
         name.set("R8 Compiler Suite")
-        namespace.set("https://r8.googlesource.com/r8/-" + project.version + ".jar")
+        // Generate version 5 UUID from fixed namespace UUID and name generated from revision
+        // (git hash) and artifact name.
+        if (project.hasProperty("spdxRevision")) {
+          namespace.set(
+            "https://spdx.google/"
+              + uuid5(
+              UUID.fromString("df17ea25-709b-4edc-8dc1-d3ca82c74e8e"),
+              project.property("spdxRevision").toString() + "-r8"
+            )
+          )
+        }
         creator.set("Organization: Google LLC")
         packageSupplier.set("Organization: Google LLC")
       }