unpad static method

List<int> unpad(
  1. List<int> paddedData,
  2. int blockSize, {
  3. PaddingAlgorithm style = PaddingAlgorithm.pkcs7,
})

Removes padding from the provided data.

Parameters:

  • paddedData: The padded data from which padding will be removed.
  • blockSize: The block size used for padding.
  • style: The padding style, which can be one of the PaddingAlgorithm values (default is pkcs7).

Throws:

  • CryptoException for various scenarios, such as incorrect padding or zero-length input.

Implementation

static List<int> unpad(
  List<int> paddedData,
  int blockSize, {
  PaddingAlgorithm style = PaddingAlgorithm.pkcs7,
}) {
  final int paddedDataLen = paddedData.length;

  if (paddedDataLen == 0) {
    throw CryptoException.failed(
      'unpad',
      reason: "Zero-length input cannot be unpadded.",
    );
  }

  if (paddedDataLen % blockSize != 0) {
    throw CryptoException.failed(
      "unpad",
      reason: "Input data is not padded.",
    );
  }

  int paddingLen;

  if (style == PaddingAlgorithm.pkcs7 || style == PaddingAlgorithm.x923) {
    paddingLen = paddedData[paddedDataLen - 1];
    if (paddingLen < 1 || paddingLen > blockSize) {
      throw CryptoException.failed("unpad", reason: "Incorrect padding.");
    }

    if (style == PaddingAlgorithm.pkcs7) {
      for (int i = 1; i <= paddingLen; i++) {
        if (paddedData[paddedDataLen - i] != paddingLen) {
          throw CryptoException.failed("unpad", reason: "Incorrect padding.");
        }
      }
    } else {
      for (int i = 1; i < paddingLen; i++) {
        if (paddedData[paddedDataLen - i - 1] != 0) {
          throw CryptoException.failed("unpad", reason: "Incorrect padding.");
        }
      }
    }
  } else {
    final int index = paddedData.lastIndexOf(128);
    if (index < 0) {
      throw CryptoException.failed("unpad", reason: "Incorrect padding.");
    }
    paddingLen = paddedDataLen - index;
    if (paddingLen < 1 || paddingLen > blockSize) {
      throw CryptoException.failed("unpad", reason: "Incorrect padding.");
    }
    for (int i = 1; i < paddingLen; i++) {
      if (paddedData[index + i] != 0) {
        throw CryptoException.failed("unpad", reason: "Incorrect padding.");
      }
    }
  }
  return paddedData.sublist(0, paddedDataLen - paddingLen);
}