static grub_err_t grub_cmd_password (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { grub_err_t err; char *pass; int copylen; if (argc != 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, "two arguments expected"); pass = grub_zalloc (GRUB_AUTH_MAX_PASSLEN); if (!pass) return grub_errno; copylen = grub_strlen (args[1]); if (copylen >= GRUB_AUTH_MAX_PASSLEN) copylen = GRUB_AUTH_MAX_PASSLEN - 1; grub_memcpy (pass, args[1], copylen); err = grub_auth_register_authentication (args[0], check_password, pass); if (err) { grub_free (pass); return err; } grub_dl_ref (my_mod); return GRUB_ERR_NONE; }
grub_err_t grub_normal_set_password (const char *user, const char *password) { grub_err_t err; char *pass; int copylen; pass = grub_zalloc (GRUB_AUTH_MAX_PASSLEN); if (!pass) return grub_errno; copylen = grub_strlen (password); if (copylen >= GRUB_AUTH_MAX_PASSLEN) copylen = GRUB_AUTH_MAX_PASSLEN - 1; grub_memcpy (pass, password, copylen); err = grub_auth_register_authentication (user, check_password, pass); if (err) { grub_free (pass); return err; } grub_dl_ref (my_mod); return GRUB_ERR_NONE; }
static grub_err_t grub_cmd_password (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { grub_err_t err; char *ptr, *ptr2; grub_uint8_t *ptro; struct pbkdf2_password *pass; if (argc != 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, "Two arguments expected."); if (grub_memcmp (args[1], "grub.pbkdf2.sha512.", sizeof ("grub.pbkdf2.sha512.") - 1) != 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, "Incorrect PBKDF2 password."); ptr = args[1] + sizeof ("grub.pbkdf2.sha512.") - 1; pass = grub_malloc (sizeof (*pass)); if (!pass) return grub_errno; pass->c = grub_strtoul (ptr, &ptr, 0); if (*ptr != '.') { grub_free (pass); return grub_error (GRUB_ERR_BAD_ARGUMENT, "Incorrect PBKDF2 password."); } ptr++; ptr2 = grub_strchr (ptr, '.'); if (!ptr2 || ((ptr2 - ptr) & 1) || grub_strlen (ptr2 + 1) & 1) { grub_free (pass); return grub_error (GRUB_ERR_BAD_ARGUMENT, "Incorrect PBKDF2 password."); } pass->saltlen = (ptr2 - ptr) >> 1; pass->buflen = grub_strlen (ptr2 + 1) >> 1; ptro = pass->salt = grub_malloc (pass->saltlen); if (!ptro) { grub_free (pass); return grub_errno; } while (ptr < ptr2) { int hex1, hex2; hex1 = hex2val (*ptr); ptr++; hex2 = hex2val (*ptr); ptr++; if (hex1 < 0 || hex2 < 0) { grub_free (pass->salt); grub_free (pass); return grub_error (GRUB_ERR_BAD_ARGUMENT, "Incorrect PBKDF2 password."); } *ptro = (hex1 << 4) | hex2; ptro++; } ptro = pass->expected = grub_malloc (pass->buflen); if (!ptro) { grub_free (pass->salt); grub_free (pass); return grub_errno; } ptr = ptr2 + 1; ptr2 += grub_strlen (ptr2); while (ptr < ptr2) { int hex1, hex2; hex1 = hex2val (*ptr); ptr++; hex2 = hex2val (*ptr); ptr++; if (hex1 < 0 || hex2 < 0) { grub_free (pass->expected); grub_free (pass->salt); grub_free (pass); return grub_error (GRUB_ERR_BAD_ARGUMENT, "Incorrect PBKDF2 password."); } *ptro = (hex1 << 4) | hex2; ptro++; } err = grub_auth_register_authentication (args[0], check_password, pass); if (err) { grub_free (pass); return err; } grub_dl_ref (my_mod); return GRUB_ERR_NONE; }