public static void main(String[] args) throws IOException, TokenException {
    if (args.length != 1) {
      printUsage();
      System.exit(1);
    }

    Module pkcs11Module = Module.getInstance(args[0]);
    pkcs11Module.initialize(null);

    Slot[] slots = pkcs11Module.getSlotList(Module.SlotRequirement.TOKEN_PRESENT);

    if (slots.length == 0) {
      System.out.println("No slot with present token found!");
      System.exit(0);
    }

    Slot selectedSlot = slots[0];
    Token token = selectedSlot.getToken();

    System.out.println(
        "################################################################################");
    System.out.print("trying to set Notify callback handler... ");

    NotifyDemo callback = new NotifyDemo();
    String applicationData = "Hello Application!";
    Session session =
        token.openSession(
            Token.SessionType.SERIAL_SESSION,
            Token.SessionReadWriteBehavior.RO_SESSION,
            applicationData,
            callback);

    System.out.println("finished");
    System.out.println(
        "################################################################################");

    // FIXME, insert any code that causes a callback

    session.closeSession();
    pkcs11Module.finalize(null);
  }
Esempio n. 2
0
  public static void main(String[] args) {
    if (args.length != 3) {
      printUsage();
      System.exit(1);
    }

    try {
      // Security.addProvider(new IAIK());

      Module pkcs11Module = Module.getInstance(args[0]);
      pkcs11Module.initialize(null);

      Slot[] slots = pkcs11Module.getSlotList(Module.SlotRequirement.TOKEN_PRESENT);

      if (slots.length == 0) {
        output_.println("No slot with present token found!");
        System.exit(0);
      }

      Slot selectedSlot = slots[0];
      Token token = selectedSlot.getToken();

      Session session =
          token.openSession(
              Token.SessionType.SERIAL_SESSION,
              Token.SessionReadWriteBehavior.RO_SESSION,
              null,
              null);

      // login user
      // session.login(Session.UserType.USER, args[1].toCharArray());

      output_.println(
          "################################################################################");
      output_.println("generate secret MAC key");

      Mechanism keyMechanism = Mechanism.DES3_KEY_GEN;
      DES3SecretKey secretMACKeyTemplate = new DES3SecretKey();
      secretMACKeyTemplate.getSign().setBooleanValue(Boolean.TRUE);
      secretMACKeyTemplate.getVerify().setBooleanValue(Boolean.TRUE);

      DES3SecretKey secretMACKey =
          (DES3SecretKey) session.generateKey(keyMechanism, secretMACKeyTemplate);

      /*
              GenericSecretKey secretMACKeyTemplate = new GenericSecretKey();
              secretMACKeyTemplate.getSign().setBooleanValue(Boolean.TRUE);
              secretMACKeyTemplate.getVerify().setBooleanValue(Boolean.TRUE);
              secretMACKeyTemplate.getToken().setBooleanValue(Boolean.FALSE);

              // generate some bytes random data that we can use as test key
              byte[] randomData = session.generateRandom(16);

              secretMACKeyTemplate.getValue().setByteArrayValue(randomData);
              secretMACKeyTemplate.getValueLen().setLongValue(new Long(randomData.length));

              GenericSecretKey secretMACKey = (GenericSecretKey) session.createObject(secretMACKeyTemplate);
      */

      output_.println(
          "################################################################################");

      output_.println(
          "################################################################################");
      output_.println("MACing data from file: " + args[2]);

      InputStream dataInputStream = new FileInputStream(args[2]);

      // be sure that your token can process the specified mechanism
      Mechanism signatureMechanism = Mechanism.SHA_1_HMAC;
      // initialize for signing
      session.signInit(signatureMechanism, secretMACKey);

      byte[] dataBuffer = new byte[1024];
      int bytesRead;
      ByteArrayOutputStream streamBuffer = new ByteArrayOutputStream();

      // feed in all data from the input stream
      while ((bytesRead = dataInputStream.read(dataBuffer)) >= 0) {
        streamBuffer.write(dataBuffer, 0, bytesRead);
      }
      Arrays.fill(dataBuffer, (byte) 0); // ensure that no data is left in the memory
      streamBuffer.flush();
      streamBuffer.close();
      dataInputStream.close();
      byte[] rawData = streamBuffer.toByteArray();

      byte[] macValue = session.sign(rawData);

      output_.println("The MAC value is: " + new BigInteger(1, macValue).toString(16));

      output_.println(
          "################################################################################");

      output_.println(
          "################################################################################");
      output_.print("verification of the MAC... ");

      dataInputStream = new FileInputStream(args[2]);

      // initialize for verification
      session.verifyInit(signatureMechanism, secretMACKey);

      streamBuffer = new ByteArrayOutputStream();

      // feed in all data from the input stream
      while ((bytesRead = dataInputStream.read(dataBuffer)) >= 0) {
        streamBuffer.write(dataBuffer, 0, bytesRead);
      }
      Arrays.fill(dataBuffer, (byte) 0); // ensure that no data is left in the memory
      streamBuffer.flush();
      streamBuffer.close();
      dataInputStream.close();
      rawData = streamBuffer.toByteArray();

      try {
        session.verify(rawData, macValue); // throws an exception upon unsuccessful verification
        output_.println("successful");
      } catch (TokenException ex) {
        output_.println("FAILED: " + ex.getMessage());
      }

      output_.println(
          "################################################################################");

      session.closeSession();
      pkcs11Module.finalize(null);

    } catch (Throwable thr) {
      thr.printStackTrace();
    }
  }