gnu classpath and crypto SealedObject usage

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi there,

I'm attempting to use a SealedObject with gcj.
I had the source working with the sun jdk but my gcj-compiled source at 
runtime doesn't succeed to get past the "nosuchmethoderror".
I have done some experimenting with gnu(classpath I imagine), and 
gnu-crypto.  From what I understand bouncy castle is now part of gnu 
classpath.  Am I mistaken?

Any gcj/gnu classpath guru out there willing to nudge me in the right 
direction?

Thanks in advance.

Cheers :)
-----------------------------------------------------------------------
Here is the output:

export 
LD_LIBRARY_PATH=/usr/local/gnu-crypto/lib:/usr/local/gnu-crypto/share:.;./testaes
provider:GNU-CRYPTO
getInfo:GNU Crypto JCE Provider
getVersion:2.0
rijndael cipher created...
with keysize:16
with blocksize:16
Running 1 iterations:
Encryption: time = 1.0, speed = 0.015625 KB/s
Decryption: decryptedMessage:<<0123456789ABCDEF>>
time = 1.0, speed = 0.015625 KB/s
cipher algorithm count:113
algorithm:PBEWITHHMACHAVALANDKHAZAD
...
algorithm:AES
message authentication codes algorithm count:15
algorithm:HMAC-SHA160
algorithm:TMMH16
...
message digest algorithm count:12
...
algorithm:SHA-160
algorithm:WHIRLPOOL
...
secure random algorithm count:15
...
algorithm:WHIRLPOOLPRNG
...
signature algorithm count:2
algorithm:DSS/RAW
algorithm:RSA-PSS/RAW

Exception in thread "main" java.lang.NoSuchMethodError
    at gnu.crypto.mode.ModeFactory.getInstance(java.lang.String, 
gnu.crypto.cipher.IBlockCipher, int) 
(/usr/local/gnu-crypto/lib/lib-gnu-crypto.so.2.0.0)
    at 
gnu.crypto.jce.cipher.CipherAdapter.CipherAdapter(java.lang.String, int) 
(/usr/local/gnu-crypto/lib/lib-gnu-crypto.so.2.0.0)
    at gnu.crypto.jce.cipher.RijndaelSpi.RijndaelSpi() 
(/usr/local/gnu-crypto/lib/lib-gnu-crypto.so.2.0.0)
    at java.lang.Class.newInstance() (/usr/lib/libgcj.so.6.0.0)
    at 
javax.crypto.JCEUtil.getImplementationFromProvider(java.lang.String, 
java.lang.String, java.security.Provider) 
(/usr/local/gnu-crypto/lib/lib-javax-crypto.so.1.0.0)
    at javax.crypto.JCEUtil.getImplementation(java.lang.String, 
java.lang.String, java.lang.String) 
(/usr/local/gnu-crypto/lib/lib-javax-crypto.so.1.0.0)
    at javax.crypto.Cipher.getInstance(java.lang.String) 
(/usr/local/gnu-crypto/lib/lib-javax-crypto.so.1.0.0)
    at testaes.main(java.lang.String[]) (Unknown Source)
    at gnu.java.lang.MainThread.call_main() (/usr/lib/libgcj.so.6.0.0)
    at gnu.java.lang.MainThread.run() (/usr/lib/libgcj.so.6.0.0)


Here is the example associated:
import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;
import java.util.HashSet;
import java.util.Set;

import gnu.crypto.Registry;
import gnu.crypto.cipher.CipherFactory;
import gnu.crypto.cipher.IBlockCipher;
import gnu.crypto.jce.GnuCrypto;

import java.security.Provider;
import java.security.Security;

import javax.crypto.SecretKey;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Cipher;
import javax.crypto.SealedObject;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.SecretKeySpec;

public class testaes
{
     static class mytestdata implements java.io.Serializable
     {
     String s1;
     int x1;
     int y1;
     int x2;
     int y2;

         mytestdata(String sOne, int xOne, int yOne, int xTwo, int yTwo)
     {
         s1 = new String(sOne);
         x1 = xOne;
         y1 = yOne;
         x2 = xTwo;
         y2 = yTwo;
     }
     }

     public static void main( String args[])
     throws
         Exception
     {
     Provider gnu = java.security.Security.getProvider(Registry.GNU_CRYPTO);
     if (gnu == null)
         {
         java.security.Security.addProvider(
                            new gnu.crypto.jce.GnuCrypto()
                            );
         }

     HashSet names = new HashSet();
     //If I understand correctly, I removed the gnu classpath provider
     //in order to isolate which provider is failing the getInstance for 
//the AES algorithm
//in this case, both providers gave me a runtime error later on when 
instantiating the keys/ciphers for a particular task.
     java.security.Security.removeProvider("GNU");
     Provider[] providers = Security.getProviders();
     for(int provCount = 0; provCount < providers.length ; provCount++)
         {
         System.out.println("provider:" + providers[provCount].getName());
         System.out.println("getInfo:" + providers[provCount].getInfo());
         System.out.println("getVersion:" + 
providers[provCount].getVersion());
         }

	//this one works.
     IBlockCipher cipher = CipherFactory.getInstance("rijndael");
     int keysize = cipher.defaultKeySize();
     int blocksize = cipher.defaultBlockSize();
     System.out.println("rijndael cipher created...");
     System.out.println("with keysize:" + Integer.toString(keysize));
     System.out.println("with blocksize:" + Integer.toString(blocksize));

     String myKey = "FEDCBA9876543210"; //must be 16 characters long
     byte[] myKeyBytes = myKey.getBytes();

     try
         {
         int iterations = 1;


         String myPlainTextMessage = "0123456789ABCDEF";
         byte[] myPlainTextMessageBytes = myPlainTextMessage.getBytes();

         System.out.println("Running "+iterations+" iterations:");
         System.out.print("Encryption: ");

         HashMap map = new HashMap();
         map.put(IBlockCipher.KEY_MATERIAL, myKeyBytes);
         cipher.init(map);

         byte[] myCryptedText = (byte[]) myPlainTextMessageBytes.clone();
         long elapsed = -System.currentTimeMillis();
         int i;
         for (i = 0; i < iterations; i++)
             {
             cipher.encryptBlock(myCryptedText, 0, myCryptedText, 0);
             }

         elapsed += System.currentTimeMillis();
         float secs = (elapsed > 1) ? (float) elapsed / 1000 : 1;
         float speed = (float) iterations * blocksize / 1024 / secs;

         System.out.println("time = "+secs+", speed = "+speed+" KB/s");
         System.out.print("Decryption: ");

         byte[] myDecryptedTextBytes = (byte[]) myCryptedText.clone();
         elapsed = -System.currentTimeMillis();
         for (i = 0; i < iterations; i++) {
             cipher.decryptBlock(myDecryptedTextBytes, 0, 
myDecryptedTextBytes, 0);
             String myDecryptedText = new String(myDecryptedTextBytes);
             System.out.println("decryptedMessage:<<" + myDecryptedText 
  + ">>");
         }

         elapsed += System.currentTimeMillis();
         secs = (elapsed > 1) ? (float) elapsed / 1000 : 1;
         speed = (float) iterations * blocksize / 1024 / secs;

         System.out.println("time = "+secs+", speed = "+speed+" KB/s");

         if (!Arrays.equals(myPlainTextMessageBytes, myDecryptedTextBytes))
             {
             throw new RuntimeException("Symmetric operation failed");
             }
         }
     catch (Exception x)
         {
         x.printStackTrace(System.err);
         }

     Object[] myCipherAlgorithmArray = 
java.security.Security.getAlgorithms("cipher").toArray();
     Object[] myKeyPairGeneratorAlgorithmArray = 
java.security.Security.getAlgorithms("cipher").toArray();
     Object[] myMessageAuthenticationCodesAlgorithmArray = 
java.security.Security.getAlgorithms("mac").toArray();
     Object[] myMessageDigestAlgorithmArray = 
java.security.Security.getAlgorithms("messagedigest").toArray();
     Object[] mySecureRandomAlgorithmArray = 
java.security.Security.getAlgorithms("securerandom").toArray();
     Object[] mySignatureAlgorithmArray = 
java.security.Security.getAlgorithms("signature").toArray();

     System.out.println("cipher algorithm count:" + 
myCipherAlgorithmArray.length);
     dumpAlgorithmNames(myCipherAlgorithmArray);

     System.out.println("keypair generator algorithm count:" + 
myKeyPairGeneratorAlgorithmArray.length);
     dumpAlgorithmNames(myKeyPairGeneratorAlgorithmArray);

     System.out.println("message authentication codes algorithm count:" 
+ myMessageAuthenticationCodesAlgorithmArray.length);
     dumpAlgorithmNames(myMessageAuthenticationCodesAlgorithmArray);

     System.out.println("message digest algorithm count:" + 
myMessageDigestAlgorithmArray.length);
     dumpAlgorithmNames(myMessageDigestAlgorithmArray);

     System.out.println("secure random algorithm count:" + 
mySecureRandomAlgorithmArray.length);
     dumpAlgorithmNames(mySecureRandomAlgorithmArray);

     System.out.println("signature algorithm count:" + 
mySignatureAlgorithmArray.length);
     dumpAlgorithmNames(mySignatureAlgorithmArray);

     String symAlgorithm="AES";

     //javax.crypto.SecretKeyFactory KeyFac = 
javax.crypto.SecretKeyFactory.getInstance(symAlgorithm);

      myKey = "FEDCBA9876543210"; //must be 16 characters long
      myKeyBytes = myKey.getBytes();
          //javax.crypto.spec.SecretKeySpec desKeySpec = new 
javax.crypto.spec.SecretKeySpec(myKeyBytes, symAlgorithm);
          //javax.crypto.SecretKey sKey = KeyFac.generateSecret(desKeySpec);

      //KeyGenerator kgen = 
KeyGenerator.getInstance("PBEWITHHMACMD4ANDAES");
      //kgen.init(128);
      ////kgen.init(192);
      ////kgen.init(256);

      //SecretKey skey = kgen.generateKey();
      //byte[] raw = skey.getEncoded();

      //SecretKeySpec skeySpec = new SecretKeySpec(myKeyBytes, 
"PBEWITHHMACMD4ANDAES");

