butter-lib
Version:
BuTTER Library は、ストレージ上に細分化した状態で保存されているGTFSを基にした時刻表情報を集め、ブラウザ内で必要な情報に加工するライブラリです。DBを使わずにデータ処理をブラウザ内とする
63 lines (57 loc) • 1.71 kB
HTML
<html>
<script>
async function fetchAsArrayBuffer(url) {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`Failed to fetch ${url}`);
}
return await response.arrayBuffer();
}
async function pemToPublicKey(pem) {
const uint8Array = pemToUint8Array(pem);
return await crypto.subtle.importKey(
'spki',
uint8Array,
{
name: 'RSASSA-PKCS1-v1_5',
hash: 'SHA-256',
},
false,
['verify']
);
}
function pemToUint8Array(pem) {
const base64String = pem.replace(/-----[A-Z ]+-----/g, '').trim();
const raw = window.atob(base64String);
const uint8Array = new Uint8Array(raw.length);
for (let i = 0; i < raw.length; i++) {
uint8Array[i] = raw.charCodeAt(i);
}
return uint8Array;
}
async function verifySignatureFromUrls(publicKeyUrl, contentUrl, signatureUrl) {
const [pem, content, signature] = await Promise.all([
fetch(publicKeyUrl).then((res) => res.text()),
fetchAsArrayBuffer(contentUrl),
fetchAsArrayBuffer(signatureUrl),
]);
const publicKey = await pemToPublicKey(pem);
return await crypto.subtle.verify(
{
name: 'RSASSA-PKCS1-v1_5',
},
publicKey,
signature,
content
);
}
// 使用例
(async function () {
const publicKeyUrl = 'https://pub-ad1f4a48b8ef46779b720e734b0c2e1d.r2.dev/public_key.pem';
const contentUrl = 'https://storage.app.takoyaki3.com/datalist.json';
const signatureUrl = 'https://storage.app.takoyaki3.com/datalist.json.sig';
const isValid = await verifySignatureFromUrls(publicKeyUrl, contentUrl, signatureUrl);
console.log('Signature valid?', isValid);
})();
</script>
</html>