Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
dadigang
Ventoy
Commits
c6bd857c
Commit
c6bd857c
authored
Jan 01, 2023
by
longpanda
Browse files
Support BSD style for .md5/.sha1/.sh256/.sha512 checksum file.
Support VENTOY_CHECKSUM file for checksum file. (#2112)
parent
b4bb6efd
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
410 additions
and
50 deletions
+410
-50
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
+94
-0
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
+272
-0
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
+14
-0
INSTALL/grub/checksum.cfg
INSTALL/grub/checksum.cfg
+30
-50
No files found.
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
View file @
c6bd857c
...
@@ -115,6 +115,92 @@ int ventoy_str_all_digit(const char *str)
...
@@ -115,6 +115,92 @@ int ventoy_str_all_digit(const char *str)
return
1
;
return
1
;
}
}
int
ventoy_str_all_alnum
(
const
char
*
str
)
{
if
(
NULL
==
str
||
0
==
*
str
)
{
return
0
;
}
while
(
*
str
)
{
if
(
!
grub_isalnum
(
*
str
))
{
return
0
;
}
}
return
1
;
}
int
ventoy_str_len_alnum
(
const
char
*
str
,
int
len
)
{
int
i
;
int
slen
;
if
(
NULL
==
str
||
0
==
*
str
)
{
return
0
;
}
slen
=
grub_strlen
(
str
);
if
(
slen
<=
len
)
{
return
0
;
}
for
(
i
=
0
;
i
<
len
;
i
++
)
{
if
(
!
grub_isalnum
(
str
[
i
]))
{
return
0
;
}
}
if
(
str
[
len
]
==
0
||
grub_isspace
(
str
[
len
]))
{
return
1
;
}
return
0
;
}
char
*
ventoy_str_basename
(
char
*
path
)
{
char
*
pos
=
NULL
;
pos
=
grub_strrchr
(
path
,
'/'
);
if
(
pos
)
{
pos
++
;
}
else
{
pos
=
path
;
}
return
pos
;
}
int
ventoy_str_chrcnt
(
const
char
*
str
,
char
c
)
{
int
n
=
0
;
if
(
str
)
{
while
(
*
str
)
{
if
(
*
str
==
c
)
{
n
++
;
}
str
++
;
}
}
return
n
;
}
int
ventoy_strcmp
(
const
char
*
pattern
,
const
char
*
str
)
int
ventoy_strcmp
(
const
char
*
pattern
,
const
char
*
str
)
{
{
while
(
*
pattern
&&
*
str
)
while
(
*
pattern
&&
*
str
)
...
@@ -146,6 +232,14 @@ int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n)
...
@@ -146,6 +232,14 @@ int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n)
return
(
int
)(
grub_uint8_t
)
*
pattern
-
(
int
)(
grub_uint8_t
)
*
str
;
return
(
int
)(
grub_uint8_t
)
*
pattern
-
(
int
)(
grub_uint8_t
)
*
str
;
}
}
grub_err_t
ventoy_env_int_set
(
const
char
*
name
,
int
value
)
{
char
buf
[
16
];
grub_snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
value
);
return
grub_env_set
(
name
,
buf
);
}
void
ventoy_debug_dump_guid
(
const
char
*
prefix
,
grub_uint8_t
*
guid
)
void
ventoy_debug_dump_guid
(
const
char
*
prefix
,
grub_uint8_t
*
guid
)
{
{
int
i
;
int
i
;
...
...
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
View file @
c6bd857c
...
@@ -158,6 +158,8 @@ const char *g_menu_prefix[img_type_max] =
...
@@ -158,6 +158,8 @@ const char *g_menu_prefix[img_type_max] =
"iso", "wim", "efi", "img", "vhd", "vtoy"
"iso", "wim", "efi", "img", "vhd", "vtoy"
};
};
static const char *g_lower_chksum_name[] = { "md5", "sha1", "sha256", "sha512" };
static int g_vtoy_secondary_need_recover = 0;
static int g_vtoy_secondary_need_recover = 0;
static int g_vtoy_load_prompt = 0;
static int g_vtoy_load_prompt = 0;
...
@@ -6292,6 +6294,274 @@ static grub_err_t ventoy_cmd_load_menu_lang(grub_extcmd_context_t ctxt, int argc
...
@@ -6292,6 +6294,274 @@ static grub_err_t ventoy_cmd_load_menu_lang(grub_extcmd_context_t ctxt, int argc
VENTOY_CMD_RETURN(0);
VENTOY_CMD_RETURN(0);
}
}
static grub_err_t ventoy_cmd_vtoychksum_exist(grub_extcmd_context_t ctxt, int argc, char **args)
{
int cnt;
char c;
char *pos = NULL;
(void)ctxt;
(void)argc;
cnt = ventoy_str_chrcnt(args[1], '/');
if (cnt > 1)
{
pos = grub_strrchr(args[1], '/');
c = *pos;
*pos = 0;
if (ventoy_check_file_exist("%s%s/VENTOY_CHECKSUM", args[0], args[1]))
{
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
*pos = c;
}
if (ventoy_check_file_exist("%s/VENTOY_CHECKSUM", args[0]))
{
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
return 1;
}
static int ventoy_chksum_pathcmp(int chktype, char *rlpath, char *rdpath)
{
char *pos1 = NULL;
char *pos2 = NULL;
if (chktype == 2)
{
pos1 = ventoy_str_basename(rlpath);
pos2 = ventoy_str_basename(rdpath);
return grub_strcmp(pos1, pos2);
}
else if (chktype == 3 || chktype == 4)
{
if (grub_strcmp(rlpath, rdpath) == 0 || grub_strcmp(rlpath + 1, rdpath) == 0)
{
return 0;
}
}
return 1;
}
static int ventoy_find_checksum
(
grub_file_t file,
const char *uname,
int retlen,
char *path,
int chktype,
char *chksum
)
{
int ulen;
char *pos = NULL;
char *pos1 = NULL;
char *pos2 = NULL;
char *buf = NULL;
char *currline = NULL;
char *nextline = NULL;
ulen = (int)grub_strlen(uname);
/* read file to buffer */
buf = grub_malloc(file->size + 4);
if (!buf)
{
return 1;
}
grub_file_read(file, buf, file->size);
buf[file->size] = 0;
/* parse each line */
for (currline = buf; currline; currline = nextline)
{
nextline = ventoy_get_line(currline);
VTOY_SKIP_SPACE(currline);
if (grub_strncasecmp(currline, uname, ulen) == 0)
{
pos = grub_strchr(currline, '=');
pos1 = grub_strchr(currline, '(');
pos2 = grub_strchr(currline, ')');
if (pos && pos1 && pos2)
{
*pos2 = 0;
if (ventoy_chksum_pathcmp(chktype, path, pos1 + 1) == 0)
{
VTOY_SKIP_SPACE_NEXT(pos, 1);
grub_memcpy(chksum, pos, retlen);
goto end;
}
}
}
else if (ventoy_str_len_alnum(currline, retlen))
{
VTOY_SKIP_SPACE_NEXT_EX(pos, currline, retlen);
if (ventoy_chksum_pathcmp(chktype, path, pos) == 0)
{
grub_memcpy(chksum, currline, retlen);
goto end;
}
}
}
end:
grub_free(buf);
return 0;
}
static int ventoy_check_chkfile(const char *isopart, char *path, const char *lchkname, grub_file_t *pfile)
{
int ret = 0;
int cnt = 0;
char c = 0;
char *pos = NULL;
grub_file_t file = NULL;
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s.%s", isopart, path, lchkname);
if (file)
{
VTOY_GOTO_END(1);
}
cnt = ventoy_str_chrcnt(path, '/');
if (cnt > 1)
{
pos = grub_strrchr(path, '/');
c = *pos;
*pos = 0;
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s/VENTOY_CHECKSUM", isopart, path);
if (file)
{
*pos = c;
VTOY_GOTO_END(2);
}
*pos = c;
}
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s/VENTOY_CHECKSUM", isopart);
if (file)
{
ret = (cnt > 1) ? 3 : 4;
}
end:
if (pfile)
{
*pfile = file;
}
else
{
check_free(file, grub_file_close);
}
return ret;
}
static grub_err_t ventoy_cmd_cmp_checksum(grub_extcmd_context_t ctxt, int argc, char **args)
{
int index = 0;
int chktype = 0;
char *pos = NULL;
grub_file_t file = NULL;
const char *calc_value = NULL;
const char *isopart = NULL;
char fchksum[64];
char readchk[256] = {0};
char filebuf[512] = {0};
int retlen[] = { 32, 40, 64, 128 };
char uchkname[16];
(void)ctxt;
index = (int)grub_strtol(args[0], NULL, 10);
if (argc != 2 || index < 0 || index >= (int)ARRAY_SIZE(retlen))
{
return 1;
}
grub_strncpy(uchkname, g_lower_chksum_name[index], sizeof(uchkname));
ventoy_str_toupper(uchkname);
isopart = grub_env_get("vtoy_iso_part");
calc_value = grub_env_get("VT_LAST_CHECK_SUM");
chktype = ventoy_check_chkfile(isopart, args[1], g_lower_chksum_name[index], &file);
if (chktype <= 0)
{
grub_printf("\n\nNo checksum file found.\n");
goto end;
}
if (chktype == 1)
{
grub_snprintf(fchksum, sizeof(fchksum), ".%s", g_lower_chksum_name[index]);
grub_memset(filebuf, 0, sizeof(filebuf));
grub_file_read(file, filebuf, 511);
pos = grub_strchr(filebuf, '=');
if (pos)
{
VTOY_SKIP_SPACE_NEXT(pos, 1);
grub_memcpy(readchk, pos, retlen[index]);
}
else
{
grub_memcpy(readchk, filebuf, retlen[index]);
}
}
else if (chktype == 3 || chktype == 4)
{
grub_snprintf(fchksum, sizeof(fchksum), "global VENTOY_CHECKSUM");
ventoy_find_checksum(file, uchkname, retlen[index], args[1], chktype, readchk);
if (readchk[0] == 0)
{
grub_printf("\n\n%s value not found in %s.\n", uchkname, fchksum);
goto end;
}
}
else
{
grub_snprintf(fchksum, sizeof(fchksum), "local VENTOY_CHECKSUM");
ventoy_find_checksum(file, uchkname, retlen[index], args[1], chktype, readchk);
if (readchk[0] == 0)
{
grub_file_close(file);
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s/VENTOY_CHECKSUM", isopart);
if (file)
{
grub_snprintf(fchksum, sizeof(fchksum), "global VENTOY_CHECKSUM");
ventoy_find_checksum(file, uchkname, retlen[index], args[1], 3, readchk);
if (readchk[0] == 0)
{
grub_printf("\n\n%s value not found in both local and global VENTOY_CHECKSUM.\n", uchkname);
goto end;
}
}
}
}
if (grub_strcasecmp(calc_value, readchk) == 0)
{
grub_printf("\n\nCheck %s value with %s file. [ SUCCESS ]\n", uchkname, fchksum);
}
else
{
grub_printf("\n\nCheck %s value with %s file. [ ERROR ]\n", uchkname, fchksum);
grub_printf("The %s value in %s file is:\n%s\n", uchkname, fchksum, readchk);
}
end:
grub_refresh();
check_free(file, grub_file_close);
VENTOY_CMD_RETURN(0);
}
static const char * ventoy_menu_lang_read_hook(struct grub_env_var *var, const char *val)
static const char * ventoy_menu_lang_read_hook(struct grub_env_var *var, const char *val)
{
{
...
@@ -6522,6 +6792,8 @@ static cmd_para ventoy_cmds[] =
...
@@ -6522,6 +6792,8 @@ static cmd_para ventoy_cmds[] =
{ "vt_load_menu_lang", ventoy_cmd_load_menu_lang, 0, NULL, "", "", NULL },
{ "vt_load_menu_lang", ventoy_cmd_load_menu_lang, 0, NULL, "", "", NULL },
{ "vt_init_menu_lang", ventoy_cmd_init_menu_lang, 0, NULL, "", "", NULL },
{ "vt_init_menu_lang", ventoy_cmd_init_menu_lang, 0, NULL, "", "", NULL },
{ "vt_cur_menu_lang", ventoy_cmd_cur_menu_lang, 0, NULL, "", "", NULL },
{ "vt_cur_menu_lang", ventoy_cmd_cur_menu_lang, 0, NULL, "", "", NULL },
{ "vt_vtoychksum_exist", ventoy_cmd_vtoychksum_exist, 0, NULL, "", "", NULL },
{ "vt_cmp_checksum", ventoy_cmd_cmp_checksum, 0, NULL, "", "", NULL },
};
};
...
...
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
View file @
c6bd857c
...
@@ -116,6 +116,15 @@
...
@@ -116,6 +116,15 @@
s++;\
s++;\
}
}
#define VTOY_SKIP_SPACE_NEXT_EX(s, base, initial) \
s = base + initial;\
while (ventoy_isspace(*s)) \
{\
s++;\
}
#define VTOY_GOTO_END(v) ret = v; goto end
typedef
enum
VTOY_FILE_FLT
typedef
enum
VTOY_FILE_FLT
{
{
VTOY_FILE_FLT_ISO
=
0
,
/* .iso */
VTOY_FILE_FLT_ISO
=
0
,
/* .iso */
...
@@ -628,6 +637,11 @@ typedef struct chk_case_fs_dir
...
@@ -628,6 +637,11 @@ typedef struct chk_case_fs_dir
}
chk_case_fs_dir
;
}
chk_case_fs_dir
;
int
ventoy_str_all_digit
(
const
char
*
str
);
int
ventoy_str_all_digit
(
const
char
*
str
);
int
ventoy_str_all_alnum
(
const
char
*
str
);
int
ventoy_str_len_alnum
(
const
char
*
str
,
int
len
);
char
*
ventoy_str_basename
(
char
*
path
);
grub_err_t
ventoy_env_int_set
(
const
char
*
name
,
int
value
);
int
ventoy_str_chrcnt
(
const
char
*
str
,
char
c
);
int
ventoy_strcmp
(
const
char
*
pattern
,
const
char
*
str
);
int
ventoy_strcmp
(
const
char
*
pattern
,
const
char
*
str
);
int
ventoy_strncmp
(
const
char
*
pattern
,
const
char
*
str
,
grub_size_t
n
);
int
ventoy_strncmp
(
const
char
*
pattern
,
const
char
*
str
,
grub_size_t
n
);
void
ventoy_fill_os_param
(
grub_file_t
file
,
ventoy_os_param
*
param
);
void
ventoy_fill_os_param
(
grub_file_t
file
,
ventoy_os_param
*
param
);
...
...
INSTALL/grub/checksum.cfg
View file @
c6bd857c
if [ -e "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.md5" ]; then
unset vtchkdef
set default=0
vt_vtoychksum_exist "${vtoy_iso_part}" "${VTOY_CHKSUM_FILE_PATH}"
set vtchksumfile=$?
if [ -f "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.md5" -o $vtchksumfile -eq 0 ]; then
if [ -z "$vtchkdef" ]; then
set default=0
set vtchkdef=1
fi
menuentry "$VTLANG_CHKSUM_MD5_CALC_CHK" --class=checksum_md5 {
menuentry "$VTLANG_CHKSUM_MD5_CALC_CHK" --class=checksum_md5 {
md5sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}"
md5sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}"
vt_cmp_checksum 0 "${VTOY_CHKSUM_FILE_PATH}"
vt_1st_line "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.md5" vtReadChecksum
if vt_str_casebegin "$vtReadChecksum" "$VT_LAST_CHECK_SUM"; then
echo -e "\n\nCheck MD5 value with .md5 file. [ OK ]"
else
echo -e "\n\nCheck MD5 value with .md5 file. [ FAIL ]"
echo "The MD5 value in .md5 file is:"
echo "$vtReadChecksum"
fi
echo -en "\n\n$VTLANG_ENTER_EXIT ..."
echo -en "\n\n$VTLANG_ENTER_EXIT ..."
read vtInputKey
read vtInputKey
}
}
...
@@ -26,20 +24,14 @@ else
...
@@ -26,20 +24,14 @@ else
}
}
fi
fi
if [ -e "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha1" ]; then
if [ -f "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha1" -o $vtchksumfile -eq 0 ]; then
set default=1
if [ -z "$vtchkdef" ]; then
set default=1
set vtchkdef=1
fi
menuentry "$VTLANG_CHKSUM_SHA1_CALC_CHK" --class=checksum_sha1 {
menuentry "$VTLANG_CHKSUM_SHA1_CALC_CHK" --class=checksum_sha1 {
sha1sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}"
sha1sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}"
vt_cmp_checksum 1 "${VTOY_CHKSUM_FILE_PATH}"
vt_1st_line "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha1" vtReadChecksum
if vt_str_casebegin "$vtReadChecksum" "$VT_LAST_CHECK_SUM"; then
echo -e "\n\nCheck SHA1 value with .sha1 file. [ OK ]"
else
echo -e "\n\nCheck SHA1 value with .sha1 file. [ FAIL ]"
echo "The SHA1 value in .sha1 file is:"
echo "$vtReadChecksum"
fi
echo -en "\n\n$VTLANG_ENTER_EXIT ..."
echo -en "\n\n$VTLANG_ENTER_EXIT ..."
read vtInputKey
read vtInputKey
...
@@ -55,20 +47,14 @@ fi
...
@@ -55,20 +47,14 @@ fi
if [ -e "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha256" ]; then
if [ -f "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha256" -o $vtchksumfile -eq 0 ]; then
set default=2
if [ -z "$vtchkdef" ]; then
set default=2
set vtchkdef=1
fi
menuentry "$VTLANG_CHKSUM_SHA256_CALC_CHK" --class=checksum_sha256 {
menuentry "$VTLANG_CHKSUM_SHA256_CALC_CHK" --class=checksum_sha256 {
sha256sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}"
sha256sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}"
vt_cmp_checksum 2 "${VTOY_CHKSUM_FILE_PATH}"
vt_1st_line "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha256" vtReadChecksum
if vt_str_casebegin "$vtReadChecksum" "$VT_LAST_CHECK_SUM"; then
echo -e "\n\nCheck SHA256 value with .sha256 file. [ OK ]"
else
echo -e "\n\nCheck SHA256 value with .sha256 file. [ FAIL ]"
echo "The SHA256 value in .sha256 file is:"
echo "$vtReadChecksum"
fi
echo -en "\n\n$VTLANG_ENTER_EXIT ..."
echo -en "\n\n$VTLANG_ENTER_EXIT ..."
read vtInputKey
read vtInputKey
...
@@ -84,20 +70,14 @@ fi
...
@@ -84,20 +70,14 @@ fi
if [ -e "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha512" ]; then
if [ -f "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha512" -o $vtchksumfile -eq 0 ]; then
set default=3
if [ -z "$vtchkdef" ]; then
set default=3
set vtchkdef=1
fi
menuentry "$VTLANG_CHKSUM_SHA512_CALC_CHK" --class=checksum_sha512{
menuentry "$VTLANG_CHKSUM_SHA512_CALC_CHK" --class=checksum_sha512{
sha512sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}"
sha512sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}"
vt_cmp_checksum 3 "${VTOY_CHKSUM_FILE_PATH}"
vt_1st_line "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha512" vtReadChecksum
if vt_str_casebegin "$vtReadChecksum" "$VT_LAST_CHECK_SUM"; then
echo -e "\n\nCheck SHA512 value with .sha512 file. [ OK ]"
else
echo -e "\n\nCheck SHA512 value with .sha512 file. [ FAIL ]"
echo "The SHA512 value in .sha512 file is:"
echo "$vtReadChecksum"
fi
echo -en "\n\n$VTLANG_ENTER_EXIT ..."
echo -en "\n\n$VTLANG_ENTER_EXIT ..."
read vtInputKey
read vtInputKey
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment