blob: 7c07ab977e45133bb9e0fde26321f5ea53e532e2 [file] [log] [blame]
/**
* Forge Web ID Tests
*
* @author Dave Longley
*
* Copyright (c) 2010 Digital Bazaar, Inc. All rights reserved.
*/
(function($)
{
// load flash socket pool
window.forge.socketPool = {};
window.forge.socketPool.ready = function()
{
// init forge xhr
forge.xhr.init({
flashId: 'socketPool',
policyPort: 19945,
msie: $.browser.msie,
connections: 10,
caCerts: [],
verify: function(c, verified, depth, certs)
{
// don't care about cert verification for test
return true;
}
});
};
swfobject.embedSWF(
'forge/SocketPool.swf', 'socketPool', '0', '0', '9.0.0',
false, {}, {allowscriptaccess: 'always'}, {});
})(jQuery);
jQuery(function($)
{
var cat = 'forge.tests.webid';
// local alias
var forge = window.forge;
$('#create').click(function()
{
var bits = $('#bits')[0].value;
var uri = $('#uri')[0].value;
var commonName = $('#commonName')[0].value;
forge.log.debug(cat, 'generating ' + bits +
'-bit RSA key-pair and certificate...');
// function to create cert
var createCert = function(keys)
{
try
{
var cert = forge.pki.createCertificate();
cert.serialNumber = '01';
cert.validity.notBefore = new Date();
cert.validity.notAfter = new Date();
cert.validity.notAfter.setFullYear(
cert.validity.notBefore.getFullYear() + 1);
var attrs = [{
name: 'commonName',
value: commonName
}, {
name: 'countryName',
value: 'US'
}, {
shortName: 'ST',
value: 'Virginia'
}, {
name: 'localityName',
value: 'Blacksburg'
}, {
name: 'organizationName',
value: 'Test'
}, {
shortName: 'OU',
value: 'Test'
}];
cert.setSubject(attrs);
cert.setIssuer(attrs);
cert.setExtensions([{
name: 'basicConstraints',
cA: true
}, {
name: 'keyUsage',
keyCertSign: true,
digitalSignature: true,
nonRepudiation: true,
keyEncipherment: true,
dataEncipherment: true
}, {
name: 'subjectAltName',
altNames: [{
type: 6, // URI
value: uri
}]
}]);
// FIXME: add subjectKeyIdentifier extension
// FIXME: add authorityKeyIdentifier extension
cert.publicKey = keys.publicKey;
// self-sign certificate
cert.sign(keys.privateKey);
// verify certificate
forge.log.debug('verified', cert.verify(cert));
forge.log.debug(cat, 'certificate:', cert);
//forge.log.debug(cat,
// forge.asn1.prettyPrint(forge.pki.certificateToAsn1(cert)));
var keyPem = forge.pki.privateKeyToPem(keys.privateKey);
var certPem = forge.pki.certificateToPem(cert);
forge.log.debug(cat, keyPem);
forge.log.debug(cat, certPem);
forge.log.debug(cat, 'storing certificate and private key...');
try
{
// get flash API
var flashApi = document.getElementById('socketPool');
// get web ids collection
var webids = forge.util.getItem(
flashApi, 'forge.test.webid', 'webids');
webids = webids || {};
// add web id
webids[uri] = {
certificate: certPem,
privateKey: keyPem
};
// update web ids collection
forge.util.setItem(
flashApi, 'forge.test.webid', 'webids', webids);
forge.log.debug(cat, 'certificate and private key stored');
$('#show').click();
}
catch(ex)
{
forge.log.error(cat, ex);
}
}
catch(ex)
{
forge.log.error(cat, ex, ex.message ? ex.message : '');
}
};
// create key-generation state and function to step algorithm
var progress = $('#progress');
progress.html('Generating ' + bits + '-bit key-pair.');
var state = forge.pki.rsa.createKeyPairGenerationState(bits);
var kgTime = +new Date();
var step = function()
{
// step key-generation
if(!forge.pki.rsa.stepKeyPairGenerationState(state, 1000))
{
progress.html(progress.html() + '.');
setTimeout(step, 1);
}
// key-generation complete
else
{
kgTime = +new Date() - kgTime;
forge.log.debug(cat, 'Total key-gen time', kgTime + 'ms');
createCert(state.keys);
progress.html(progress.html() + 'done. Time=' + kgTime + 'ms');
}
};
// run key-gen algorithm
setTimeout(step, 0);
});
$('#show').click(function()
{
forge.log.debug(cat, 'get stored web IDs...');
try
{
// get flash API
var flashApi = document.getElementById('socketPool');
// get web ids collection
var webids = forge.util.getItem(
flashApi, 'forge.test.webid', 'webids');
webids = webids || {};
var html = '<ul>';
var webid, cert;
for(var key in webids)
{
webid = webids[key];
cert = forge.pki.certificateFromPem(webid.certificate);
html += '<li><p>' + key + '</p>';
var attr;
for(var n = 0; n < cert.subject.attributes.length; ++n)
{
attr = cert.subject.attributes[n];
html += attr.name + ': ' + attr.value + '<br/>';
}
//html += '<p>' + webid.certificate + '</p></li>';
html += '</li>';
}
if(html === '<ul>')
{
html = 'None';
}
else
{
html += '</ul>';
}
$('#webids').html(html);
forge.log.debug(cat, 'Web IDs retrieved');
}
catch(ex)
{
forge.log.error(cat, ex);
}
});
$('#clear').click(function()
{
forge.log.debug(cat, 'clearing all web IDs...');
try
{
// get flash API
var flashApi = document.getElementById('socketPool');
forge.util.clearItems(flashApi, 'forge.test.webid');
$('#webids').html('None');
forge.log.debug(cat, 'Web IDs cleared');
}
catch(ex)
{
forge.log.error(cat, ex);
}
});
$('#authenticate').click(function()
{
forge.log.debug(cat, 'doing Web ID authentication...');
try
{
// get flash API
var flashApi = document.getElementById('socketPool');
// get web ids collection
var webids = forge.util.getItem(
flashApi, 'forge.test.webid', 'webids');
webids = webids || {};
var uri = $('#webid')[0].value;
var webid = webids[uri];
$.ajax(
{
type: 'GET',
url: '/',
success: function(data, textStatus, xhr)
{
if(data !== '')
{
forge.log.debug(cat, 'authentication completed');
forge.log.debug(cat, data);
}
else
{
forge.log.error(cat, 'authentication failed');
}
},
error: function(xhr, textStatus, errorThrown)
{
forge.log.error(cat, 'authentication failed');
},
xhr: function()
{
return forge.xhr.create({
// FIXME: change URL
url: 'https://localhost:4433',
connections: 10,
caCerts: [],
verify: function(c, verified, depth, certs)
{
// don't care about cert verification for test
return true;
},
getCertificate: function(c)
{
//forge.log.debug(cat, 'using cert', webid.certificate);
return webid.certificate;
},
getPrivateKey: function(c)
{
//forge.log.debug(cat,
// 'using private key', webid.privateKey);
return webid.privateKey;
}
});
}
});
}
catch(ex)
{
forge.log.error(cat, ex);
}
});
});