implement a proper flag encoder tool as an HTML+JS app

main
SI 2023-08-20 01:20:23 +00:00
parent 7afa16d86b
commit 5afb8c91ca
3 changed files with 6193 additions and 0 deletions

3547
flag_encoder/bn.js 100644

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,67 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>CryptoCTF zero-knowledge flag-submission encoder v0.1</title>
<script src="bn.js"></script>
<script src="nano-ethereum-signer-mod.js"></script>
</head>
<body>
<label for="inp-contestant-address">contestant's address:</label> <input id="inp-contestant-address" type="text" size="42" pattern="0x[0-9a-fA-F]{40}" required placeholder="0x0000000000000000000000000000000000000000" autocomplete="cryptocurrency address" title="The cryptocurrency address of the contestant who is submitting the flag. It will be used as the message that is signed using an ECDSA signature scheme. It is incorporated to prevent submission forgery and theft. The resulting signature will be accepted by the CCTF smart-contract from only this address."/><br/>
<label for="inp-flag">flag:</label> <input id="inp-flag" type="text" size="72" pattern="CCTF[{].*[}]" required placeholder="CCTF{…}" autocomplete="flag" title="The flag for the challenge in question: a piece of data that can be found through solving the problem. It can be an outstanding character sequence of the form CCTF{…} that can be stumbled upon; otherwise its location/calculation (e.g. the deciphered message) and its formatting (e.g. hexadecimal) are precisely specified, and formatting always includes enclosing by CCTF{…}. The flag will be used as the secret key for signing using an ECDSA signature scheme." accesskey="f"/> <label for="outp-obscured-flag">⇒ obscured flag: </label><input id="outp-obscured-flag" type="text" size="42" readonly title="The obscured flag: data to allow zero-knowledge verification of knowledge of the flag. It is the elliptic-curve public key related to the flag as the private key. It is the thing to be loaded into the CCTF smart-contract for the respective challenge."/><br />
<label for="outp-signature">⇒ signature: </label><input id="outp-signature" type="text" size="132" readonly title="The signature: a zero-knowledge proof of knowledge of the flag, bound to the given address. It's an ECDSA signature of the address as the message (hash) with the flag as the key. It is to be passed to the CCTF smart-contract's flag submission function."/><!--<br />
<label for="inp-contract-address">CCTF smart-contract address:</label> <input id="inp-contract-address" type="text" size="42" pattern="0x[0-9a-fA-F]{40}" placeholder="0x0000000000000000000000000000000000000000"/><br/>
<label for="inp-contest-id">contest ID:</label> <input id="inp-contest-id" type="text" size="66" pattern="0x[0-9a-fA-F]+|[0-9]+" placeholder="0x0000000000000000000000000000000000000000000000000000000000000000"/><br/>
<label for="inp-challenge-id">challenge ID:</label> <input id="inp-challenge-id" type="integer" size="4" placeholder="0" accesskey="c"/>-->
<script>
var inpContestantAddress = document.querySelector("#inp-contestant-address");
var inpFlag = document.querySelector("#inp-flag");
var outpObscuredFlag = document.querySelector("#outp-obscured-flag");
var outpSignature = document.querySelector("#outp-signature");
function displayObscuredFlag() {
var k = inpFlag.value;
var t = "0x";
for (i in k) {
t += k.charCodeAt(i).toString(16).padStart(2, "0");
}
try {
outpObscuredFlag.value = addressFromKey(t);
} catch {
outpObscuredFlag.value = "";
}
}
function displaySignature() {
var m = inpContestantAddress.value;
var k = inpFlag.value;
var t = "0x";
for (i in k) {
t += k.charCodeAt(i).toString(16).padStart(2, "0");
}
try {
outpSignature.value = signMessage(m, t);
} catch {
outpSignature.value = "";
}
}
function onContestantAddressChange(ev) {
displaySignature();
}
function onFlagChange(ev) {
displayObscuredFlag();
displaySignature();
}
inpContestantAddress.oninput = onContestantAddressChange;
inpFlag.oninput = onFlagChange;
displayObscuredFlag();
displaySignature();
</script>
</body>
</html>

File diff suppressed because it is too large Load Diff