Support multiple keys per ASCII armored block. Unify error handling: replace print_error function

with exceptions. The idea is to use exceptions internally, but catch them in the high level API
functions and return errors as implemented in openpgp.key.readArmored.
This commit is contained in:
Thomas Oberndörfer 2013-12-17 16:09:52 +01:00
parent a31fe80a2c
commit 1ca90a980c
19 changed files with 262 additions and 142 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -383,8 +383,7 @@ function keyExpansion(key) {
rounds = 14; rounds = 14;
kc = 8; kc = 8;
} else { } else {
util.print_error('aes.js: Invalid key-length for AES key:' + keylen); throw new Error('Invalid key-length for AES key:' + keylen);
return;
} }
for (i = 0; i < maxrk + 1; i++) keySched[i] = new Array(4); for (i = 0; i < maxrk + 1; i++) keySched[i] = new Array(4);

View File

@ -29,8 +29,7 @@ function openpgp_symenc_cast5() {
if (key.length == this.KeySize) { if (key.length == this.KeySize) {
this.keySchedule(key); this.keySchedule(key);
} else { } else {
util.print_error('cast5.js: CAST-128: keys must be 16 bytes'); throw new Error('CAST-128: keys must be 16 bytes');
return false;
} }
return true; return true;
}; };

View File

@ -86,7 +86,7 @@ function DSA() {
s1.compareTo(q) > 0 || s1.compareTo(q) > 0 ||
BigInteger.ZERO.compareTo(s2) > 0 || BigInteger.ZERO.compareTo(s2) > 0 ||
s2.compareTo(q) > 0) { s2.compareTo(q) > 0) {
util.print_error("invalid DSA Signature"); util.print_debug("invalid DSA Signature");
return null; return null;
} }
var w = s2.modInverse(q); var w = s2.modInverse(q);

View File

