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.crypto.internal.symmetric; 019 020 import java.security.SecureRandom; 021 022 import org.bouncycastle.crypto.KeyGenerationParameters; 023 import org.bouncycastle.crypto.params.KeyParameter; 024 import org.cumulus4j.crypto.SecretKeyGenerator; 025 026 /** 027 * Default implementation of {@link SecretKeyGenerator}. 028 * 029 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de 030 */ 031 public class SecretKeyGeneratorImpl implements SecretKeyGenerator 032 { 033 private int strength; 034 private int strengthInBytes; 035 private SecureRandom random; 036 037 @Override 038 public void init(KeyGenerationParameters params) 039 { 040 strength = 0; 041 random = null; 042 043 if (params != null) { 044 strength = params.getStrength(); 045 random = params.getRandom(); 046 } 047 048 if (strength < 1) 049 strength = 256; 050 051 if (random == null) 052 random = new SecureRandom(); 053 054 strengthInBytes = (strength + 7) / 8; 055 } 056 057 @Override 058 public KeyParameter generateKey() 059 { 060 if (random == null) 061 throw new IllegalStateException("init(...) was not yet called!"); 062 063 byte[] key = new byte[strengthInBytes]; 064 random.nextBytes(key); 065 return new KeyParameter(key); 066 } 067 068 }