docs: function (user_id, cookie, passphrase, callback) {
  		var packed_user_id = String.fromCharCode(0, 0, 0, 0, user_id >> 24 & 0xFF, user_id >> 16 & 0xFF, user_id >> 8 & 0xFF, user_id & 0xFF);
  		var client_nonce = "";
  		for (var i = 0; i < 16; ++i) {
  			client_nonce += String.fromCharCode(Math.random() * 256);
  		}
  		var seed = packed_user_id + unescape(encodeURIComponent(passphrase));
  		var data = packed_user_id + _server_nonce + client_nonce;
  		var d = ecp.mpn_pack(util.hash_string_to_words(seed));
  		var z = ecp.mpn_pack(util.hash_string_to_words(data));
  		var r = ecp.mpn_new(8), s = ecp.mpn_new(8);
  		ecp.ecp_sign(r, s, ecp.secp224k1_p, ecp.secp224k1_a, ecp.secp224k1_G, ecp.secp224k1_n, d, z, 8);
  		request({
  			method: "Authenticate",
  			user_id: user_id,
  			cookie: cookie,
  			nonce: btoa(client_nonce),
  			signature: [ btoa(util.words_to_string(ecp.mpn_unpack(r))), btoa(util.words_to_string(ecp.mpn_unpack(s))) ],
  		}, callback);
  	}