js: Add key creation to Keyring

--

* src/Keyring.js: Added method generateKey for new Keys
  Still TODO: Key length and some further testing. Automated testing
  does not work in this case, and gpgmejs will not be able to delete
  test keys again.
* src/permittedOperations.js Added new method's definitions according
  to gpgme-json
This commit is contained in:
Maximilian Krambach 2018-06-11 12:08:50 +02:00
parent c072675f3f
commit e97e6c06e9
2 changed files with 80 additions and 3 deletions

View File

@ -197,5 +197,63 @@ export class GPGME_Keyring {
}
}
// generateKey
/**
* Generates a new Key pair directly in gpg, and returns a GPGME_Key
* representing that Key. Please note that due to security concerns, secret
* Keys can not be _deleted_ from inside gpgmejs.
*
* @param {String} userId The user Id, e.g. "Foo Bar <foo@bar.baz>"
* @param {*} algo (optional) algorithm to be used. See
* {@link supportedKeyAlgos } below for supported values.
* @param {Number} keyLength (optional) TODO
* @param {Date} expires (optional) Expiration date. If not set, expiration
* will be set to 'never'
*
* @returns{Promise<Key>}
*/
generateKey(userId, algo = 'default', keyLength, expires){
if (
typeof(userId) !== 'string' ||
supportedKeyAlgos.indexOf(algo) < 0 ||
(expires && !(expires instanceof Date))
// TODO keylength
// TODO check for completeness of algos
){
return Promise.reject(gpgme_error('PARAM_WRONG'));
}
let me = this;
return new Promise(function(resolve, reject){
let msg = createMessage('createkey');
msg.setParameter('userid', userId);
msg.setParameter('algo', algo);
if (expires){
msg.setParameter('expires',
Math.floor(expires.valueOf()/1000));
}
// TODO append keylength to algo
msg.post().then(function(response){
me.getKeys(response.fingerprint, true).then(
// TODO make prepare_sync (second parameter) optional here.
function(result){
resolve(result);
}, function(error){
reject(error);
});
}, function(error) {
reject(error);
});
});
}
}
/**
* A list of algorithms supported for key generation.
*/
const supportedKeyAlgos = [
'default',
'rsa',
'dsa',
'elg',
'ed25519',
'cv25519'
];

View File

@ -311,12 +311,31 @@ export const permittedOperations = {
'info': 'object'
}
}
}
},
createkey: {
pinentry: true,
required: {
userid: {
allowed: ['string']
}
},
optional: {
algo: {
allowed: ['string']
},
expires: {
allowed: ['number'],
}
},
answer: {
type: [''],
data: {'fingerprint': 'string'}
}
}
/**
* TBD handling of secrets
* TBD key modification?
* TBD: key generation
*/
};