code: function decrypt(cipherText) {
      if( !cipherText ) {
        return null;
      }
      try {
        if( verifyHmac ) {
          // Extract the HMAC from the start of the message:
          var expectedHmac = cipherText.substring(0, 64);
          // The remaining message is the IV + encrypted message:
          cipherText = cipherText.substring(64);
          // Calculate the actual HMAC of the message:
          var actualHmac = hmac(cipherText);
          if( !scmp(Buffer.from(actualHmac, 'hex'), Buffer.from(expectedHmac, 'hex')) ) {
            throw new Error('HMAC does not match');
          }
        }
  
        // Extract the IV from the beginning of the message:
        var iv = Buffer.from(cipherText.substring(0,32), 'hex');
        // The remaining text is the encrypted JSON:
        var encryptedJson = cipherText.substring(32);
  
        // Make sure to use the 'iv' variant when creating the decipher object:
        var decipher = crypto.createDecipheriv('aes-256-cbc', cryptoKey, iv);
        // Decrypt the JSON:
        var json = decipher.update(encryptedJson, 'base64', 'utf8') + decipher.final('utf8');
  
        // Return the parsed object:
        return JSON.parse(json, reviver);
      } catch( e ) {
        // If we get an error log it and ignore it. Decrypting should never fail.
        if( debug ) {
          console.error('Exception in decrypt (ignored): %s', e);
        }
        return null;
      }
    }
docs: Decrypts the encrypted cipherText and returns back the original object. If the cipherText cannot be decrypted (bad key, bad text, bad serialization) then it returns null.  NOTE: This function never throws an error. It will instead return null if it cannot decrypt the cipherText. NOTE: It's possible that the data decrypted is null (since it's valid input for encrypt(...)). It's up to the caller to decide if the result is valid.