private void init() {
      // default values
      props.put(REPRODUCIBLE_PRNG, new Boolean(reproducible).toString());
      props.put(CHECK_WEAK_KEYS,   new Boolean(checkForWeakKeys).toString());
      props.put(DO_RSA_BLINDING,   new Boolean(doRSABlinding).toString());

      // 1. allow site-wide override by reading a properties file
      String propFile = null;
      try {
         propFile = (String) AccessController.doPrivileged(
            new PrivilegedAction() {
               public Object run() {
                  return System.getProperty(PROPERTIES_FILE);
               }
            }
         );
      } catch (SecurityException se) {
         if (DEBUG) debug("Reading property "+PROPERTIES_FILE+" not allowed. Ignored.");
      }
      if (propFile != null) {
         try {
            final java.util.Properties temp = new java.util.Properties();
            final FileInputStream fin = new FileInputStream(propFile);
            temp.load(fin);
            temp.list(System.out);
            props.putAll(temp);
         } catch (IOException ioe) {
            if (DEBUG) debug("IO error reading "+propFile+": "+ioe.getMessage());
         } catch (SecurityException se) {
            if (DEBUG) debug("Security error reading "+propFile+": "+se.getMessage());
         }
      }

      // 2. allow vm-specific override by allowing -D options in launcher
      handleBooleanProperty(REPRODUCIBLE_PRNG);
      handleBooleanProperty(CHECK_WEAK_KEYS);
      handleBooleanProperty(DO_RSA_BLINDING);

      // re-sync the 'known' properties
      reproducible =     new Boolean((String) props.get(REPRODUCIBLE_PRNG)).booleanValue();
      checkForWeakKeys = new Boolean((String) props.get(CHECK_WEAK_KEYS)).booleanValue();
      doRSABlinding =    new Boolean((String) props.get(DO_RSA_BLINDING)).booleanValue();
   }