From 2983d225cc08c4b5cc535eea9481dcdefa643c45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julia=20Kr=C3=BCger?= Date: Mon, 8 Jan 2024 18:31:52 +0100 Subject: [PATCH] refactor: s2k uses gnuType for dummy keys --- src/packet/secret_key.js | 9 +++--- src/type/s2k/gnu.ts | 59 ++++++---------------------------------- src/type/s2k/index.ts | 2 +- 3 files changed, 14 insertions(+), 56 deletions(-) diff --git a/src/packet/secret_key.js b/src/packet/secret_key.js index d260d12d..8cdd7db6 100644 --- a/src/packet/secret_key.js +++ b/src/packet/secret_key.js @@ -134,7 +134,7 @@ class SecretKeyPacket extends PublicKeyPacket { this.s2k = newS2KFromType(s2kType); i += this.s2k.read(bytes.subarray(i, bytes.length)); - if (this.s2k.type === 'gnu-dummy') { + if (this.s2k.gnuType === 'gnu-dummy') { return; } } else if (this.s2kUsage) { @@ -253,7 +253,7 @@ class SecretKeyPacket extends PublicKeyPacket { // - [Optional] If secret data is encrypted (string-to-key usage octet // not zero), an Initial Vector (IV) of the same length as the // cipher's block size. - if (this.s2kUsage && this.s2k.type !== 'gnu-dummy') { + if (this.s2kUsage && this.s2k.gnuType !== 'gnu-dummy') { optionalFieldsArr.push(...this.iv); } @@ -306,7 +306,7 @@ class SecretKeyPacket extends PublicKeyPacket { * @returns {Boolean} */ isDummy() { - return !!(this.s2k && this.s2k.type === 'gnu-dummy'); + return !!(this.s2k && this.s2k.gnuType === 'gnu-dummy'); } /** @@ -327,7 +327,8 @@ class SecretKeyPacket extends PublicKeyPacket { this.s2k = newS2KFromType(enums.s2k.gnu, config); this.s2k.algorithm = 0; this.s2k.c = 0; - this.s2k.type = 'gnu-dummy'; + this.s2k.type = 'gnu'; + this.s2k.gnuType = 'gnu-dummy'; this.s2kUsage = 254; this.symmetric = enums.symmetric.aes256; } diff --git a/src/type/s2k/gnu.ts b/src/type/s2k/gnu.ts index cdbe3154..2fbceb10 100644 --- a/src/type/s2k/gnu.ts +++ b/src/type/s2k/gnu.ts @@ -15,46 +15,14 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -/** - * Implementation of the String-to-key specifier - * - * {@link https://tools.ietf.org/html/rfc4880#section-3.7|RFC4880 3.7}: - * String-to-key (S2K) specifiers are used to convert passphrase strings - * into symmetric-key encryption/decryption keys. They are used in two - * places, currently: to encrypt the secret part of private keys in the - * private keyring, and to convert passphrases to encryption keys for - * symmetrically encrypted messages. - * @module type/s2k - */ - -import defaultConfig from '../../config'; import enums from '../../enums'; import { UnsupportedError } from '../../packet/packet'; import util from '../../util'; -class GnuS2k { - algorithm: number; - type: string; - c: number; - /** - * @param {Object} [config] - Full configuration, defaults to openpgp.config - */ - constructor(config = defaultConfig) { - /** - * Hash function identifier, or 0 for gnu-dummy keys - * @type {module:enums.hash | 0} - */ - this.algorithm = enums.hash.sha256; - /** - * enums.s2k identifier or 'gnu-dummy' - * @type {String} - */ - this.type = 'gnu'; - /** - * @type {Integer} - */ - this.c = config.s2kIterationCountByte; - } +class GnuS2K { + type: 'gnu' = 'gnu'; + gnuType?: 'gnu-dummy' = undefined; + algorithm: number = enums.hash.sha256 /** * Parsing function for a string-to-key specifier ({@link https://tools.ietf.org/html/rfc4880#section-3.7|RFC 4880 3.7}). @@ -68,7 +36,7 @@ class GnuS2k { i += 3; // GNU const gnuExtType = 1000 + bytes[i++]; if (gnuExtType === 1001) { - this.type = 'gnu-dummy'; + this.gnuType = 'gnu-dummy'; // GnuPG extension mode 1001 -- don't write secret key at all } else { throw new UnsupportedError('Unknown s2k gnu protection mode.'); @@ -85,7 +53,7 @@ class GnuS2k { * @returns {Uint8Array} Binary representation of s2k. */ write(): Uint8Array { - if (this.type === 'gnu-dummy') { + if (this.gnuType === 'gnu-dummy') { return new Uint8Array([101, 0, ...util.stringToUint8Array('GNU'), 1]); } else { throw new Error('GNU s2k type not supported.'); @@ -101,19 +69,8 @@ class GnuS2k { * @async */ async produceKey(passphrase: string, numBytes: number): Promise { - const arr: number[] = []; - let rlength = 0; - - while (rlength < numBytes) { - if (this.type !== 'gnu') { - throw new Error('Unknown s2k type.'); - } else { - throw new Error('GNU s2k type not supported.'); - } - } - - return util.concatUint8Array(arr).subarray(0, numBytes); + throw new Error('Gnu S2K does not support producing keys'); } } -export default GnuS2k; +export default GnuS2K; diff --git a/src/type/s2k/index.ts b/src/type/s2k/index.ts index 9b5d23e4..2948cfbb 100644 --- a/src/type/s2k/index.ts +++ b/src/type/s2k/index.ts @@ -17,7 +17,7 @@ const allowedS2KTypesForEncryption = new Set([enums.s2k.argon2, enums.s2k.iterat export function newS2KFromType (type: number, config = defaultConfig): Argon2S2K | GenericS2K | GnuS2K { switch (type) { case enums.s2k.gnu: - return new GnuS2K(config); + return new GnuS2K(); case enums.s2k.argon2: return new Argon2S2K(config); case enums.s2k.iterated: