001 /*
002 * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org
003 * Copyright (C) 2011 NightLabs Consulting GmbH
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program. If not, see <http://www.gnu.org/licenses/>.
017 */
018 package org.cumulus4j.keymanager.cli;
019
020 import org.cumulus4j.keymanager.api.DateDependentKeyStrategyInitParam;
021 import org.cumulus4j.keymanager.api.DateDependentKeyStrategyInitResult;
022 import org.cumulus4j.keymanager.api.KeyManagerAPIConfiguration;
023 import org.cumulus4j.keystore.DateDependentKeyStrategy;
024 import org.cumulus4j.keystore.KeyStore;
025 import org.kohsuke.args4j.Option;
026
027 /**
028 * <p>
029 * {@link SubCommand} implementation for creating & initialising a new key-store with the {@link DateDependentKeyStrategy}.
030 * </p>
031 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de
032 */
033 public class InitDateDependentKeyStrategySubCommand
034 extends SubCommandWithKeyManagerAPI
035 {
036 @Option(
037 name="-userName", required=true,
038 usage="The first user, which is automatically created when initialising the key store."
039 )
040 private String userName;
041
042 @Option(
043 name="-password", required=false,
044 usage="The password of the first user. If omitted, the user will be asked for it interactively."
045 )
046 private String password;
047
048 @Option(
049 name="-keyActivityPeriod", required=false, handler=TimePeriodOptionHandler.class,
050 usage="How long should each key be valid. This must be a positive number followed by a unit symbol " +
051 "(ms = millisecond, s = second, min = minute, h = hour, d = day, a = y = year). " +
052 "If omitted, the default value '24h' will be used."
053 )
054 private long keyActivityPeriodMSec;
055
056 @Option(
057 name="-keyStorePeriod", required=false, handler=TimePeriodOptionHandler.class,
058 usage="How long should the key store have fresh, unused keys. This number divided by the 'keyActivityPeriodMSec' " +
059 "determines, how many keys must be generated. This must be a positive number followed by a unit symbol " +
060 "(ms = millisecond, s = second, min = minute, h = hour, d = day, a = y = year). If omitted, the default value '50a' will be used.")
061 private long keyStorePeriodMSec;
062
063 @Option(
064 name="-keySize", required=false,
065 usage="Set the key size of all generated keys (including the master-key). This is synonymous to the system property '" +
066 KeyStore.SYSTEM_PROPERTY_KEY_SIZE + "'. If both are present, this overwrites the system property."
067 )
068 private int keySize = -1;
069
070 @Option(
071 name="-encryptionAlgorithm", required=false,
072 usage="Set the encryption algorithm to be used. This is synonymous to the system property '" +
073 KeyStore.SYSTEM_PROPERTY_ENCRYPTION_ALGORITHM + "'. If both are present, this overwrites the system property."
074 )
075 private String encryptionAlgorithm;
076
077 @Override
078 public String getSubCommandName() {
079 return "initDateDependentKeyStrategy";
080 }
081
082 @Override
083 public String getSubCommandDescription() {
084 return "Create and initialise a key store for the usage with Cumulus4j and the date-dependent key-assignment strategy.";
085 }
086
087 @Override
088 public void prepare() throws Exception {
089 super.prepare();
090
091 if (password == null)
092 password = promptPassword("password: ");
093
094 if (keySize > 0)
095 System.setProperty(KeyStore.SYSTEM_PROPERTY_KEY_SIZE, String.valueOf(keySize));
096
097 if (encryptionAlgorithm != null)
098 System.setProperty(KeyStore.SYSTEM_PROPERTY_ENCRYPTION_ALGORITHM, encryptionAlgorithm);
099
100 KeyManagerAPIConfiguration configuration = new KeyManagerAPIConfiguration(getKeyManagerAPI().getConfiguration());
101 configuration.setAuthUserName(userName);
102 configuration.setAuthPassword(password == null ? null : password.toCharArray());
103 getKeyManagerAPI().setConfiguration(configuration);
104 }
105
106 @Override
107 public void run() throws Exception {
108 DateDependentKeyStrategyInitParam param = new DateDependentKeyStrategyInitParam();
109 param.setKeyActivityPeriodMSec(keyActivityPeriodMSec);
110 param.setKeyStorePeriodMSec(keyStorePeriodMSec);
111 DateDependentKeyStrategyInitResult result = getKeyManagerAPI().initDateDependentKeyStrategy(param);
112 System.out.println("Generated " + result.getGeneratedKeyCount() + " keys.");
113 }
114
115 }