secretblob.Generators.kt Maven / Gradle / Ivy
package se.wollan.crypto.secretblob
import se.wollan.crypto.pad
import se.wollan.crypto.toHexString
import se.wollan.crypto.xor
import java.nio.file.Path
import java.security.SecureRandom
// The actual file size will be double as we are using hex encoding of data to make it easier to handle.
private const val BLOB_SIZE = 65536
/** Use this to generate new random blob data, see unit test. */
fun generateNewSecretBlobData(): String {
// gives 2048 keys with key-size 256 bits which should be enough for a while...
val secretBlobData = ByteArray(BLOB_SIZE)
SecureRandom().nextBytes(secretBlobData)
return secretBlobData.toHexString()
}
/** Use this to generate a random hex mask for a new key, see unit test. */
fun generateRandomHexMaskForKey(key: SecretBlobKey): String {
val secretBlobData = ByteArray(key.length)
SecureRandom().nextBytes(secretBlobData)
return secretBlobData.toHexString()
}
// Custom padding byte (0x80 is invalid as a standalone byte in UTF-8 and should therefore be safe to pad with)
internal const val TEXT_SECRET_PADDING_BYTE: Byte = 0x80.toByte()
/** Use this to generate hex mask for encoding a specific string as a new key, see unit test. */
fun generateMaskToEncodeTextSecret(
keyToUse: SecretBlobKey,
allKeys: List,
textSecret: String,
secretBlobFilePath: Path
): String {
val textBytes = textSecret.toByteArray(Charsets.UTF_8).pad(keyToUse.length, TEXT_SECRET_PADDING_BYTE)
val secretBlob = SecretBlobModule(allKeys, secretBlobFilePath, enableCache = false).resolveSecretBlob()
val secretKeyData = secretBlob.getSecretDataForKey(keyToUse.withMask("00".repeat(keyToUse.length)))
val maskBytes = textBytes.xor(secretKeyData)
return maskBytes.toHexString()
}