Cryptopals Set 2 Challenge 15

no repo for this challenge

no demo for this challenge

Step 1: We’ve Already Done This (but let’s talk abt it)

The challenge is to write a function that takes a string and determines if it is PKCS#7 (doc) padded. If it is, then we remove the padding; if it is not, we throw an error.

function chopPKCS7(padArr) { //accepts padded hex array, returns non-padded array
  if (!Array.isArray(padArr)||!padArr.length) { return null; }
  let last=Number(parseInt(padArr[padArr.length-1],16).toString(10));
  if (last>0&&last<256) {
    let possibleSlice=padArr.slice(padArr.length-last);
    let lastCh=padArr[padArr.length-1];
    if (last>=padArr.length) { throw new Error('Padding >= array length! Are you sure you wanna do that?'); }
    else if (!possibleSlice.every(c=>c==lastCh)) { throw new Error('String is not PKCS7-padded.'); }
    return padArr.slice(0,padArr.length-last);
  }
  return padArr;
}

This function takes an array and checks the last character. It converts that character into a number and, if that number is between 0 and 256, it checks with every (mdn docs) to see if that number of characters (possibleSlice) from the end of the string are all equal to the same value: namely, the length of the padding characters. If they are, then the numbers are removed and the chopped array is returned. If they aren’t, then an error is thrown. Done!