     //instantiate the cipher
     javax.crypto.Cipher jccipher = javax.crypto.Cipher.getInstance("AES");
      //jccipher.init(Cipher.ENCRYPT_MODE, sKey);
      //jccipher.init(Cipher.ENCRYPT_MODE, skeySpec);

//     mytestdata myTest = new mytestdata("test", 1, 2, 3, 4);
//     SealedObject sealedTest = new SealedObject(myTest, cipher);
//     System.out.println("Encrypted:" + sealedTest.toString() );

//     cipher.init(Cipher.DECRYPT_MODE, skeySpec);
//     mytestdata myDecryptedResult = 
(mytestdata)sealedTest.getObject(skeySpec);
//     System.out.println("s1:" + myDecryptedResult.s1);
//     System.out.println("x1:" + myDecryptedResult.x1);
//     System.out.println("y1:" + myDecryptedResult.y1);
//     System.out.println("x2:" + myDecryptedResult.x2);
//     System.out.println("y2:" + myDecryptedResult.y2);

     }

     static public void dumpAlgorithmNames(Object[] tmpArray)
     {
     int algoCount;
     for(algoCount = 0; algoCount < tmpArray.length; algoCount++)
         {
         System.out.println("algorithm:" + ((String)tmpArray[algoCount]) );
         }
     }
}

Here are the steps I used to build the example:
export 
LD_LIBRARY_PATH=/usr/local/gnu-crypto/lib:/usr/local/gnu-crypto/share:.

#here is what is gnu crypto related
#/usr/local/gnu-crypto/lib/lib-javax-crypto.a
#/usr/local/gnu-crypto/lib/lib-javax-security.a
#/usr/local/gnu-crypto/lib/lib-gnu-crypto.so.2.0.0
#/usr/local/gnu-crypto/lib/lib-gnu-crypto.a

#compile the .java files into native object code(.o)
gcj-4.0 -v 
--CLASSPATH=".:/usr/local/gnu-crypto/share/javax-crypto.jar:/usr/local/gnu-crypto/share/javax-security.jar:/usr/local/gnu-crypto/share/gnu-crypto.jar" 
-c -o testaes.o testaes.java -L/usr/local/gnu-crypto/lib -lgnu-crypto 
-ljavax-crypto -ljavax-security

#assemble them all into the main executable called testaes in this case.
gcj-4.0 -v 
--CLASSPATH=".:/usr/local/gnu-crypto/share/javax-crypto.jar:/usr/local/gnu-crypto/share/javax-security.jar:/usr/local/gnu-crypto/share/gnu-crypto.jar" 
--main=testaes -o testaes testaes.o -L/usr/local/gnu-crypto/lib 
-l-gnu-crypto -l-javax-crypto -l-javax-security



[Index of Archives]     [Linux Kernel]     [Linux Cryptography]     [Fedora]     [Fedora Directory]     [Red Hat Development]

  Powered by Linux