{"version":3,"file":"getPaddedHex.mjs","sources":["../../../../../../src/providers/cognito/utils/srp/getPaddedHex.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { BigInteger } from './BigInteger';\n/**\n * Tests if a hex string has it most significant bit set (case-insensitive regex)\n */\nconst HEX_MSB_REGEX = /^[89a-f]/i;\n/**\n * Returns an unambiguous, even-length hex string of the two's complement encoding of an integer.\n *\n * It is compatible with the hex encoding of Java's BigInteger's toByteArray(), wich returns a\n * byte array containing the two's-complement representation of a BigInteger. The array contains\n * the minimum number of bytes required to represent the BigInteger, including at least one sign bit.\n *\n * Examples showing how ambiguity is avoided by left padding with:\n * \t\"00\" (for positive values where the most-significant-bit is set)\n *  \"FF\" (for negative values where the most-significant-bit is set)\n *\n * padHex(bigInteger.fromInt(-236))  === \"FF14\"\n * padHex(bigInteger.fromInt(20))    === \"14\"\n *\n * padHex(bigInteger.fromInt(-200))  === \"FF38\"\n * padHex(bigInteger.fromInt(56))    === \"38\"\n *\n * padHex(bigInteger.fromInt(-20))   === \"EC\"\n * padHex(bigInteger.fromInt(236))   === \"00EC\"\n *\n * padHex(bigInteger.fromInt(-56))   === \"C8\"\n * padHex(bigInteger.fromInt(200))   === \"00C8\"\n *\n * @param {AuthBigInteger} bigInt Number to encode.\n * @returns {String} even-length hex string of the two's complement encoding.\n */\nexport const getPaddedHex = (bigInt) => {\n    if (!(bigInt instanceof BigInteger)) {\n        throw new Error('Not a BigInteger');\n    }\n    const isNegative = bigInt.compareTo(BigInteger.ZERO) < 0;\n    /* Get a hex string for abs(bigInt) */\n    let hexStr = bigInt.abs().toString(16);\n    /* Pad hex to even length if needed */\n    hexStr = hexStr.length % 2 !== 0 ? `0${hexStr}` : hexStr;\n    /* Prepend \"00\" if the most significant bit is set */\n    hexStr = HEX_MSB_REGEX.test(hexStr) ? `00${hexStr}` : hexStr;\n    if (isNegative) {\n        /* Flip the bits of the representation */\n        const invertedNibbles = hexStr\n            .split('')\n            .map((x) => {\n            const invertedNibble = ~parseInt(x, 16) & 0xf;\n            return '0123456789ABCDEF'.charAt(invertedNibble);\n        })\n            .join('');\n        /* After flipping the bits, add one to get the 2's complement representation */\n        const flippedBitsBI = new BigInteger(invertedNibbles, 16).add(BigInteger.ONE);\n        hexStr = flippedBitsBI.toString(16);\n        /*\n        For hex strings starting with 'FF8', 'FF' can be dropped, e.g. 0xFFFF80=0xFF80=0x80=-128\n\n        Any sequence of '1' bits on the left can always be substituted with a single '1' bit\n        without changing the represented value.\n\n        This only happens in the case when the input is 80...00\n        */\n        if (hexStr.toUpperCase().startsWith('FF8')) {\n            hexStr = hexStr.substring(2);\n        }\n    }\n    return hexStr;\n};\n"],"names":[],"mappings":";;AAAA;AACA;AAEA;AACA;AACA;AACA,MAAM,aAAa,GAAG,WAAW;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,YAAY,GAAG,CAAC,MAAM,KAAK;AACxC,IAAI,IAAI,EAAE,MAAM,YAAY,UAAU,CAAC,EAAE;AACzC,QAAQ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC;AAC3C,IAAI;AACJ,IAAI,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AAC5D;AACA,IAAI,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC1C;AACA,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM;AAC5D;AACA,IAAI,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM;AAChE,IAAI,IAAI,UAAU,EAAE;AACpB;AACA,QAAQ,MAAM,eAAe,GAAG;AAChC,aAAa,KAAK,CAAC,EAAE;AACrB,aAAa,GAAG,CAAC,CAAC,CAAC,KAAK;AACxB,YAAY,MAAM,cAAc,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;AACzD,YAAY,OAAO,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC;AAC5D,QAAQ,CAAC;AACT,aAAa,IAAI,CAAC,EAAE,CAAC;AACrB;AACA,QAAQ,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;AACrF,QAAQ,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC3C;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AACpD,YAAY,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AACxC,QAAQ;AACR,IAAI;AACJ,IAAI,OAAO,MAAM;AACjB;;;;"}