docs: private final byte[][] decode(byte[] encodedPrivateKey) {
          byte[][] decodedKey = new byte[8][];
          if (encodedPrivateKey.length > (PUBLIC_EXPONENT_LENGTH + PRIME_P_LENGTH + PRIME_Q_LENGTH)) {
              // it is potentially the new encoding mechanism based on R3.5 [with CRT key information added for Domino]
              // determine the length of the CRT key by looking at the first four bytes
              byte[] lengthBytes = new byte[PRIVATE_EXPONENT_LENGTH_FIELD_LENGTH];
              for (int i = 0; i < PRIVATE_EXPONENT_LENGTH_FIELD_LENGTH; i++) {
                  lengthBytes[i] = encodedPrivateKey[i];
              }
              privateExponentLength = toInt(lengthBytes);
              decodedKey[PRIVATE_EXPONENT] = new byte[privateExponentLength];
              decodedKey[PUBLIC_EXPONENT] = new byte[PUBLIC_EXPONENT_LENGTH];
              decodedKey[PRIME_P] = new byte[PRIME_P_LENGTH];
              decodedKey[PRIME_Q] = new byte[PRIME_Q_LENGTH];
  
              System.arraycopy(encodedPrivateKey, PRIVATE_EXPONENT_LENGTH_FIELD_LENGTH, decodedKey[PRIVATE_EXPONENT], 0, privateExponentLength);
              System.arraycopy(encodedPrivateKey, PRIVATE_EXPONENT_LENGTH_FIELD_LENGTH + privateExponentLength, decodedKey[PUBLIC_EXPONENT], 0, PUBLIC_EXPONENT_LENGTH);
              System.arraycopy(encodedPrivateKey, PRIVATE_EXPONENT_LENGTH_FIELD_LENGTH + privateExponentLength + PUBLIC_EXPONENT_LENGTH, decodedKey[PRIME_P], 0, PRIME_P_LENGTH);
              System.arraycopy(encodedPrivateKey, PRIVATE_EXPONENT_LENGTH_FIELD_LENGTH + privateExponentLength + PUBLIC_EXPONENT_LENGTH + PRIME_P_LENGTH, decodedKey[PRIME_Q], 0,
                               PRIME_Q_LENGTH);
          } else {
              // it is a R3.02 key [without CRT key information] 
              decodedKey[PUBLIC_EXPONENT] = new byte[PUBLIC_EXPONENT_LENGTH];
              decodedKey[PRIME_P] = new byte[PRIME_P_LENGTH];
              decodedKey[PRIME_Q] = new byte[PRIME_Q_LENGTH];
  
              System.arraycopy(encodedPrivateKey, 0, decodedKey[PUBLIC_EXPONENT], 0, PUBLIC_EXPONENT_LENGTH);
              System.arraycopy(encodedPrivateKey, PUBLIC_EXPONENT_LENGTH, decodedKey[PRIME_P], 0, PRIME_P_LENGTH);
              System.arraycopy(encodedPrivateKey, PUBLIC_EXPONENT_LENGTH + PRIME_P_LENGTH, decodedKey[PRIME_Q], 0, PRIME_Q_LENGTH);
          }
          return decodedKey;
      }