module . exports = function ( chatserver , keyserver ) {
var package = require ( _ _dirname + '/../package.json' )
var config = require ( package . path . config )
var io = require ( 'socket.io-client' )
var openpgp = require ( 'openpgp' )
openpgp . initWorker ( )
openpgp . config . aead _protect = true
var module = function ( ) {
var _hkp = new openpgp . HKP ( keyserver )
var _user = null
this . login = function ( user , password , success , fail ) {
_user = user
_hkp . lookup ( { query : _user . email } ) . then ( function ( key ) {
var data = ( new Date ( ) ) . toLocaleString ( ) + ' ' + _user . name + ' ' + _user . email
console . log ( 'data:' , data )
var pubkeys = openpgp . key . readArmored ( key )
var privkey = openpgp . key . readArmored ( _user . key . priv ) . keys [ 0 ]
privkey . decrypt ( password )
if ( pubkeys . keys . length == 1 ) {
openpgp . encrypt ( {
data : data ,
publicKeys : pubkeys . keys [ 0 ] ,
privateKeys : privkey
} ) . then ( function ( ciphertext ) {
openpgp . decrypt ( {
message : openpgp . message . readArmored ( ciphertext . data ) ,
publicKeys : openpgp . key . readArmored ( _user . key . pub ) . keys [ 0 ] ,
privateKey : privkey
} ) . then ( function ( plaintext ) {
if ( data == plaintext . data ) {
success ( _user )
} else {
fail ( 'local key does not match key on server' )
}
} ) . catch ( function ( e ) {
fail ( 'decryption failed' , e )
} )
} ) . catch ( function ( e ) {
fail ( 'encryption failed' , e )
} )
} else {
fail ( 'more than one public key on server' , pubkeys . keys )
}
} ) . catch ( function ( e ) {
fail ( 'check key on server failed' , e )
} )
}
this . create = function ( name , host , password , success , fail ) {
var _this = this
openpgp . generateKey ( {
numBits : 4096 ,
userIds : [ { name : name , email : name + '@' + host } ] ,
passphrase : password
} ) . then ( function ( key ) {
_user = {
name : name ,
email : name + '@' + host ,
numBits : 4096 ,
key : {
pub : key . publicKeyArmored ,
priv : key . privateKeyArmored
}
}
_hkp . upload ( _user . key . pub ) . then ( function ( ) {
console . log ( 'key successfully uploaded' )
_this . login ( _user , password , success , fail )
} ) . catch ( function ( e ) {
fail ( 'upload key failed' , e )
} )
} ) . catch ( function ( e ) {
fail ( 'generating key pairs failed' , e )
} )
}
}
return new module ( ) ;
}