ECDH

HTML

<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn2.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/prng4.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/rng.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/ec.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.1/build/rollups/aes.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.1/build/rollups/pbkdf2.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.1/build/components/pad-zeropadding.js"></script>
<html>
    <head>
        <title>JavaScript ECDH Key Exchange Demo</title>
    </head>
    <body onLoad='do_init();'>
        <input type="button" value="Generate Key" onclick="init_exchange()" />
    </body>
</html>

JavaScript

function jsonp(url, func) {
    var unique = "jsonp_" + Math.random().toString().substr(2);
    var s = document.createElement("script");
    s.src = url + "&callback=" + unique;
    s.id = unique;
    window[unique] = function(data) {
        var s = document.getElementById(data._);
        s.parentElement.removeChild(s);
        window[data._] = undefined;
        func(data);
    }
    document.body.appendChild(s);
}

var global_curve = (function(){
    var q = new BigInteger("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", 16);
    var a = new BigInteger("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", 16);
    var b = new BigInteger("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", 16);
    var n = new BigInteger("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", 16);
    var h = BigInteger.ONE;
    var curve = new ECCurveFp(q, a, b);
    var G = curve.decodePointHex("04" +
        "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" +
        "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5");
    return {
        q: q,
        a: a,
        b: b,
        gx: G.getX().toBigInteger(),
        gy: G.getY().toBigInteger(),
        n: n
    };
})();

var client_private;
var client_public_x;
var client_public_y;
var global_key;

var rng;

function do_init() {
    rng = new SecureRandom();
}

function get_curve() {
    return new ECCurveFp(global_curve.q, global_curve.a, global_curve.b);
}

function get_G(curve) {
    return new ECPointFp(curve, curve.fromBigInteger(global_curve.gx), curve.fromBigInteger(global_curve.gy));
}

function pick_rand() {
    return new BigInteger(global_curve.n.bitLength(), rng)
        .mod(global_curve.n.subtract(BigInteger.ONE))
        .add(BigInteger.ONE);
}

function init_exchange() {
    client_private = pick_rand();
    var curve = get_curve();
    var G = get_G(curve);
    var P = G.multiply(client_private);
   ...