CryptoJS PBKDF2 for key+IV

generating key and IV using a single pbkdf2 invocation

by artjomb

HTML

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script>
<dl>
    <dt>Password</dt>
    <dd><input type="text" name="password"/></dd>
    <dt>Salt (Base64)</dt>
    <dd id="salt"></dd>
    <dt>Iterations</dt>
    <dd id="iter"></dd>
    <dt>Key size (bits)</dt>
    <dd id="keysize"></dd>
    <dt>IV size (bits)</dt>
    <dd id="ivsize"></dd>
    <dt>Hash-function</dt>
    <dd id="hasher"></dd>
    <dt>Key (Base64)</dt>
    <dd id="key"></dd>
    <dt>IV (Base64)</dt>
    <dd id="iv"></dd>
</dl>

<button>Run</button>

JavaScript

$("button").click(function(){
    var password = $("[name='password']").val();

    var iterations = 1000;
    // sizes must be a multiple of 32
    var keySize = 256;
    var ivSize = 128;
    var salt = CryptoJS.lib.WordArray.random(128/8);
    
    $("#salt").html(salt.toString(CryptoJS.enc.Base64));
    $("#iter").html(iterations);
    $("#keysize").html(keySize);
    $("#ivsize").html(ivSize);
    
    var output = CryptoJS.PBKDF2(password, salt, {
        keySize: (keySize+ivSize)/32,
        iterations: iterations
    });
    
    // the underlying words arrays might have more content than was asked: remove insignificant words
    output.clamp();
    
    var key = CryptoJS.lib.WordArray.create(output.words.slice(0, keySize/32));
    var iv = CryptoJS.lib.WordArray.create(output.words.slice(keySize/32));
    
    $("#hasher").html("SHA1");
    
    $("#key").html(key.toString(CryptoJS.enc.Base64));
    $("#iv").html(iv.toString(CryptoJS.enc.Base64));
});