xnu_uuid.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /* xnu_uuid.c - transform 64-bit serial number
  2. to 128-bit uuid suitable for xnu. */
  3. /*
  4. * GRUB -- GRand Unified Bootloader
  5. * Copyright (C) 1995,1996,1998,1999,2001,2002,
  6. * 2003, 2009 Free Software Foundation, Inc.
  7. *
  8. * GRUB is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation, either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * GRUB is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
  20. */
  21. #include <grub/types.h>
  22. #include <grub/misc.h>
  23. #include <grub/mm.h>
  24. #include <grub/err.h>
  25. #include <grub/dl.h>
  26. #include <grub/device.h>
  27. #include <grub/disk.h>
  28. #include <grub/fs.h>
  29. #include <grub/file.h>
  30. #include <grub/misc.h>
  31. #include <grub/env.h>
  32. #include <grub/command.h>
  33. #include <grub/i18n.h>
  34. #include <grub/crypto.h>
  35. /* This prefix is used by xnu and boot-132 to hash
  36. together with volume serial. */
  37. static grub_uint8_t hash_prefix[16]
  38. = {0xB3, 0xE2, 0x0F, 0x39, 0xF2, 0x92, 0x11, 0xD6,
  39. 0x97, 0xA4, 0x00, 0x30, 0x65, 0x43, 0xEC, 0xAC};
  40. static grub_err_t
  41. grub_cmd_xnu_uuid (grub_command_t cmd __attribute__ ((unused)),
  42. int argc, char **args)
  43. {
  44. grub_uint64_t serial;
  45. grub_uint8_t *xnu_uuid;
  46. char uuid_string[sizeof ("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")];
  47. char *ptr;
  48. grub_uint8_t ctx[GRUB_MD_MD5->contextsize];
  49. if (argc < 1)
  50. return grub_error (GRUB_ERR_BAD_ARGUMENT, "UUID required");
  51. serial = grub_cpu_to_be64 (grub_strtoull (args[0], 0, 16));
  52. GRUB_MD_MD5->init (&ctx);
  53. GRUB_MD_MD5->write (&ctx, hash_prefix, sizeof (hash_prefix));
  54. GRUB_MD_MD5->write (&ctx, &serial, sizeof (serial));
  55. GRUB_MD_MD5->final (&ctx);
  56. xnu_uuid = GRUB_MD_MD5->read (&ctx);
  57. grub_snprintf (uuid_string, sizeof (uuid_string),
  58. "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
  59. (unsigned int) xnu_uuid[0], (unsigned int) xnu_uuid[1],
  60. (unsigned int) xnu_uuid[2], (unsigned int) xnu_uuid[3],
  61. (unsigned int) xnu_uuid[4], (unsigned int) xnu_uuid[5],
  62. (unsigned int) ((xnu_uuid[6] & 0xf) | 0x30),
  63. (unsigned int) xnu_uuid[7],
  64. (unsigned int) ((xnu_uuid[8] & 0x3f) | 0x80),
  65. (unsigned int) xnu_uuid[9],
  66. (unsigned int) xnu_uuid[10], (unsigned int) xnu_uuid[11],
  67. (unsigned int) xnu_uuid[12], (unsigned int) xnu_uuid[13],
  68. (unsigned int) xnu_uuid[14], (unsigned int) xnu_uuid[15]);
  69. for (ptr = uuid_string; *ptr; ptr++)
  70. *ptr = grub_toupper (*ptr);
  71. if (argc == 1)
  72. grub_printf ("%s", uuid_string);
  73. if (argc > 1)
  74. grub_env_set (args[1], uuid_string);
  75. return GRUB_ERR_NONE;
  76. }
  77. static grub_command_t cmd;
  78. GRUB_MOD_INIT (xnu_uuid)
  79. {
  80. cmd = grub_register_command ("xnu_uuid", grub_cmd_xnu_uuid,
  81. N_("GRUBUUID [VARNAME]"),
  82. N_("Transform 64-bit UUID to format "
  83. "suitable for XNU."));
  84. }
  85. GRUB_MOD_FINI (xnu_uuid)
  86. {
  87. grub_unregister_command (cmd);
  88. }