diff --git a/firefox_addon/lib/hmac.js b/firefox_addon/lib/hmac.js
new file mode 100644
index 0000000..ac467ee
--- /dev/null
+++ b/firefox_addon/lib/hmac.js
@@ -0,0 +1,42 @@
+/*
+ Copyright (C) 2013 Grégory Soutadé
+
+ This file is part of gPass.
+
+ gPass is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ gPass is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with gPass. If not, see .
+*/
+
+var sha256 = require("jssha256").sha256;
+
+exports.hmac = {
+ hmac : function(key, message) {
+ var ipad = "";
+ var opad = "";
+
+ for(i=0; i.
+*/
+
+var hmac256 = require("hmac").hmac;
+
+// http://stackoverflow.com/questions/3745666/how-to-convert-from-hex-to-ascii-in-javascript
+function hex2a(hex) {
+ var str = '';
+ for (var i = 0; i < hex.length; i += 2)
+ str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
+ return str;
+}
+
+exports.pkdbf2 = {
+ pkdbf2 : function(password, salt, iterations, outlen) {
+ var result = "";
+ var temp = "";
+ var temp2 = "";
+ var temp_res = "";
+ var temp_res2 = "";
+
+ for (i=1; result.length < outlen; i++)
+ {
+ temp = hex2a(hmac256.hmac(salt +
+ String.fromCharCode((i & 0xff000000) >> 24) +
+ String.fromCharCode((i & 0x00ff0000) >> 16) +
+ String.fromCharCode((i & 0x0000ff00) >> 8) +
+ String.fromCharCode((i & 0x000000ff) >> 0),
+ password));
+ temp_res = temp;
+
+ for(a=1; a