consistent spacing for reformating #7
|
@ -0,0 +1,11 @@
|
||||||
|
# editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
tab_width = 2
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
68
app.js
68
app.js
|
@ -48,6 +48,8 @@
|
||||||
$('.js-jwk').hidden = true;
|
$('.js-jwk').hidden = true;
|
||||||
$('.js-toc-der-public').hidden = true;
|
$('.js-toc-der-public').hidden = true;
|
||||||
$('.js-toc-der-private').hidden = true;
|
$('.js-toc-der-private').hidden = true;
|
||||||
|
$('.js-toc-jwk').hidden = true;
|
||||||
|
|
||||||
$$('.js-toc-pem').forEach(function ($el) {
|
$$('.js-toc-pem').forEach(function ($el) {
|
||||||
$el.hidden = true;
|
$el.hidden = true;
|
||||||
});
|
});
|
||||||
|
@ -55,8 +57,8 @@
|
||||||
$$('button').map(function ($el) { $el.disabled = true; });
|
$$('button').map(function ($el) { $el.disabled = true; });
|
||||||
var opts = {
|
var opts = {
|
||||||
kty: $('input[name="kty"]:checked').value
|
kty: $('input[name="kty"]:checked').value
|
||||||
, namedCurve: $('input[name="ec-crv"]:checked').value
|
, namedCurve: $('input[name="ec-crv"]:checked').value
|
||||||
, modulusLength: $('input[name="rsa-len"]:checked').value
|
, modulusLength: $('input[name="rsa-len"]:checked').value
|
||||||
};
|
};
|
||||||
var then = Date.now();
|
var then = Date.now();
|
||||||
console.log('opts', opts);
|
console.log('opts', opts);
|
||||||
|
@ -116,7 +118,69 @@
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('form.js-keysign').addEventListener('submit', function (ev) {
|
||||||
|
ev.preventDefault();
|
||||||
|
ev.stopPropagation();
|
||||||
|
$('.js-pem-loading').hidden = false;
|
||||||
|
$('.js-toc-jws').hidden = true;
|
||||||
|
$('.js-toc-jwt').hidden = true;
|
||||||
|
$$('input').map(function ($el) { $el.disabled = true; });
|
||||||
|
$$('button').map(function ($el) { $el.disabled = true; });
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
|
||||||
|
var opts = {
|
||||||
|
jwk: JSON.parse($('textarea[name="jwk"]').value),
|
||||||
|
claims: {
|
||||||
|
exp: "1h",
|
||||||
|
iss: document.getElementById(`-acmeDomains`).value
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Keypairs.signJwt(opts).then(function (msg) {
|
||||||
|
document.getElementById(`sign-error`).innerText = null;
|
||||||
|
$('.js-jwt').innerText = msg;
|
||||||
|
$('.js-toc-jwt').hidden = false;
|
||||||
|
var msgArr = msg.split(".")
|
||||||
|
var protected64 = msgArr[0]
|
||||||
|
var payload64 = msgArr[1]
|
||||||
|
var signature = msgArr[2]
|
||||||
|
var signedMsg = {
|
||||||
|
protected: protected64
|
||||||
|
, payload: payload64
|
||||||
|
, signature
|
||||||
|
};
|
||||||
|
$('.js-jws').innerText = JSON.stringify(signedMsg, null, 2);
|
||||||
|
$('.js-toc-jws').hidden = false;
|
||||||
|
$('.js-pem-loading').hidden = true;
|
||||||
|
$$('input').map(function ($el) { $el.disabled = false; });
|
||||||
|
$$('button').map(function ($el) { $el.disabled = false; });
|
||||||
|
}).catch(function (error) {
|
||||||
|
document.getElementById(`sign-error`).innerText = error.message
|
||||||
|
$('.js-pem-loading').hidden = true;
|
||||||
|
$$('input').map(function ($el) { $el.disabled = false; });
|
||||||
|
$$('button').map(function ($el) { $el.disabled = false; });
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
document.getElementById(`sign-error`).innerText = error.message
|
||||||
|
$('.js-pem-loading').hidden = true;
|
||||||
|
$$('input').map(function ($el) { $el.disabled = false; });
|
||||||
|
$$('button').map(function ($el) { $el.disabled = false; });
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
$('.js-generate').hidden = false;
|
$('.js-generate').hidden = false;
|
||||||
|
$('.js-sign').hidden = false;
|
||||||
|
$('textarea[name="jwk"]').value = JSON.stringify({
|
||||||
|
"crv": "P-256",
|
||||||
|
"d": "LImWxqqTHbP3LHQfqscDSUzf_uNePGqf9U6ETEcO5Ho",
|
||||||
|
"kty": "EC",
|
||||||
|
"x": "vdjQ3T6VBX82LIKDzepYgRsz3HgRwp83yPuonu6vqos",
|
||||||
|
"y": "IUkEXtAMnppnV1A19sE2bJhUo4WPbq6EYgWxma4oGyg",
|
||||||
|
"kid": "MnfJYyS9W5gUjrJLdn8ePMzik8ZJz2qc-VZmKOs_oCw"
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener('load', run);
|
window.addEventListener('load', run);
|
||||||
|
|
162
index.html
162
index.html
|
@ -1,30 +1,34 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
|
||||||
<title>BlueCrypt</title>
|
<head>
|
||||||
<style>
|
<title>BlueCrypt</title>
|
||||||
textarea {
|
<style>
|
||||||
width: 42em;
|
textarea {
|
||||||
height: 10em;
|
width: 42em;
|
||||||
}
|
height: 10em;
|
||||||
/* need to word wrap the binary no space der */
|
}
|
||||||
.js-der-public, .js-der-private{
|
/* need to word wrap the binary no space der */
|
||||||
white-space: pre-wrap; /* CSS3 */
|
.js-der-public, .js-der-private, .js-jwt{
|
||||||
white-space: -moz-pre-wrap; /* Firefox */
|
white-space: pre-wrap; /* CSS3 */
|
||||||
white-space: -pre-wrap; /* Opera <7 */
|
white-space: -moz-pre-wrap; /* Firefox */
|
||||||
white-space: -o-pre-wrap; /* Opera 7 */
|
white-space: -pre-wrap; /* Opera <7 */
|
||||||
word-wrap: break-word; /* IE */
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
}
|
word-wrap: break-word; /* IE */
|
||||||
</style>
|
}
|
||||||
</head>
|
.errors {
|
||||||
<body>
|
color: red;
|
||||||
<h1>BlueCrypt for the Browser</h1>
|
}
|
||||||
<p>BlueCrypt is universal crypto for the browser. It's lightweight, fast, and based on native webcrypto.
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>BlueCrypt for the Browser</h1>
|
||||||
|
<p>BlueCrypt is universal crypto for the browser. It's lightweight, fast, and based on native webcrypto.
|
||||||
This means it's easy-to-use crypto in kilobytes, not megabytes.</p>
|
This means it's easy-to-use crypto in kilobytes, not megabytes.</p>
|
||||||
|
|
||||||
<h2>Keypair Generation</h2>
|
<h2>Keypair Generation</h2>
|
||||||
<form class="js-keygen">
|
<form class="js-keygen">
|
||||||
<p>Key Type:</p>
|
<p>Key Type:</p>
|
||||||
<div>
|
<div>
|
||||||
<input type="radio" id="-ktyEC"
|
<input type="radio" id="-ktyEC"
|
||||||
name="kty" value="EC" checked>
|
name="kty" value="EC" checked>
|
||||||
<label for="-ktyEC">ECDSA</label>
|
<label for="-ktyEC">ECDSA</label>
|
||||||
|
@ -50,50 +54,74 @@
|
||||||
<label for="-modlen5"><input type="radio" id="-modlen5"
|
<label for="-modlen5"><input type="radio" id="-modlen5"
|
||||||
name="rsa-len" value="4096">4096</label>
|
name="rsa-len" value="4096">4096</label>
|
||||||
</div>
|
</div>
|
||||||
<button class="js-generate" hidden>Generate</button>
|
<button class="js-generate" hidden>Generate</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div class="js-loading" hidden>Loading</div>
|
<div class="js-loading" hidden>Loading</div>
|
||||||
|
|
||||||
<details class="js-toc-jwk" hidden>
|
<details class="js-toc-jwk" hidden>
|
||||||
<summary>JWK Keypair</summary>
|
<summary>JWK Keypair</summary>
|
||||||
<pre><code class="js-jwk"> </code></pre>
|
<pre><code class="js-jwk"> </code></pre>
|
||||||
</details>
|
</details>
|
||||||
<details class="js-toc-der-private" hidden>
|
<details class="js-toc-der-private" hidden>
|
||||||
<summary>DER Private Binary</summary>
|
<summary>DER Private Binary</summary>
|
||||||
<pre><code class="js-der-private"> </code></pre>
|
<pre><code class="js-der-private"> </code></pre>
|
||||||
</details>
|
</details>
|
||||||
<details class="js-toc-der-public" hidden>
|
<details class="js-toc-der-public" hidden>
|
||||||
<summary>DER Public Binary</summary>
|
<summary>DER Public Binary</summary>
|
||||||
<pre><code class="js-der-public"> </code></pre>
|
<pre><code class="js-der-public"> </code></pre>
|
||||||
</details>
|
</details>
|
||||||
<details class="js-toc-pem js-toc-pem-pkcs1-private" hidden>
|
<details class="js-toc-pem js-toc-pem-pkcs1-private" hidden>
|
||||||
<summary>PEM Private (base64-encoded PKCS1 DER)</summary>
|
<summary>PEM Private (base64-encoded PKCS1 DER)</summary>
|
||||||
<pre><code class="js-input-pem-pkcs1-private" ></code></pre>
|
<pre><code class="js-input-pem-pkcs1-private" ></code></pre>
|
||||||
</details>
|
</details>
|
||||||
<details class="js-toc-pem js-toc-pem-sec1-private" hidden>
|
<details class="js-toc-pem js-toc-pem-sec1-private" hidden>
|
||||||
<summary>PEM Private (base64-encoded SEC1 DER)</summary>
|
<summary>PEM Private (base64-encoded SEC1 DER)</summary>
|
||||||
<pre><code class="js-input-pem-sec1-private" ></code></pre>
|
<pre><code class="js-input-pem-sec1-private" ></code></pre>
|
||||||
</details>
|
</details>
|
||||||
<details class="js-toc-pem js-toc-pem-pkcs8-private" hidden>
|
<details class="js-toc-pem js-toc-pem-pkcs8-private" hidden>
|
||||||
<summary>PEM Private (base64-encoded PKCS8 DER)</summary>
|
<summary>PEM Private (base64-encoded PKCS8 DER)</summary>
|
||||||
<pre><code class="js-input-pem-pkcs8-private" ></code></pre>
|
<pre><code class="js-input-pem-pkcs8-private" ></code></pre>
|
||||||
</details>
|
</details>
|
||||||
<details class="js-toc-pem js-toc-pem-pkcs1-public" hidden>
|
<details class="js-toc-pem js-toc-pem-pkcs1-public" hidden>
|
||||||
<summary>PEM Public (base64-encoded PKCS1 DER)</summary>
|
<summary>PEM Public (base64-encoded PKCS1 DER)</summary>
|
||||||
<pre><code class="js-input-pem-pkcs1-public" ></code></pre>
|
<pre><code class="js-input-pem-pkcs1-public" ></code></pre>
|
||||||
</details>
|
</details>
|
||||||
<details class="js-toc-pem js-toc-pem-spki-public" hidden>
|
<details class="js-toc-pem js-toc-pem-spki-public" hidden>
|
||||||
<summary>PEM Public (base64-encoded SPKI/PKIX DER)</summary>
|
<summary>PEM Public (base64-encoded SPKI/PKIX DER)</summary>
|
||||||
<pre><code class="js-input-pem-spki-public" ></code></pre>
|
<pre><code class="js-input-pem-spki-public" ></code></pre>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<script src="./lib/bluecrypt-encoding.js"></script>
|
<h2>Signing</h2>
|
||||||
<script src="./lib/asn1-packer.js"></script>
|
<div class="errors" id="sign-error"></div>
|
||||||
<script src="./lib/x509.js"></script>
|
<form class="js-keysign">
|
||||||
<script src="./lib/ecdsa.js"></script>
|
<div>
|
||||||
<script src="./lib/rsa.js"></script>
|
<label for="-acmeDomains">Domains:</label>
|
||||||
<script src="./lib/keypairs.js"></script>
|
<input class="js-domains" type="text" id="-acmeDomains" value="example.com www.example.com">
|
||||||
<script src="./app.js"></script>
|
</div>
|
||||||
</body>
|
<div>
|
||||||
|
<label for="jwk">JWK:</label>
|
||||||
|
<br>
|
||||||
|
<textarea id="jwk" name="jwk"></textarea>
|
||||||
|
</div>
|
||||||
|
<button class="js-sign" hidden>Sign</button>
|
||||||
|
</form>
|
||||||
|
<div class="js-pem-loading" hidden>Loading</div>
|
||||||
|
<details class="js-toc-jws" hidden>
|
||||||
|
<summary>JWS </summary>
|
||||||
|
<pre><code class="js-jws"></code></pre>
|
||||||
|
</details>
|
||||||
|
<details class="js-toc-jwt" hidden>
|
||||||
|
<summary>JWT </summary>
|
||||||
|
<pre><code class="js-jwt"></code></pre>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<script src="./lib/bluecrypt-encoding.js"></script>
|
||||||
|
<script src="./lib/asn1-packer.js"></script>
|
||||||
|
<script src="./lib/x509.js"></script>
|
||||||
|
<script src="./lib/ecdsa.js"></script>
|
||||||
|
<script src="./lib/rsa.js"></script>
|
||||||
|
<script src="./lib/keypairs.js"></script>
|
||||||
|
<script src="./app.js"></script>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
Loading…
Reference in New Issue