public void testSamples() throws IOException {
   assertTrue(Arrays.areEqual(sample1Bytes, UrlBase64.decode(sample1)));
   assertTrue(Arrays.areEqual(sample1Bytes, UrlBase64.decode(Strings.toByteArray(sample1))));
   assertTrue(Arrays.areEqual(sample2Bytes, UrlBase64.decode(sample2)));
   assertTrue(Arrays.areEqual(sample2Bytes, UrlBase64.decode(Strings.toByteArray(sample2))));
   assertTrue(Arrays.areEqual(sample3Bytes, UrlBase64.decode(sample3)));
   assertTrue(Arrays.areEqual(sample3Bytes, UrlBase64.decode(Strings.toByteArray(sample3))));
 }
  public void testInvalidInput() throws IOException {
    String[] invalid =
        new String[] {
          invalid1, invalid2, invalid3, invalid4, invalid5, invalid6, invalid7, invalid8, invalid9,
          invalida, invalidb, invalidc, invalidd
        };

    for (int i = 0; i != invalid.length; i++) {
      invalidTest(invalid[i]);
      invalidTest(Strings.toByteArray(invalid[i]));
    }
  }
  /**
   * Convert an inline encoded hex string rendition of an ASN.1 object back into its corresponding
   * ASN.1 object.
   *
   * @param str the hex encoded object
   * @param off the index at which the encoding starts
   * @return the decoded object
   */
  protected ASN1Primitive convertHexEncoded(String str, int off) throws IOException {
    str = Strings.toLowerCase(str);
    byte[] data = new byte[(str.length() - off) / 2];
    for (int index = 0; index != data.length; index++) {
      char left = str.charAt((index * 2) + off);
      char right = str.charAt((index * 2) + off + 1);

      if (left < 'a') {
        data[index] = (byte) ((left - '0') << 4);
      } else {
        data[index] = (byte) ((left - 'a' + 10) << 4);
      }
      if (right < 'a') {
        data[index] |= (byte) (right - '0');
      } else {
        data[index] |= (byte) (right - 'a' + 10);
      }
    }

    ASN1InputStream aIn = new ASN1InputStream(data);

    return aIn.readObject();
  }