Skip to content

Instantly share code, notes, and snippets.

@timmc
Created August 14, 2014 21:10
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timmc/a90c37261c89bebb4c75 to your computer and use it in GitHub Desktop.
Save timmc/a90c37261c89bebb4c75 to your computer and use it in GitHub Desktop.
Solution to JSafe JCE class initialization error

Trying to load com.rsa.cryptoj.j.hE from inside an uberjar (combined jars of all dependencies):

java.lang.ExceptionInInitializerError, compiling:(NO_SOURCE_PATH:0:0)
	at clojure.lang.Compiler.analyze(Compiler.java:6464)
	at clojure.lang.Compiler.analyze(Compiler.java:6406)
	at clojure.lang.Compiler.eval(Compiler.java:6707)
	at clojure.lang.Compiler.eval(Compiler.java:6666)
	at clojure.core$eval.invoke(core.clj:2927)
	at clojure.main$repl$read_eval_print__6625$fn__6628.invoke(main.clj:239)
	at clojure.main$repl$read_eval_print__6625.invoke(main.clj:239)
	at clojure.main$repl$fn__6634.invoke(main.clj:257)
	at clojure.main$repl.doInvoke(main.clj:257)
	at clojure.lang.RestFn.invoke(RestFn.java:421)
	at clojure.main$repl_opt.invoke(main.clj:323)
	at clojure.main$main.doInvoke(main.clj:421)
	at clojure.lang.RestFn.invoke(RestFn.java:397)
	at clojure.lang.Var.invoke(Var.java:375)
	at clojure.lang.AFn.applyToHelper(AFn.java:152)
	at clojure.lang.Var.applyTo(Var.java:700)
	at clojure.main.main(main.java:37)
Caused by: java.lang.ExceptionInInitializerError
	at com.rsa.cryptoj.j.Ka.<init>(Unknown Source)
	at com.rsa.cryptoj.j.Ka.<init>(Unknown Source)
	at com.rsa.cryptoj.j.q.<init>(Unknown Source)
	at com.rsa.cryptoj.j.q.<init>(Unknown Source)
	at com.rsa.cryptoj.j.HV.a(Unknown Source)
	at com.rsa.cryptoj.j.bT.a(Unknown Source)
	at com.rsa.cryptoj.j.hl.<init>(Unknown Source)
	at com.rsa.cryptoj.j.hz.a(Unknown Source)
	at com.rsa.cryptoj.j.CJ.<init>(Unknown Source)
	at com.rsa.cryptoj.j.CJ.<init>(Unknown Source)
	at com.rsa.cryptoj.j.CJ.<clinit>(Unknown Source)
	at com.rsa.cryptoj.j.GX.<clinit>(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:270)
	at clojure.lang.RT.classForName(RT.java:2065)
	at clojure.lang.Compiler.resolveIn(Compiler.java:6921)
	at clojure.lang.Compiler.resolve(Compiler.java:6884)
	at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6845)
	at clojure.lang.Compiler.analyze(Compiler.java:6427)
	... 16 more
Caused by: java.lang.NullPointerException
	at com.rsa.cryptoj.j.FN.<init>(Unknown Source)
	at com.rsa.cryptoj.j.xG.<init>(Unknown Source)
	at com.rsa.cryptoj.j.cg.<init>(Unknown Source)
	at com.rsa.cryptoj.j.xG.<clinit>(Unknown Source)
	... 35 more

And the answer is: RSA's terrible com.rsa.jsafe/jsafejce jar file has a signature and when you try to initialize it, it checks the signature on its own jar. (An ineffectual delaying tactic against intentional corruption.) Of course, the uberjar has all the signatures stripped out, and so JSAFE throws an NPE and dies horribly. The solution is to keep it as a separate dependency on the classpath -- or use something better that the NSA probably hasn't bribed RSA to backdoor.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment