verifyAcceptableDsaKeyUse(algorithm.name, 'public', usagesSet); keyObject = createPublicKey({ key: keyData, format: 'der', type: 'spki' }); break; } case 'pkcs8': { verifyAcceptableDsaKeyUse(algorithm.name, 'private', usagesSet); keyObject = createPrivateKey({ key: keyData, format: 'der', type: 'pkcs8' }); break; } default: throw lazyDOMException( `Unable to import DSA key with format ${format}`, 'NotSupportedError'); } if (keyObject.asymmetricKeyType !== 'dsa') throw lazyDOMException('Invalid key type', 'DataError'); const { modulusLength, divisorLength, } = keyObject[kHandle].keyDetail({}); return new InternalCryptoKey(keyObject, { name: algorithm.name, modulusLength, divisorLength, hash: algorithm.hash }, keyUsages, extractable); } function dsaSignVerify(key, data, algorithm, signature) { const mode = signature === undefined ? kSignJobModeSign : kSignJobModeVerify; const type = mode === kSignJobModeSign ? 'private' : 'public'; if (key.type !== type) throw lazyDOMException(`Key must be a ${type} key`, 'InvalidAccessError'); return jobPromise(new SignJob( kCryptoJobAsync, signature === undefined ? kSignJobModeSign : kSignJobModeVerify, key[kKeyObject][kHandle], undefined, undefined, undefined, data, normalizeHashName(key.algorithm.hash.name), undefined, // Salt-length is not used in DSA undefined, // Padding is not used in DSA kSigEncDER, signature)); } module.exports = { dsaExportKey, dsaGenerateKey, dsaImportKey, dsaSignVerify, };