nak/handlers/EventSigning.jsx

90 lines
2.2 KiB
React
Raw Normal View History

2022-02-11 14:31:42 -05:00
import React, {useState} from 'react'
import useComputedState from 'use-computed-state'
import {
getPublicKey,
getEventHash,
serializeEvent,
verifySignature,
signEvent
} from 'nostr-tools'
import Item from '../components/item'
export default function EventSigning({value}) {
2022-02-11 14:31:42 -05:00
let evt = JSON.parse(value)
let [privateKey, setPrivateKey] = useState(
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
)
let privateKeyIsValid = useComputedState(
2022-02-11 14:47:50 -05:00
() => privateKey.match(/^[a-f0-9]{64}$/),
[privateKey]
)
let publicKey = useComputedState(
() => (privateKeyIsValid ? getPublicKey(privateKey) : null),
[privateKeyIsValid]
)
let signature = useComputedState(async () => {
2022-02-11 14:31:42 -05:00
try {
evt.pubkey = publicKey
return await signEvent(evt, privateKey)
} catch (err) {
return null
}
}, [value, privateKey])
2022-02-11 14:31:42 -05:00
let isValidSignature = useComputedState(async () => {
2022-02-12 18:30:18 -05:00
if (evt.id && evt.sig) {
2022-02-11 14:31:42 -05:00
try {
return await verifySignature(evt)
} catch (err) {
return false
}
} else {
return null
}
}, [value])
return (
<>
<Item
label="serialized event"
hint="according to nip-01 signature algorithm"
>
{serializeEvent(evt)}
</Item>
<Item label="event id" hint="sha256 hash of serialized event">
{getEventHash(evt)}
</Item>
{evt.sig ? (
2022-02-12 18:24:11 -05:00
<Item label="signature valid">
{isValidSignature?.toString() || ''}
</Item>
) : (
<>
<Item
label="private key"
hint="paste any private key here (32 bytes hex-encoded)"
>
<input
value={privateKey}
onChange={e => setPrivateKey(e.target.value.toLowerCase())}
/>{' '}
{privateKeyIsValid ? 'valid' : 'invalid'}
</Item>
<Item label="public key">{publicKey}</Item>
<Item label="signature">{privateKeyIsValid ? signature : ''}</Item>
</>
)}
</>
)
}
EventSigning.match = value => {
try {
let evt = JSON.parse(value)
return evt.kind && evt.content && evt.tags
} catch (err) {
/**/
}
return false
}