Rename crypto maxFileNameLength to shorteningThreshold

This commit is contained in:
Julian Raufelder 2021-04-19 15:30:22 +02:00
parent 300ee61d58
commit b304d6e828
No known key found for this signature in database
GPG Key ID: 17EE71F6634E381D
10 changed files with 39 additions and 39 deletions

View File

@ -38,7 +38,7 @@ class CryptoCloudContentRepository implements CloudContentRepository<CryptoCloud
this.cryptoImpl = new CryptoImplVaultFormat7(context, cryptor, cloudContentRepository, vaultLocation, new DirIdCacheFormat7());
break;
case 8:
this.cryptoImpl = new CryptoImplVaultFormat8(context, cryptor, cloudContentRepository, vaultLocation, new DirIdCacheFormat7(), cloud.getVault().getMaxFileNameLength());
this.cryptoImpl = new CryptoImplVaultFormat8(context, cryptor, cloudContentRepository, vaultLocation, new DirIdCacheFormat7(), cloud.getVault().getShorteningThreshold());
break;
case 6:
case 5:

View File

@ -54,20 +54,20 @@ abstract class CryptoImplDecorator {
final CloudContentRepository cloudContentRepository;
final Context context;
final DirIdCache dirIdCache;
final int maxFileNameLength;
final int shorteningThreshold;
private final Supplier<Cryptor> cryptor;
private final CloudFolder storageLocation;
private RootCryptoFolder root;
CryptoImplDecorator(Context context, Supplier<Cryptor> cryptor, CloudContentRepository cloudContentRepository, CloudFolder storageLocation, DirIdCache dirIdCache, int maxFileNameLength) {
CryptoImplDecorator(Context context, Supplier<Cryptor> cryptor, CloudContentRepository cloudContentRepository, CloudFolder storageLocation, DirIdCache dirIdCache, int shorteningThreshold) {
this.context = context;
this.cryptor = cryptor;
this.cloudContentRepository = cloudContentRepository;
this.storageLocation = storageLocation;
this.dirIdCache = dirIdCache;
this.maxFileNameLength = maxFileNameLength;
this.shorteningThreshold = shorteningThreshold;
}
abstract CryptoFolder folder(CryptoFolder cryptoParent, String cleartextName) throws BackendException;

View File

@ -67,8 +67,8 @@ class CryptoImplVaultFormat7 extends CryptoImplDecorator {
super(context, cryptor, cloudContentRepository, storageLocation, dirIdCache, CryptoConstants.DEFAULT_MAX_FILE_NAME);
}
CryptoImplVaultFormat7(Context context, Supplier<Cryptor> cryptor, CloudContentRepository cloudContentRepository, CloudFolder storageLocation, DirIdCache dirIdCache, int maxFileNameLength) {
super(context, cryptor, cloudContentRepository, storageLocation, dirIdCache, maxFileNameLength);
CryptoImplVaultFormat7(Context context, Supplier<Cryptor> cryptor, CloudContentRepository cloudContentRepository, CloudFolder storageLocation, DirIdCache dirIdCache, int shorteningThreshold) {
super(context, cryptor, cloudContentRepository, storageLocation, dirIdCache, shorteningThreshold);
}
@Override
@ -85,7 +85,7 @@ class CryptoImplVaultFormat7 extends CryptoImplDecorator {
.fileNameCryptor() //
.encryptFilename(BASE64, name, dirIdInfo(cryptoFolder).getId().getBytes(UTF_8)) + CLOUD_NODE_EXT;
if (ciphertextName.length() > maxFileNameLength) {
if (ciphertextName.length() > shorteningThreshold) {
ciphertextName = deflate(cryptoFolder, ciphertextName);
}
return ciphertextName;

View File

@ -9,8 +9,8 @@ import org.cryptomator.util.Supplier;
public class CryptoImplVaultFormat8 extends CryptoImplVaultFormat7 {
CryptoImplVaultFormat8(Context context, Supplier<Cryptor> cryptor, CloudContentRepository cloudContentRepository, CloudFolder storageLocation, DirIdCache dirIdCache, int maxFileNameLength) {
super(context, cryptor, cloudContentRepository, storageLocation, dirIdCache, maxFileNameLength);
CryptoImplVaultFormat8(Context context, Supplier<Cryptor> cryptor, CloudContentRepository cloudContentRepository, CloudFolder storageLocation, DirIdCache dirIdCache, int shorteningThreshold) {
super(context, cryptor, cloudContentRepository, storageLocation, dirIdCache, shorteningThreshold);
}
}

View File

@ -36,7 +36,7 @@ import static org.cryptomator.util.Encodings.UTF_8;
final class CryptoImplVaultFormatPre7 extends CryptoImplDecorator {
static final int MAX_FILE_NAME_LENGTH = 129;
static final int SHORTENING_THRESHOLD = 129;
private static final String DIR_PREFIX = "0";
private static final String SYMLINK_PREFIX = "1S";
private static final String LONG_NAME_FILE_EXT = ".lng";
@ -45,7 +45,7 @@ final class CryptoImplVaultFormatPre7 extends CryptoImplDecorator {
private static final Pattern BASE32_ENCRYPTED_NAME_PATTERN = Pattern.compile("^(0|1S)?(([A-Z2-7]{8})*[A-Z2-7=]{8})$");
CryptoImplVaultFormatPre7(Context context, Supplier<Cryptor> cryptor, CloudContentRepository cloudContentRepository, CloudFolder storageLocation, DirIdCache dirIdCache) {
super(context, cryptor, cloudContentRepository, storageLocation, dirIdCache, MAX_FILE_NAME_LENGTH);
super(context, cryptor, cloudContentRepository, storageLocation, dirIdCache, SHORTENING_THRESHOLD);
}
@Override
@ -74,7 +74,7 @@ final class CryptoImplVaultFormatPre7 extends CryptoImplDecorator {
private String encryptName(CryptoFolder cryptoParent, String name, String prefix) throws BackendException {
String ciphertextName = prefix + cryptor().fileNameCryptor().encryptFilename(name, dirIdInfo(cryptoParent).getId().getBytes(UTF_8));
if (ciphertextName.length() > maxFileNameLength) {
if (ciphertextName.length() > shorteningThreshold) {
ciphertextName = deflate(ciphertextName);
}
return ciphertextName;
@ -139,7 +139,7 @@ final class CryptoImplVaultFormatPre7 extends CryptoImplDecorator {
if (ciphertextName.endsWith(LONG_NAME_FILE_EXT)) {
try {
ciphertextName = inflate(ciphertextName);
if (ciphertextName.length() <= maxFileNameLength) {
if (ciphertextName.length() <= shorteningThreshold) {
cloudFile = inflatePermanently(cloudFile, ciphertextName);
}
} catch (NoSuchCloudFileException e) {

View File

@ -81,7 +81,7 @@ public class MasterkeyCryptoCloudProvider implements CryptoCloudProvider {
.vaultFormat(MAX_VAULT_VERSION) //
.cipherCombo(DEFAULT_CIPHER_COMBO) //
.keyId(URI.create(String.format("%s:%s", MASTERKEY_SCHEME, MASTERKEY_FILE_NAME))) //
.maxFilenameLength(DEFAULT_MAX_FILE_NAME) //
.shorteningThreshold(DEFAULT_MAX_FILE_NAME) //
.build();
byte[] encodedVaultConfig = vaultConfig.toToken(masterkey.getEncoded()).getBytes(UTF_8);
@ -114,19 +114,19 @@ public class MasterkeyCryptoCloudProvider implements CryptoCloudProvider {
Masterkey masterkey = impl.getKeyFile(password);
int vaultFormat;
int maxFileNameLength;
int shorteningThreshold;
Cryptor cryptor;
if (unverifiedVaultConfig.isPresent()) {
VaultConfig vaultConfig = VaultConfig.verify(masterkey.getEncoded(), unverifiedVaultConfig.get());
vaultFormat = vaultConfig.getVaultFormat();
assertVaultVersionIsSupported(vaultConfig.getVaultFormat());
maxFileNameLength = vaultConfig.getMaxFilenameLength();
shorteningThreshold = vaultConfig.getShorteningThreshold();
cryptor = cryptorFor(masterkey, vaultConfig.getCipherCombo());
} else {
vaultFormat = MasterkeyFileAccess.readAllegedVaultVersion(impl.keyFileData);
assertLegacyVaultVersionIsSupported(vaultFormat);
maxFileNameLength = vaultFormat > 6 ? CryptoConstants.DEFAULT_MAX_FILE_NAME : CryptoImplVaultFormatPre7.MAX_FILE_NAME_LENGTH;
shorteningThreshold = vaultFormat > 6 ? CryptoConstants.DEFAULT_MAX_FILE_NAME : CryptoImplVaultFormatPre7.SHORTENING_THRESHOLD;
cryptor = cryptorFor(masterkey, SIV_CTRMAC);
}
@ -138,7 +138,7 @@ public class MasterkeyCryptoCloudProvider implements CryptoCloudProvider {
Vault vault = aCopyOf(token.getVault()) //
.withUnlocked(true) //
.withFormat(vaultFormat) //
.withMaxFileNameLength(maxFileNameLength) //
.withShorteningThreshold(shorteningThreshold) //
.build();
cryptoCloudContentRepositoryFactory.registerCryptor(vault, cryptor);

View File

@ -24,7 +24,7 @@ class VaultConfig private constructor(builder: VaultConfigBuilder) {
val id: String
val vaultFormat: Int
val cipherCombo: VaultCipherCombo
val maxFilenameLength: Int
val shorteningThreshold: Int
fun toToken(rawKey: ByteArray): String {
return Jwts.builder()
@ -32,7 +32,7 @@ class VaultConfig private constructor(builder: VaultConfigBuilder) {
.setId(id) //
.claim(JSON_KEY_VAULTFORMAT, vaultFormat) //
.claim(JSON_KEY_CIPHERCONFIG, cipherCombo.name) //
.claim(JSON_KEY_MAXFILENAMELEN, maxFilenameLength) //
.claim(JSON_KEY_SHORTENING_THRESHOLD, shorteningThreshold) //
.signWith(Keys.hmacShaKeyFor(rawKey)) //
.compact()
}
@ -42,7 +42,7 @@ class VaultConfig private constructor(builder: VaultConfigBuilder) {
internal var id: String = UUID.randomUUID().toString()
internal var vaultFormat = CryptoConstants.MAX_VAULT_VERSION;
internal var cipherCombo = VaultCipherCombo.SIV_CTRMAC
internal var maxFilenameLength = CryptoConstants.DEFAULT_MAX_FILE_NAME;
internal var shorteningThreshold = CryptoConstants.DEFAULT_MAX_FILE_NAME;
lateinit var keyId: URI
fun keyId(keyId: URI): VaultConfigBuilder {
@ -55,8 +55,8 @@ class VaultConfig private constructor(builder: VaultConfigBuilder) {
return this
}
fun maxFilenameLength(maxFilenameLength: Int): VaultConfigBuilder {
this.maxFilenameLength = maxFilenameLength
fun shorteningThreshold(shorteningThreshold: Int): VaultConfigBuilder {
this.shorteningThreshold = shorteningThreshold
return this
}
@ -79,7 +79,7 @@ class VaultConfig private constructor(builder: VaultConfigBuilder) {
private const val JSON_KEY_VAULTFORMAT = "format"
private const val JSON_KEY_CIPHERCONFIG = "cipherCombo"
private const val JSON_KEY_MAXFILENAMELEN = "maxFilenameLen"
private const val JSON_KEY_SHORTENING_THRESHOLD = "shorteningThreshold"
private const val JSON_KEY_ID = "kid"
@JvmStatic
@ -112,7 +112,7 @@ class VaultConfig private constructor(builder: VaultConfigBuilder) {
.id(parser.header[JSON_KEY_ID] as String) //
.cipherCombo(VaultCipherCombo.valueOf(parser.body.get(JSON_KEY_CIPHERCONFIG, String::class.java))) //
.vaultFormat(unverifiedVaultConfig.vaultFormat) //
.maxFilenameLength(parser.body[JSON_KEY_MAXFILENAMELEN] as Int)
.shorteningThreshold(parser.body[JSON_KEY_SHORTENING_THRESHOLD] as Int)
VaultConfig(vaultConfigBuilder)
} catch (e: Exception) {
@ -148,6 +148,6 @@ class VaultConfig private constructor(builder: VaultConfigBuilder) {
keyId = builder.keyId
vaultFormat = builder.vaultFormat
cipherCombo = builder.cipherCombo
maxFilenameLength = builder.maxFilenameLength
shorteningThreshold = builder.shorteningThreshold
}
}

View File

@ -53,7 +53,7 @@ class MasterkeyCryptoCloudProviderTest {
private final String masterkeyV8 = "{ \"version\": 999, \"scryptSalt\": \"AAAAAAAAAAA=\", \"scryptCostParam\": 32768, \"scryptBlockSize\": 8, \"primaryMasterKey\": \"D2kc+xBoAcVY+M7s74YBEy6l7ga2+Nz+HS5o0TQY3JMW1uQ5jTlLIQ==\", \"hmacMasterKey\": \"D2kc+xBoAcVY+M7s74YBEy6l7ga2+Nz+HS5o0TQY3JMW1uQ5jTlLIQ==\", \"versionMac\": \"trDKXqDhu94/VPuoWaQGBm8hwSPYc0D9t6DRRxKZ65k=\"}";
private final String masterkeyV7 = "{ \"version\": 7, \"scryptSalt\": \"AAAAAAAAAAA=\", \"scryptCostParam\": 32768, \"scryptBlockSize\": 8, \"primaryMasterKey\": \"D2kc+xBoAcVY+M7s74YBEy6l7ga2+Nz+HS5o0TQY3JMW1uQ5jTlLIQ==\", \"hmacMasterKey\": \"D2kc+xBoAcVY+M7s74YBEy6l7ga2+Nz+HS5o0TQY3JMW1uQ5jTlLIQ==\", \"versionMac\": \"cn2sAK6l9p1/w9deJVUuW3h7br056mpv5srvALiYw+g=\"}";
private final String vaultConfig = "eyJraWQiOiJtYXN0ZXJrZXlmaWxlOm1hc3RlcmtleS5jcnlwdG9tYXRvciIsImFsZyI6IkhTNTEyIn0.eyJtYXhGaWxlbmFtZUxlbiI6MjIwLCJmb3JtYXQiOjgsImNpcGhlckNvbWJvIjoiU0lWX0NUUk1BQyJ9.umiAcGObWuVISugrQu16hznDHIFM7moD1ukA1r5V1DRA0GjHQk1p6S9hkL0PaMD7xl04jSttMRalOYU1sg4wqQ";
private final String vaultConfig = "eyJraWQiOiJtYXN0ZXJrZXlmaWxlOm1hc3RlcmtleS5jcnlwdG9tYXRvciIsImFsZyI6IkhTNTEyIn0.eyJmb3JtYXQiOjgsInNob3J0ZW5pbmdUaHJlc2hvbGQiOjIyMCwiY2lwaGVyQ29tYm8iOiJTSVZfQ1RSTUFDIn0.Evt5KXS_35pm53DynIwL3qvXWF56UkfqDZKv12n7SD288jzcdvvmtvu5sQhhqvxU6CPL4Q9v3yFQ_lvBynyrYA";
private Context context;
private Cloud cloud;
@ -173,7 +173,7 @@ class MasterkeyCryptoCloudProviderTest {
MatcherAssert.assertThat(result.isUnlocked(), is(true));
MatcherAssert.assertThat(result.getFormat(), is(8));
MatcherAssert.assertThat(result.getMaxFileNameLength(), is(DEFAULT_MAX_FILE_NAME));
MatcherAssert.assertThat(result.getShorteningThreshold(), is(DEFAULT_MAX_FILE_NAME));
Mockito.verify(inTest).cryptorFor(unlockToken.getKeyFile("foo"), SIV_CTRMAC);
Mockito.verify(cryptoCloudContentRepositoryFactory).registerCryptor(Mockito.any(Vault.class), Mockito.any(Cryptor.class));
@ -200,7 +200,7 @@ class MasterkeyCryptoCloudProviderTest {
MatcherAssert.assertThat(result.isUnlocked(), is(true));
MatcherAssert.assertThat(result.getFormat(), is(MAX_VAULT_VERSION_WITHOUT_VAULT_CONFIG));
MatcherAssert.assertThat(result.getMaxFileNameLength(), is(DEFAULT_MAX_FILE_NAME));
MatcherAssert.assertThat(result.getShorteningThreshold(), is(DEFAULT_MAX_FILE_NAME));
Mockito.verify(inTest).cryptorFor(unlockToken.getKeyFile("foo"), SIV_CTRMAC);
Mockito.verify(cryptoCloudContentRepositoryFactory).registerCryptor(Mockito.any(Vault.class), Mockito.any(Cryptor.class));

View File

@ -13,7 +13,7 @@ public class Vault implements Serializable {
private final boolean unlocked;
private final String password;
private final int format;
private final int maxFileNameLength;
private final int shorteningThreshold;
private final int position;
private Vault(Builder builder) {
@ -25,7 +25,7 @@ public class Vault implements Serializable {
this.cloudType = builder.cloudType;
this.password = builder.password;
this.format = builder.format;
this.maxFileNameLength = builder.maxFileNameLength;
this.shorteningThreshold = builder.shorteningThreshold;
this.position = builder.position;
}
@ -43,7 +43,7 @@ public class Vault implements Serializable {
.withUnlocked(vault.isUnlocked()) //
.withSavedPassword(vault.getPassword()) //
.withFormat(vault.getFormat()) //
.withMaxFileNameLength(vault.getMaxFileNameLength()) //
.withShorteningThreshold(vault.getShorteningThreshold()) //
.withPosition(vault.getPosition());
}
@ -79,8 +79,8 @@ public class Vault implements Serializable {
return format;
}
public int getMaxFileNameLength() {
return maxFileNameLength;
public int getShorteningThreshold() {
return shorteningThreshold;
}
public int getPosition() {
@ -117,7 +117,7 @@ public class Vault implements Serializable {
private boolean unlocked;
private String password;
private int format = -1;
private int maxFileNameLength = -1;
private int shorteningThreshold = -1;
private int position = -1;
private Builder() {
@ -189,8 +189,8 @@ public class Vault implements Serializable {
return this;
}
public Builder withMaxFileNameLength(int maxFileNameLength) {
this.maxFileNameLength = maxFileNameLength;
public Builder withShorteningThreshold(int shorteningThreshold) {
this.shorteningThreshold = shorteningThreshold;
return this;
}

View File

@ -17,8 +17,8 @@ class VaultModel(private val vault: Vault) : Serializable {
get() = vault.position
val format: Int
get() = vault.format
val maxFileNameLength: Int
get() = vault.maxFileNameLength
val shorteningThreshold: Int
get() = vault.shorteningThreshold
fun toVault(): Vault {
return vault