diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptCipher.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptCipher.java index e24d47b..97f9940 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptCipher.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptCipher.java @@ -1074,8 +1074,8 @@ public class WolfCryptCipher extends CipherSpi { } private void log(String msg) { - WolfCryptDebug.print("[Cipher, " + algString + "-" + - algMode + "] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[" + algString + "-" + algMode + "] " + msg); } @SuppressWarnings("deprecation") diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptDebug.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptDebug.java index 6607f84..b827d63 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptDebug.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptDebug.java @@ -21,10 +21,108 @@ package com.wolfssl.provider.jce; +import java.sql.Timestamp; +import java.util.logging.*; +import java.util.logging.Formatter; +import java.util.logging.Handler; +import java.util.function.Supplier; + class WolfCryptDebug { + private static final Logger jceLogger = + Logger.getLogger("com.wolfssl.provider.jce"); + public static boolean DEBUG = checkProperty(); + /** Error level debug message */ + public static final String ERROR = "ERROR"; + + /** Info level debug message */ + public static final String INFO = "INFO"; + + static { + configureLoggers(); + } + + /** + * Custom handler that flushes after each log record + */ + private static class FlushingStreamHandler extends StreamHandler { + public FlushingStreamHandler() { + super(System.err, new WolfCryptFormatter()); + } + + @Override + public synchronized void publish(LogRecord record) { + super.publish(record); + flush(); + } + } + + /** + * Configure loggers based on system properties + */ + private static void configureLoggers() { + /* Remove any existing handlers */ + for (Handler handler : jceLogger.getHandlers()) { + jceLogger.removeHandler(handler); + } + + /* Only configure handlers if debug is enabled */ + if (DEBUG) { + /* Create custom handler that flushes after each log record */ + FlushingStreamHandler handler = new FlushingStreamHandler(); + handler.setFormatter(new WolfCryptFormatter()); + jceLogger.addHandler(handler); + } + + /* Set log levels based on debug properties */ + jceLogger.setLevel(DEBUG ? Level.ALL : Level.OFF); + + /* Disable parent handlers to prevent double logging */ + jceLogger.setUseParentHandlers(false); + } + + /** + * Custom formatter for log records + */ + private static class WolfCryptFormatter extends Formatter { + @Override + public String format(LogRecord record) { + if (record == null) { + return "null record\n"; + } + + String sourceClass = record.getSourceClassName(); + if (sourceClass == null) { + sourceClass = ""; + } else { + /* Extract simple class name (after last dot) */ + int lastDot = sourceClass.lastIndexOf('.'); + if (lastDot != -1) { + sourceClass = sourceClass.substring(lastDot + 1); + } + } + + Level level = record.getLevel(); + String levelStr = level != null ? level.getName() : "UNKNOWN"; + + long threadId = record.getThreadID(); + String message = record.getMessage(); + if (message == null) { + message = ""; + } + + return String.format("%s [%s %s: TID %d: %s] %s\n", + new Timestamp(record.getMillis()), + "wolfJCE", + levelStr, + threadId, + sourceClass, + message); + } + } + private static boolean checkProperty() { String enabled = System.getProperty("wolfjce.debug"); @@ -36,10 +134,61 @@ class WolfCryptDebug { return false; } - public static void print(String string) { - if (DEBUG) { - System.out.println("wolfJCE: " + string); + /** + * Refresh debug enabled/disabled flags based on current + * System properties. + */ + public static synchronized void refreshDebugFlags() { + boolean oldDebug = DEBUG; + + DEBUG = checkProperty(); + + /* Only reconfigure if debug state has changed */ + if (oldDebug != DEBUG) { + configureLoggers(); } } -} + /** + * Print out debug message if debugging is enabled. + * + * @param class type of cl + * @param cl class being called from to get debug info + * @param tag level of debug message, ie WolfCryptDebug.INFO + * @param messageSupplier supplier of message to be printed out + */ + public static synchronized void log(Class cl, String tag, + Supplier messageSupplier) { + + log(cl, "wolfJCE", tag, 0, messageSupplier); + } + + /** + * Print out debug message if debugging is enabled. + * + * @param class type of cl + * @param cl class being called from to get debug info + * @param component component name, ie "wolfJCE" + * @param tag level of debug message, ie WolfCryptDebug.INFO + * @param nativePtr native pointer + * @param messageSupplier supplier of message to be printed out + */ + public static synchronized void log(Class cl, String component, + String tag, long nativePtr, Supplier messageSupplier) { + + if (!DEBUG) { + return; + } + + Level level = tag.equals(ERROR) ? Level.SEVERE : Level.INFO; + + String className = cl.getSimpleName(); + if (nativePtr != 0) { + className = className + ": " + nativePtr; + } + + LogRecord record = new LogRecord(level, messageSupplier.get()); + record.setSourceClassName(cl.getName()); + jceLogger.log(record); + } +} diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptKeyAgreement.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptKeyAgreement.java index 7436129..5709c72 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptKeyAgreement.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptKeyAgreement.java @@ -554,7 +554,8 @@ public class WolfCryptKeyAgreement extends KeyAgreementSpi { } private void log(String msg) { - WolfCryptDebug.print("[KeyAgreement, " + algString + "] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[" + algString + "] " + msg); } @SuppressWarnings("deprecation") diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptKeyGenerator.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptKeyGenerator.java index 9e54fdc..31244c3 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptKeyGenerator.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptKeyGenerator.java @@ -104,7 +104,8 @@ public class WolfCryptKeyGenerator extends KeyGeneratorSpi { * @param msg Message string to log */ private void log(String msg) { - WolfCryptDebug.print("[KeyGenerator, " + algString + "] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[" + this.algString + "] " + msg); } /** diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptKeyPairGenerator.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptKeyPairGenerator.java index 65b554f..7dd6683 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptKeyPairGenerator.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptKeyPairGenerator.java @@ -407,7 +407,8 @@ public class WolfCryptKeyPairGenerator extends KeyPairGeneratorSpi { } private void log(String msg) { - WolfCryptDebug.print("[KeyPairGenerator, " + algString + "] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[" + algString + "] " + msg); } @SuppressWarnings("deprecation") diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptMac.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptMac.java index c9acf66..0057f60 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptMac.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptMac.java @@ -215,7 +215,8 @@ public class WolfCryptMac extends MacSpi { } private void log(String msg) { - WolfCryptDebug.print("[Mac, " + algString + "] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[" + algString + "] " + msg); } @SuppressWarnings("deprecation") diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestMd5.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestMd5.java index 9dc4cc5..e4efbc4 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestMd5.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestMd5.java @@ -100,7 +100,8 @@ public final class WolfCryptMessageDigestMd5 } private void log(String msg) { - WolfCryptDebug.print("[MessageDigest, MD5] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[MD5] " + msg); } @Override diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha.java index 2b73244..7aaa0b5 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha.java @@ -100,7 +100,8 @@ public final class WolfCryptMessageDigestSha } private void log(String msg) { - WolfCryptDebug.print("[MessageDigest, SHA] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[SHA] " + msg); } @Override diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha224.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha224.java index 4bafec3..5e83f31 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha224.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha224.java @@ -105,7 +105,8 @@ public final class WolfCryptMessageDigestSha224 } private void log(String msg) { - WolfCryptDebug.print("[MessageDigest, SHA224] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[SHA224] " + msg); } @Override diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha256.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha256.java index ded1942..83d2dce 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha256.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha256.java @@ -105,7 +105,8 @@ public final class WolfCryptMessageDigestSha256 } private void log(String msg) { - WolfCryptDebug.print("[MessageDigest, SHA256] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[SHA256] " + msg); } @Override diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha3.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha3.java index 9c234c6..13a3799 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha3.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha3.java @@ -116,7 +116,8 @@ public class WolfCryptMessageDigestSha3 } private void log(String msg) { - WolfCryptDebug.print("[MessageDigest, SHA-3] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[SHA-3] " + msg); } @Override @@ -157,7 +158,7 @@ public class WolfCryptMessageDigestSha3 public static final class wcSHA3_256 extends WolfCryptMessageDigestSha3 { /** * Create new wcSHA3_256 object - * + * * @throws NoSuchAlgorithmException if digest type is not * available in native wolfCrypt library */ @@ -184,7 +185,7 @@ public class WolfCryptMessageDigestSha3 /** * wolfJCE SHA3-512 message digest class */ - public static final class wcSHA3_512 extends WolfCryptMessageDigestSha3 { + public static final class wcSHA3_512 extends WolfCryptMessageDigestSha3 { /** * Create new wcSHA3_512 object * diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha384.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha384.java index 4d7c931..032ed94 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha384.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha384.java @@ -105,7 +105,8 @@ public final class WolfCryptMessageDigestSha384 } private void log(String msg) { - WolfCryptDebug.print("[MessageDigest, SHA384] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[SHA384] " + msg); } @Override diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha512.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha512.java index 42c26ce..342c71e 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha512.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptMessageDigestSha512.java @@ -105,7 +105,8 @@ public final class WolfCryptMessageDigestSha512 } private void log(String msg) { - WolfCryptDebug.print("[MessageDigest, SHA512] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[SHA512] " + msg); } @Override diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptPKIXCertPathValidator.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptPKIXCertPathValidator.java index 9b83efd..5ab625e 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptPKIXCertPathValidator.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptPKIXCertPathValidator.java @@ -716,7 +716,7 @@ public class WolfCryptPKIXCertPathValidator extends CertPathValidatorSpi { * @param msg Log message to be printed */ private void log(String msg) { - WolfCryptDebug.print("[CertPathValidator] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, () -> msg); } } diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptRandom.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptRandom.java index e0ed33f..3c24e5d 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptRandom.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptRandom.java @@ -70,7 +70,7 @@ public final class WolfCryptRandom extends SecureRandomSpi { } private void log(String msg) { - WolfCryptDebug.print("[Random] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, () -> msg); } @SuppressWarnings("deprecation") diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptSecretKeyFactory.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptSecretKeyFactory.java index 48a1634..a6f0844 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptSecretKeyFactory.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptSecretKeyFactory.java @@ -121,7 +121,8 @@ public class WolfCryptSecretKeyFactory extends SecretKeyFactorySpi { * @param msg message to be logged */ private void log(String msg) { - WolfCryptDebug.print("[SecretKeyFactory, " + typeString + "] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[" + typeString + "] " + msg); } /** diff --git a/src/main/java/com/wolfssl/provider/jce/WolfCryptSignature.java b/src/main/java/com/wolfssl/provider/jce/WolfCryptSignature.java index 4973d21..bca4c32 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfCryptSignature.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfCryptSignature.java @@ -699,8 +699,8 @@ public class WolfCryptSignature extends SignatureSpi { } private void log(String msg) { - WolfCryptDebug.print("[Signature, " + keyString + "-" + - digestString + "] " + msg); + WolfCryptDebug.log(getClass(), WolfCryptDebug.INFO, + () -> "[" + keyString + "-" + digestString + "] " + msg); } @SuppressWarnings("deprecation") diff --git a/src/main/java/com/wolfssl/provider/jce/WolfSSLKeyStore.java b/src/main/java/com/wolfssl/provider/jce/WolfSSLKeyStore.java index 07d2ba1..e3d0d8e 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfSSLKeyStore.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfSSLKeyStore.java @@ -1815,7 +1815,8 @@ public class WolfSSLKeyStore extends KeyStoreSpi { * @param msg message to be logged */ private static synchronized void log(String msg) { - WolfCryptDebug.print("[WolfSSLKeyStore] " + msg); + WolfCryptDebug.log(WolfSSLKeyStore.class, WolfCryptDebug.INFO, + () -> msg); } /**