vim-patch:9.1.1774: cannot calculate sha256 of a Blob

Problem:  cannot calculate sha256() of a Blob
Solution: Change sha256() to accept a Blob or String argument
          (thinca).

closes: vim/vim#18336

4150283b83

Co-authored-by: thinca <thinca@gmail.com>
This commit is contained in:
zeertzjq
2025-09-21 06:16:20 +08:00
parent 19ba589946
commit 39a21d749d
5 changed files with 39 additions and 15 deletions

View File

@@ -9468,12 +9468,13 @@ setwinvar({nr}, {varname}, {val}) *setwinvar()*
Return: ~ Return: ~
(`any`) (`any`)
sha256({string}) *sha256()* sha256({expr}) *sha256()*
Returns a String with 64 hex characters, which is the SHA256 Returns a String with 64 hex characters, which is the SHA256
checksum of {string}. checksum of {expr}.
{expr} is a String or a Blob.
Parameters: ~ Parameters: ~
• {string} (`string`) • {expr} (`string`)
Return: ~ Return: ~
(`string`) (`string`)

View File

@@ -8631,11 +8631,12 @@ function vim.fn.settagstack(nr, dict, action) end
function vim.fn.setwinvar(nr, varname, val) end function vim.fn.setwinvar(nr, varname, val) end
--- Returns a String with 64 hex characters, which is the SHA256 --- Returns a String with 64 hex characters, which is the SHA256
--- checksum of {string}. --- checksum of {expr}.
--- {expr} is a String or a Blob.
--- ---
--- @param string string --- @param expr string
--- @return string --- @return string
function vim.fn.sha256(string) end function vim.fn.sha256(expr) end
--- Escape {string} for use as a shell command argument. --- Escape {string} for use as a shell command argument.
--- ---

View File

@@ -10419,13 +10419,14 @@ M.funcs = {
base = 1, base = 1,
desc = [=[ desc = [=[
Returns a String with 64 hex characters, which is the SHA256 Returns a String with 64 hex characters, which is the SHA256
checksum of {string}. checksum of {expr}.
{expr} is a String or a Blob.
]=], ]=],
name = 'sha256', name = 'sha256',
params = { { 'string', 'string' } }, params = { { 'expr', 'string' } },
returns = 'string', returns = 'string',
signature = 'sha256({string})', signature = 'sha256({expr})',
}, },
shellescape = { shellescape = {
args = { 1, 2 }, args = { 1, 2 },

View File

@@ -7189,15 +7189,24 @@ static void f_settagstack(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
} }
} }
/// f_sha256 - sha256({string}) function /// "sha256({expr})" function
static void f_sha256(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) static void f_sha256(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
{ {
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
if (argvars[0].v_type == VAR_BLOB) {
blob_T *blob = argvars[0].vval.v_blob;
if (blob != NULL) {
const uint8_t *p = (uint8_t *)blob->bv_ga.ga_data;
int len = blob->bv_ga.ga_len;
rettv->vval.v_string = xstrdup(sha256_bytes(p, (size_t)len, NULL, 0));
}
} else {
const char *p = tv_get_string(&argvars[0]); const char *p = tv_get_string(&argvars[0]);
const char *hash = sha256_bytes((const uint8_t *)p, strlen(p), NULL, 0); const char *hash = sha256_bytes((const uint8_t *)p, strlen(p), NULL, 0);
// make a copy of the hash (sha256_bytes returns a static buffer)
rettv->vval.v_string = xstrdup(hash); rettv->vval.v_string = xstrdup(hash);
rettv->v_type = VAR_STRING; }
} }
/// "shellescape({string})" function /// "shellescape({string})" function

View File

@@ -19,4 +19,16 @@ function Test_sha256()
" test for contains non-ascii char: " test for contains non-ascii char:
call assert_equal('5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953', sha256("\xde\xad\xbe\xef")) call assert_equal('5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953', sha256("\xde\xad\xbe\xef"))
" test for blob:
" empty blob
call assert_equal('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', sha256(0z))
" blob with single byte
call assert_equal('ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb', sha256(0z61))
" blob with "abc"
call assert_equal('ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad', sha256(0z616263))
" blob with non-ascii bytes
call assert_equal('5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953', sha256(0zdeadbeef))
endfunction endfunction
" vim: shiftwidth=2 sts=2 expandtab