314 lines
9.1 KiB
JavaScript
314 lines
9.1 KiB
JavaScript
/**
|
|
* 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);
|
|
}
|
|
});
|
|
});
|