Verify a Confium signature in the browser
Problem: You want end users to verify Confium signatures without installing anything.
Solution
<!DOCTYPE html>
<html>
<head>
<title>Confium Verify</title>
</head>
<body>
<h1>Verify a signature</h1>
<textarea id="message" placeholder="message">hello</textarea>
<textarea id="signature" placeholder="hex signature"></textarea>
<textarea id="pubkey" placeholder="hex public key"></textarea>
<button id="verify">Verify</button>
<pre id="result"></pre>
<script type="module">
import init, { CompositeSignature } from 'https://esm.sh/@confium/confium-wasm@0.3';
await init();
document.getElementById('verify').addEventListener('click', () => {
const message = new TextEncoder().encode(document.getElementById('message').value);
const sigHex = document.getElementById('signature').value.trim();
const pubHex = document.getElementById('pubkey').value.trim();
try {
// Build a composite signature from hex + verify
const sig = new CompositeSignature(/* components */);
const result = sig.verify(message);
document.getElementById('result').textContent =
result.all_verified ? '✅ Valid' : '❌ Invalid';
} catch (e) {
document.getElementById('result').textContent = '⚠️ ' + e.message;
}
});
</script>
</body>
</html>
What’s happening
@confium/confium-wasm is a ~460 KB WASM module that runs entirely client-side. No server round-trip; no API keys; no rate limits.
The full API surface is in the WASM spec and the npm package docs.
Production deployment
For a real-world deployment:
- Pin the version — replace
@0.3with the exact version you tested against. - Self-host the WASM — don’t depend on
esm.shfor production. Host the file on your CDN. - Add Subresource Integrity —
<script src="..." integrity="sha384-...">so a CDN compromise can’t ship a backdoored verifier. - Bundle with your app — for SPA frameworks (React/Vue/Svelte),
npm install @confium/confium-wasmand import directly.
Framework recipes
React
import { useEffect, useState } from 'react';
import init, { CompositeSignature } from '@confium/confium-wasm';
export default function Verify() {
const [ready, setReady] = useState(false);
useEffect(() => { init().then(() => setReady(true)); }, []);
if (!ready) return <p>Loading verifier…</p>;
return <VerifyForm />;
}
Vue 3
<script setup>
import { ref, onMounted } from 'vue';
import init, { CompositeSignature } from '@confium/confium-wasm';
const ready = ref(false);
onMounted(async () => {
await init();
ready.value = true;
});
</script>
Svelte
<script>
import { onMount } from 'svelte';
import init, { CompositeSignature } from '@confium/confium-wasm';
let ready = false;
onMount(async () => { await init(); ready = true; });
</script>