unpad static method
List<int>
unpad(
- List<
int> paddedData, - int blockSize, {
- 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);
}