<!DOCTYPE html>
<html>
<head>
<title>JavaScript Bitcoin Address Validity Checker</title>
<script src="http://crypto-js.googlecode.com/files/2.5.3-crypto-sha256.js"></script>
<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>
<!-- taken from bitcoinjs almost verbatim -->
<script>
BigInteger.valueOf = nbv;
BigInteger.prototype.toByteArrayUnsigned = function () {
var ba = this.toByteArray();
if (ba.length) {
if (ba[0] == 0)
ba = ba.slice(1);
return ba.map(function (v) {
return (v < 0) ? v + 256 : v;
});
} else
return ba;
};
var Bitcoin = {};
(function () {
var B58 = Bitcoin.Base58 = {
alphabet: "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",
base: BigInteger.valueOf(58),
decode: function (input) {
bi = BigInteger.valueOf(0);
var leadingZerosNum = 0;
for (var i = input.length - 1; i >= 0; i--) {
var alphaIndex = B58.alphabet.indexOf(input[i]);
if (alphaIndex < 0) {
throw "Invalid character";
}
bi = bi.add(BigInteger.valueOf(alphaIndex)
.multiply(B58.base.pow(input.length - 1 - i)));
if (input[i] == "1") leadingZerosNum++;
else leadingZerosNum = 0;
}
var bytes = bi.toByteArrayUnsigned();
while (leadingZerosNum-- > 0) bytes.unshift(0);
return bytes;
}
};
})();
Bitcoin.Address = function (bytes) {
if ("string" == typeof bytes)
bytes = Bitcoin.Address.decodeString(bytes);
this.hash = bytes;
this.version = Bitcoin.Address.networkVersion;
};
Bitcoin.Address.networkVersion = 0x00; // mainnet
Bitcoin.Address.decodeString = function (string) {
var bytes = Bitcoin.Base58.decode(string);
var hash = bytes.slice(0, 21);
var checksum = Crypto.SHA256(Crypto.SHA256(hash, { asBytes: true }), { asBytes: true });
if (checksum[0] != bytes[21] ||
checksum[1] != bytes[22] ||
checksum[2] != bytes[23] ||
checksum[3] != bytes[24])
throw "Checksum validation failed!";
var version = hash.shift();
if (version != 0)
throw "Version " + version + " not supported!";
return hash;
};
function check_address(address) {
try {
Bitcoin.Address(address);
return true;
} catch (err) {
return false;
}
}
</script>
</head>
<body>
<input type="text" value="1RRi5kDMck5cj2ob4UcjKxnGL2sjknRtv" size="50" autofocus
oninput="this.style.color=check_address(this.value)?'#000':'#f00'">
</body>
</html>