@ -240,9 +240,8 @@ function split_checksum(text) {
* DeArmor an OpenPGP armored message; verify the checksum and return * DeArmor an OpenPGP armored message; verify the checksum and return
* the encoded bytes * the encoded bytes
* @param {String} text OpenPGP armored message * @param {String} text OpenPGP armored message
* @returns {(Boolean|Object)} Either false in case of an error * @returns {Object} An object with attribute "text" containing the message text,
* or an object with attribute "text" containing the message text * an attribute "data" containing the bytes and "type" for the ASCII armor type
* and an attribute "data" containing the bytes.
*/ */
function dearmor(text) { function dearmor(text) {
var reSplit = /^-----[^-]+-----$\n/m; var reSplit = /^-----[^-]+-----$\n/m;
@ -250,6 +249,9 @@ function dearmor(text) {
text = text.replace(/\r/g, ''); text = text.replace(/\r/g, '');
var type = get_type(text); var type = get_type(text);
if (!type) {
throw new Error('Unknow ASCII armor type');
}
var splittext = text.split(reSplit); var splittext = text.split(reSplit);
@ -290,11 +292,10 @@ function dearmor(text) {
} }
if (!verifyCheckSum(result.data, checksum)) { if (!verifyCheckSum(result.data, checksum)) {
util.print_error("Ascii armor integrity check on message failed: '" throw new Error("Ascii armor integrity check on message failed: '"
+ checksum + checksum
+ "' should be '" + "' should be '"
+ getCheckSum(result) + "'"); + getCheckSum(result) + "'");
return false;
} else { } else {
return result; return result;
} }

View File

@ -294,19 +294,39 @@ Key.prototype.revoke = function() {
}; };
/** /**
* Reads an OpenPGP armored text and returns a key object * Reads an OpenPGP armored text and returns one or multiple key objects
* @param {String} armoredText text to be parsed * @param {String} armoredText text to be parsed
* @return {key} new key object * @return {{keys: [Key], err: [Error]|null}} result object with key and error arrays
*/ */
function readArmored(armoredText) { function readArmored(armoredText) {
var result = {};
result.keys = [];
try {
var input = armor.decode(armoredText); var input = armor.decode(armoredText);
if (!(input.type == enums.armor.public_key || input.type == enums.armor.private_key)) { if (!(input.type == enums.armor.public_key || input.type == enums.armor.private_key)) {
throw new Error('Armored text not of type key'); throw new Error('Armored text not of type key');
} }
var packetlist = new packet.list(); var packetlist = new packet.list();
packetlist.read(input.data); packetlist.read(input.data);
var newKey = new Key(packetlist); var keyIndex = packetlist.indexOfTag(enums.packet.public_key, enums.packet.secret_key);
return newKey; if (keyIndex.length == 0) {
throw new Error('No key packet found in armored text')
}
for (var i = 0; i < keyIndex.length; i++) {
var oneKeyList = packetlist.slice(keyIndex[i], keyIndex[i + 1]);
try {
var newKey = new Key(oneKeyList);
result.keys.push(newKey);
} catch (e) {
result.err = result.err || [];
result.err.push(e);
}
}
} catch (e) {
result.err = result.err || [];
result.err.push(e);
}
return result;
} }
/** /**

View File

@ -119,7 +119,7 @@ var keyring = function() {
* @param {String} armored message to read the keys/key from * @param {String} armored message to read the keys/key from
*/ */
function importKey(armored) { function importKey(armored) {
this.keys.push(openpgp.key.readArmored(armored)); this.keys = this.keys.concat(openpgp.key.readArmored(armored).keys);
return true; return true;
} }

View File

@ -106,7 +106,7 @@ module.exports = function packet_compressed() {
break; break;
} else { } else {
util.print_error("Compression algorithm ZLIB only supports " + throw new Error("Compression algorithm ZLIB only supports " +
"DEFLATE compression method."); "DEFLATE compression method.");
} }
break; break;
@ -140,23 +140,23 @@ module.exports = function packet_compressed() {
case 'zip': case 'zip':
// - ZIP [RFC1951] // - ZIP [RFC1951]
util.print_error("Compression algorithm ZIP [RFC1951] is not implemented."); throw new Error("Compression algorithm ZIP [RFC1951] is not implemented.");
break; break;
case 'zlib': case 'zlib':
// - ZLIB [RFC1950] // - ZLIB [RFC1950]
// TODO: need to implement this // TODO: need to implement this
util.print_error("Compression algorithm ZLIB [RFC1950] is not implemented."); throw new Error("Compression algorithm ZLIB [RFC1950] is not implemented.");
break; break;
case 'bzip2': case 'bzip2':
// - BZip2 [BZ2] // - BZip2 [BZ2]
// TODO: need to implement this // TODO: need to implement this
util.print_error("Compression algorithm BZip2 [BZ2] is not implemented."); throw new Error("Compression algorithm BZip2 [BZ2] is not implemented.");
break; break;
default: default:
util.print_error("Compression algorithm unknown :" + this.type); throw new Error("Compression algorithm unknown :" + this.type);
break; break;
} }
} }

View File

@ -119,9 +119,7 @@ module.exports = {
// some sanity checks // some sanity checks
if (input == null || input.length <= position || input.substring(position).length < 2 || (input.charCodeAt(position) & if (input == null || input.length <= position || input.substring(position).length < 2 || (input.charCodeAt(position) &
0x80) == 0) { 0x80) == 0) {
util throw new Error("Error during parsing. This message / key is probably not containing a valid OpenPGP format.");
.print_error("Error during parsing. This message / key is probably not containing a valid OpenPGP format.");
return null;
} }
var mypos = position; var mypos = position;
var tag = -1; var tag = -1;

View File

@ -125,4 +125,33 @@ module.exports = function packetlist() {
return null; return null;
} }
/**
* Returns array of found indices by tag
*/
this.indexOfTag = function() {
var args = Array.prototype.slice.call(arguments);
var tagIndex = [];
var that = this;
for (var i = 0; i < this.length; i++) {
if (args.some(function(packetType) {return that[i].tag == packetType})) {
tagIndex.push(i);
}
}
return tagIndex;
}
/**
* Returns slice of packetlist
*/
this.slice = function(begin, end) {
if (!end) {
end = this.length
}
var part = new packetlist();
for (var i = begin; i < end; i++) {
part.push(this[i]);
}
return part;
}
} }

View File

@ -85,8 +85,9 @@ module.exports = function packet_public_key() {
p += this.mpi[i].read(bmpi.substr(p)) p += this.mpi[i].read(bmpi.substr(p))
if (p > bmpi.length) if (p > bmpi.length) {
util.print_error("openpgp.packet.keymaterial.js\n" + 'error reading MPI @:' + p); throw new Error('Error reading MPI @:' + p);
}
} }
return p + 6; return p + 6;

