Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ブラウザ版の『ハッシュ値計算時』の問題を修正、『ハッシュ値計算』『ランダムUUID生成』『ランダム配列生成』命令を追加 #1884 #1885

Merged
merged 1 commit into from
Dec 24, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 45 additions & 15 deletions src/plugin_browser_crypto.mts
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,53 @@ export default {
type: 'func',
josi: [['へ'], ['を'], ['で']],
pure: true,
fn: function (func: any, s: any, alg: any, sys: any) {
func = sys.__findVar(func, null) // 文字列指定なら関数に変換
// convert
const buffer = new TextEncoder().encode(s)
crypto.subtle.digest(alg, buffer).then(function (hash: any) {
const codes: string[] = []
const view = new DataView(hash)
for (let i = 0; i < view.byteLength; i += 4) {
const v = view.getUint32(i)
const h = v.toString(16)
const pad = '00' + h
codes.push(pad.substr(pad.length - 2, 2))
}
const res = sys.__setSysVar('対象', codes.join(''))
fn: function (func: any, s: string, alg: string, sys: any) {
func = sys.__findVar(func, null) // 文字列指定なら関数に変換(コールバック関数)
// (ref) https://developer.mozilla.org/ja/docs/Web/API/SubtleCrypto/digest
const msgUint8 = new TextEncoder().encode(s) // (utf-8 の) Uint8Array にエンコードする
// メッセージをハッシュする
crypto.subtle.digest(alg, msgUint8).then(function (hashBuffer: ArrayBuffer) {
const hashArray = Array.from(new Uint8Array(hashBuffer)); // バッファーをバイト列に変換する
const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, "0"))
.join(""); // バイト列を 16 進文字列に変換する
const res = sys.__setSysVar('対象', hashHex)
func(res)
})
},
return_none: true
}
},
'ハッシュ値計算': { // @データSをアルゴリズムALG(sha-256/sha-384/sha-512)のエンコーディングでハッシュ値を計算して返す // @ はっしゅちけいさん
type: 'func',
josi: [['を'], ['で']],
pure: true,
asyncFn: true,
fn: async function (s: string, alg: string, sys: any) {
const msgUint8 = new TextEncoder().encode(s) // (utf-8 の) Uint8Array にエンコードする
const hashBuffer = await crypto.subtle.digest(alg, msgUint8)
const hashArray = Array.from(new Uint8Array(hashBuffer)); // バッファーをバイト列に変換する
const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, "0"))
.join(""); // バイト列を 16 進文字列に変換する
return hashHex
},
},
'ランダムUUID生成': { // @ランダムに生成された36文字のv4 UUID(文字列)を返す // @ らんだむUUIDせいせい
type: 'func',
josi: [],
pure: true,
fn: function (sys: any) {
return window.crypto.randomUUID()
},
},
'ランダム配列生成': { // @暗号強度の強い乱数のバイト配列(Uint8Array)を指定個数返す // @ らんだむはいれつせいせい
type: 'func',
josi: [['の']],
pure: true,
fn: function (cnt: number, sys: any) {
const array = new Uint8Array(cnt);
window.crypto.getRandomValues(array);
return array
},
},
}
Loading