m/p/msguid: init

Adds a new msguid package which contains functions for encoding and
decoding Microsoft's mixed-endian GUID/UUID format. This format is
used by Microsoft as well as a bunch of UEFI-related standards.

Change-Id: Icca8ef7ad7f7359808ea7f19e3824639f7b1e2eb
Reviewed-on: https://review.monogon.dev/c/monogon/+/1849
Tested-by: Jenkins CI
Reviewed-by: Serge Bazanski <serge@monogon.tech>
diff --git a/metropolis/pkg/msguid/msguid.go b/metropolis/pkg/msguid/msguid.go
new file mode 100644
index 0000000..4074f8a
--- /dev/null
+++ b/metropolis/pkg/msguid/msguid.go
@@ -0,0 +1,25 @@
+// Package msguid provides functions to convert UUIDs/GUIDs to and from
+// Microsoft's idiosyncratic "mixed-endian" format.
+// See https://uefi.org/specs/UEFI/2.10/Apx_A_GUID_and_Time_Formats.html#text-representation-relationships-apxa-guid-and-time-formats
+// for an explanation of the format.
+package msguid
+
+import "github.com/google/uuid"
+
+var mixedEndianTranspose = []int{3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15}
+
+// From converts from a standard UUID into its mixed-endian encoding.
+func From(u uuid.UUID) (o [16]byte) {
+	for dest, from := range mixedEndianTranspose {
+		o[dest] = u[from]
+	}
+	return
+}
+
+// To converts a mixed-endian-encoded UUID to its standard format.
+func To(i [16]byte) (o uuid.UUID) {
+	for from, dest := range mixedEndianTranspose {
+		o[dest] = i[from]
+	}
+	return
+}