mirror of
https://github.com/neovim/neovim.git
synced 2025-09-23 11:38:31 +00:00
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:
@@ -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`)
|
||||||
|
7
runtime/lua/vim/_meta/vimfn.lua
generated
7
runtime/lua/vim/_meta/vimfn.lua
generated
@@ -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.
|
||||||
---
|
---
|
||||||
|
@@ -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 },
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
const char *p = tv_get_string(&argvars[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->v_type = VAR_STRING;
|
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 *hash = sha256_bytes((const uint8_t *)p, strlen(p), NULL, 0);
|
||||||
|
rettv->vval.v_string = xstrdup(hash);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// "shellescape({string})" function
|
/// "shellescape({string})" function
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user