View File

@ -493,9 +493,7 @@ module.exports = function packet_signature() {
this.embeddedSignature.read(bytes.substr(mypos)); this.embeddedSignature.read(bytes.substr(mypos));
break; break;
default: default:
util.print_error("openpgp.packet.signature.js\n" + throw new Error("Unknown signature subpacket type " + type + " @:" + mypos);
'unknown signature subpacket type ' + type + " @:" + mypos +
" subplen:" + subplen + " len:" + len);
break; break;
} }
}; };

View File

@ -246,29 +246,6 @@ var Util = function() {
} }
}; };
/**
* Helper function to print an error message.
* @param {String} str String of the error message
*/
this.print_error = function(str) {
if (config.debug)
throw str;
console.log(str);
};
/**
* Helper function to print an info message.
* @param {String} str String of the info message
*/
this.print_info = function(str) {
if (config.debug)
console.log(str);
};
this.print_warning = function(str) {
console.log(str);
};
this.getLeftNBits = function(string, bitcount) { this.getLeftNBits = function(string, bitcount) {
var rest = bitcount % 8; var rest = bitcount % 8;
if (rest == 0) if (rest == 0)

View File

@ -115,9 +115,9 @@ describe('Openpgp integration tests', function() {
describe('Encrypt and Sign', function() { describe('Encrypt and Sign', function() {
it('should work', function(done) { it('should work', function(done) {
var signkey = openpgp.key.readArmored(privkey); var signkey = openpgp.key.readArmored(privkey).keys[0];
expect(signkey).to.exist; expect(signkey).to.exist;
var encryptkey = openpgp.key.readArmored(pubkey); var encryptkey = openpgp.key.readArmored(pubkey).keys[0];
expect(encryptkey).to.exist; expect(encryptkey).to.exist;
expect(signkey.decrypt(passphrase)).to.be.true; expect(signkey.decrypt(passphrase)).to.be.true;
ciphertext = openpgp.signAndEncryptMessage([encryptkey], signkey, message); ciphertext = openpgp.signAndEncryptMessage([encryptkey], signkey, message);
@ -128,9 +128,9 @@ describe('Openpgp integration tests', function() {
describe('Decrypt and Verify', function() { describe('Decrypt and Verify', function() {
it('should work', function(done) { it('should work', function(done) {
var decryptkey = openpgp.key.readArmored(privkey); var decryptkey = openpgp.key.readArmored(privkey).keys[0];
expect(decryptkey, 'decryptkey').to.exist; expect(decryptkey, 'decryptkey').to.exist;
var verifykey = openpgp.key.readArmored(pubkey); var verifykey = openpgp.key.readArmored(pubkey).keys[0];
expect(verifykey, 'verifykey').to.exist; expect(verifykey, 'verifykey').to.exist;
var pgpmsg = openpgp.message.readArmored(ciphertext); var pgpmsg = openpgp.message.readArmored(ciphertext);
expect(pgpmsg, 'pgpmsg').to.exist; expect(pgpmsg, 'pgpmsg').to.exist;
@ -180,7 +180,7 @@ describe('Openpgp integration tests', function() {
it('should work', function(done) { it('should work', function(done) {
var cleartext = openpgp.cleartext.readArmored(v3_clearsign_msg); var cleartext = openpgp.cleartext.readArmored(v3_clearsign_msg);
expect(cleartext).to.exist; expect(cleartext).to.exist;
var verifykey = openpgp.key.readArmored(pubkey); var verifykey = openpgp.key.readArmored(pubkey).keys[0];
expect(verifykey, 'verifykey').to.exist; expect(verifykey, 'verifykey').to.exist;
var result = cleartext.verify([verifykey]) var result = cleartext.verify([verifykey])
expect(result, 'verify() result').to.exist.and.not.be.empty; expect(result, 'verify() result').to.exist.and.not.be.empty;
@ -223,7 +223,7 @@ describe('Openpgp integration tests', function() {
it('should work', function(done) { it('should work', function(done) {
var cleartext = openpgp.cleartext.readArmored(v4_clearsign_msg); var cleartext = openpgp.cleartext.readArmored(v4_clearsign_msg);
expect(cleartext).to.exist; expect(cleartext).to.exist;
var verifykey = openpgp.key.readArmored(pubkey); var verifykey = openpgp.key.readArmored(pubkey).keys[0];
expect(verifykey, 'verifykey').to.exist; expect(verifykey, 'verifykey').to.exist;
var result = cleartext.verify([verifykey]) var result = cleartext.verify([verifykey])
expect(result, 'verify() result').to.exist.and.not.be.empty; expect(result, 'verify() result').to.exist.and.not.be.empty;

View File

@ -11,7 +11,7 @@ unit.register("Key generation/encryption/decryption", function() {
+ 'userid: ' + userid + '\n' + 'userid: ' + userid + '\n'
+ 'message: ' + message; + 'message: ' + message;
var privKey = openpgp.key.readArmored(key.privateKeyArmored); var privKey = openpgp.key.readArmored(key.privateKeyArmored).keys[0];
var encrypted = openpgp.encryptMessage([privKey], message); var encrypted = openpgp.encryptMessage([privKey], message);
@ -111,13 +111,13 @@ unit.register("Message encryption/decryption", function() {
var plaintext = 'short message\nnext line\n한국어/조선말'; var plaintext = 'short message\nnext line\n한국어/조선말';
var key = openpgp.key.readArmored(pub_key); var key = openpgp.key.readArmored(pub_key).keys[0];
var encrypted = openpgp.encryptMessage([key], plaintext); var encrypted = openpgp.encryptMessage([key], plaintext);
var message = openpgp.message.readArmored(encrypted); var message = openpgp.message.readArmored(encrypted);
var privKey = openpgp.key.readArmored(priv_key); var privKey = openpgp.key.readArmored(priv_key).keys[0];
// get key IDs the message is encrypted for // get key IDs the message is encrypted for
var keyids = message.getEncryptionKeyIds(); var keyids = message.getEncryptionKeyIds();

75
test/general/key.js Normal file
View File

@ -0,0 +1,75 @@
var unit = require('../unit.js');
unit.register("Key testing", function() {
var openpgp = require('openpgp');
var twoKeys =
['-----BEGIN PGP PUBLIC KEY BLOCK-----',
'Version: GnuPG v2.0.19 (GNU/Linux)',
'',
'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',
'PepQmgsu',
'=w6wd',
'-----END PGP PUBLIC KEY BLOCK-----'].join("\n");
var tests = [function() {
var pubKey = openpgp.key.readArmored(twoKeys);
var verified = !pubKey.err && pubKey.keys.length == 2 &&
pubKey.keys[0].getKeyPacket().getKeyId().toHex() == '4a63613a4d6e4094' &&
pubKey.keys[1].getKeyPacket().getKeyId().toHex() == 'dbf223e870534df4';
return new unit.result("Parsing armored text with two keys", verified);
}];
var results = [];
for(var i in tests) {
results.push(tests[i]());
}
return results;
});

View File

@ -252,8 +252,8 @@ var pub_v3 =
var tests = [function() { var tests = [function() {
var priv_key = openpgp.key.readArmored(priv_key_arm1).packets; var priv_key = openpgp.key.readArmored(priv_key_arm1).keys[0].packets;
var pub_key = openpgp.key.readArmored(pub_key_arm1).packets; var pub_key = openpgp.key.readArmored(pub_key_arm1).keys[0].packets;
var msg = openpgp.message.readArmored(msg_arm1).packets; var msg = openpgp.message.readArmored(msg_arm1).packets;
//TODO need both? //TODO need both?
priv_key[0].decrypt("abcd"); priv_key[0].decrypt("abcd");
@ -295,8 +295,8 @@ var pub_v3 =
'iY3UT9QkV9d0sMgyLkug', 'iY3UT9QkV9d0sMgyLkug',
'=GQsY', '=GQsY',
'-----END PGP PRIVATE KEY BLOCK-----', '-----END PGP PRIVATE KEY BLOCK-----',
].join("\n")).packets; ].join("\n")).keys[0].packets;
var pub_key = openpgp.key.readArmored(pub_key_arm1).packets; var pub_key = openpgp.key.readArmored(pub_key_arm1).keys[0].packets;
var msg = openpgp.message.readArmored(msg_arm1).packets; var msg = openpgp.message.readArmored(msg_arm1).packets;
priv_key_gnupg_ext[3].decrypt("abcd"); priv_key_gnupg_ext[3].decrypt("abcd");
@ -321,7 +321,7 @@ var pub_v3 =
'-----END PGP MESSAGE-----'].join('\n'); '-----END PGP MESSAGE-----'].join('\n');
var sMsg = openpgp.message.readArmored(signedArmor).packets; var sMsg = openpgp.message.readArmored(signedArmor).packets;
var pub_key = openpgp.key.readArmored(pub_key_arm2).packets; var pub_key = openpgp.key.readArmored(pub_key_arm2).keys[0].packets;
sMsg[0].packets[2].verify(pub_key[3], sMsg[0].packets[1]); sMsg[0].packets[2].verify(pub_key[3], sMsg[0].packets[1]);
return new unit.result("Verify V4 signature. Hash: SHA1. PK: RSA. Signature Type: 0x00 (binary document)", sMsg[0].packets[2].verified); return new unit.result("Verify V4 signature. Hash: SHA1. PK: RSA. Signature Type: 0x00 (binary document)", sMsg[0].packets[2].verified);
}, function() { }, function() {
@ -339,7 +339,7 @@ var pub_v3 =
'-----END PGP MESSAGE-----'].join('\n'); '-----END PGP MESSAGE-----'].join('\n');
var sMsg = openpgp.message.readArmored(signedArmor).packets; var sMsg = openpgp.message.readArmored(signedArmor).packets;
var pub_key = openpgp.key.readArmored(pub_key_arm2).packets; var pub_key = openpgp.key.readArmored(pub_key_arm2).keys[0].packets;
sMsg[0].packets[2].verify(pub_key[3], sMsg[0].packets[1]); sMsg[0].packets[2].verify(pub_key[3], sMsg[0].packets[1]);
return new unit.result("Verify V3 signature. Hash: MD5. PK: RSA. Signature Type: 0x01 (text document)", sMsg[0].packets[2].verified); return new unit.result("Verify V3 signature. Hash: MD5. PK: RSA. Signature Type: 0x01 (text document)", sMsg[0].packets[2].verified);
}, function() { }, function() {
@ -362,8 +362,8 @@ var pub_v3 =
var plaintext = 'short message\nnext line\n한국어/조선말'; var plaintext = 'short message\nnext line\n한국어/조선말';
var esMsg = openpgp.message.readArmored(msg_armor); var esMsg = openpgp.message.readArmored(msg_armor);
var pubKey = openpgp.key.readArmored(pub_key_arm2); var pubKey = openpgp.key.readArmored(pub_key_arm2).keys[0];
var privKey = openpgp.key.readArmored(priv_key_arm2); var privKey = openpgp.key.readArmored(priv_key_arm2).keys[0];
var keyids = esMsg.getEncryptionKeyIds(); var keyids = esMsg.getEncryptionKeyIds();
privKey.decryptKeyPacket(keyids, 'hello world'); privKey.decryptKeyPacket(keyids, 'hello world');
@ -393,8 +393,8 @@ var pub_v3 =
var plaintext = 'short message\nnext line\n한국어/조선말\n\n'; var plaintext = 'short message\nnext line\n한국어/조선말\n\n';
var esMsg = openpgp.message.readArmored(msg_armor); var esMsg = openpgp.message.readArmored(msg_armor);
var pubKey = openpgp.key.readArmored(pub_key_arm2); var pubKey = openpgp.key.readArmored(pub_key_arm2).keys[0];
var privKey = openpgp.key.readArmored(priv_key_arm2); var privKey = openpgp.key.readArmored(priv_key_arm2).keys[0];
var keyids = esMsg.getEncryptionKeyIds(); var keyids = esMsg.getEncryptionKeyIds();
privKey.decryptKeyPacket(keyids, 'hello world'); privKey.decryptKeyPacket(keyids, 'hello world');
@ -425,8 +425,8 @@ var pub_v3 =
var plaintext = 'short message\nnext line\n한국어/조선말'; var plaintext = 'short message\nnext line\n한국어/조선말';
var sMsg = openpgp.message.readArmored(msg_armor); var sMsg = openpgp.message.readArmored(msg_armor);
var pubKey2 = openpgp.key.readArmored(pub_key_arm2); var pubKey2 = openpgp.key.readArmored(pub_key_arm2).keys[0];
var pubKey3 = openpgp.key.readArmored(pub_key_arm3); var pubKey3 = openpgp.key.readArmored(pub_key_arm3).keys[0];
var keyids = sMsg.getSigningKeyIds(); var keyids = sMsg.getSigningKeyIds();
@ -466,8 +466,8 @@ var pub_v3 =
var plaintext = 'short message\nnext line\n한국어/조선말'; var plaintext = 'short message\nnext line\n한국어/조선말';
var csMsg = openpgp.cleartext.readArmored(msg_armor); var csMsg = openpgp.cleartext.readArmored(msg_armor);
var pubKey2 = openpgp.key.readArmored(pub_key_arm2); var pubKey2 = openpgp.key.readArmored(pub_key_arm2).keys[0];
var pubKey3 = openpgp.key.readArmored(pub_key_arm3); var pubKey3 = openpgp.key.readArmored(pub_key_arm3).keys[0];
var keyids = csMsg.getSigningKeyIds(); var keyids = csMsg.getSigningKeyIds();
@ -483,8 +483,8 @@ var pub_v3 =
}, function() { }, function() {
var plaintext = 'short message\nnext line\n한국어/조선말'; var plaintext = 'short message\nnext line\n한국어/조선말';
var pubKey = openpgp.key.readArmored(pub_key_arm2); var pubKey = openpgp.key.readArmored(pub_key_arm2).keys[0];
var privKey = openpgp.key.readArmored(priv_key_arm2); var privKey = openpgp.key.readArmored(priv_key_arm2).keys[0];
privKey.getSigningKeyPacket().decrypt('hello world'); privKey.getSigningKeyPacket().decrypt('hello world');
var clearSignedArmor = openpgp.signClearMessage([privKey], plaintext); var clearSignedArmor = openpgp.signClearMessage([privKey], plaintext);
@ -500,21 +500,21 @@ var pub_v3 =
return new unit.result("Sign text with openpgp.signClearMessage and verify with openpgp.verifyClearSignedMessage leads to same cleartext and valid signatures", verified); return new unit.result("Sign text with openpgp.signClearMessage and verify with openpgp.verifyClearSignedMessage leads to same cleartext and valid signatures", verified);
}, function() { }, function() {
var pubKey = openpgp.key.readArmored(pub_revoked); var pubKey = openpgp.key.readArmored(pub_revoked).keys[0];
var verified = pubKey.packets[1].verify(pubKey.packets[0], {key: pubKey.packets[0]}); var verified = pubKey.packets[1].verify(pubKey.packets[0], {key: pubKey.packets[0]});
return new unit.result("Verify revocation signature", verified); return new unit.result("Verify revocation signature", verified);
}, function() { }, function() {
var pubKey = openpgp.key.readArmored(pub_revoked); var pubKey = openpgp.key.readArmored(pub_revoked).keys[0];
var verified = !pubKey.packets[4].keyNeverExpires && pubKey.packets[4].keyExpirationTime == 5*365*24*60*60; var verified = !pubKey.packets[4].keyNeverExpires && pubKey.packets[4].keyExpirationTime == 5*365*24*60*60;
return new unit.result("Verify key expiration date", verified); return new unit.result("Verify key expiration date", verified);
}, function() { }, function() {
var pubKey = openpgp.key.readArmored(pub_v3); var pubKey = openpgp.key.readArmored(pub_v3).keys[0];
var verified = pubKey.packets[3].verify(pubKey.packets[0], {key: pubKey.packets[0], userid: pubKey.packets[2]}); var verified = pubKey.packets[3].verify(pubKey.packets[0], {key: pubKey.packets[0], userid: pubKey.packets[2]});

View File

@ -14,6 +14,7 @@ require('./crypto/cipher/twofish.js');
require('./crypto/crypto.js'); require('./crypto/crypto.js');
require('./general/basic.js'); require('./general/basic.js');
require('./general/key.js');
require('./general/keyring.js'); require('./general/keyring.js');
require('./general/packet.js'); require('./general/packet.js');
require('./general/signature.js'); require('./general/signature.js');