diff --git a/MasterPassword/Java/masterpassword-algorithm/pom.xml b/MasterPassword/Java/masterpassword-algorithm/pom.xml index daee227c..757fa0d3 100644 --- a/MasterPassword/Java/masterpassword-algorithm/pom.xml +++ b/MasterPassword/Java/masterpassword-algorithm/pom.xml @@ -23,7 +23,7 @@ com.lyndir.lhunath.opal opal-system - 1.6-p8 + 1.6-p9 joda-time diff --git a/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKey.java b/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKey.java index 6e152180..f4faaf43 100644 --- a/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKey.java +++ b/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKey.java @@ -1,6 +1,7 @@ package com.lyndir.masterpassword; import com.google.common.base.Preconditions; +import com.google.common.primitives.UnsignedInteger; import com.lyndir.lhunath.opal.system.*; import com.lyndir.lhunath.opal.system.logging.Logger; import java.util.Arrays; @@ -74,7 +75,7 @@ public abstract class MasterKey { return idForBytes( getKey() ); } - public abstract String encode(@Nonnull final String siteName, final MPSiteType siteType, int siteCounter, + public abstract String encode(@Nonnull final String siteName, final MPSiteType siteType, @Nonnull final UnsignedInteger siteCounter, final MPSiteVariant siteVariant, @Nullable final String siteContext); public boolean isValid() { @@ -106,7 +107,9 @@ public abstract class MasterKey { return this; } - protected abstract byte[] bytesForInt(final int integer); + protected abstract byte[] bytesForInt(final int number); + + protected abstract byte[] bytesForInt(@Nonnull final UnsignedInteger number); protected abstract byte[] idForBytes(final byte[] bytes); diff --git a/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKeyV0.java b/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKeyV0.java index c1efe212..4ece61c3 100644 --- a/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKeyV0.java +++ b/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKeyV0.java @@ -3,6 +3,7 @@ package com.lyndir.masterpassword; import com.google.common.base.Charsets; import com.google.common.base.Preconditions; import com.google.common.primitives.Bytes; +import com.google.common.primitives.UnsignedInteger; import com.lambdaworks.crypto.SCrypt; import com.lyndir.lhunath.opal.system.*; import com.lyndir.lhunath.opal.system.logging.Logger; @@ -10,14 +11,15 @@ import java.nio.*; import java.nio.charset.Charset; import java.security.GeneralSecurityException; import java.util.Arrays; +import javax.annotation.Nonnull; import javax.annotation.Nullable; /** * bugs: - * - does math with chars whose signedness was platform-dependent. - * - miscounted the byte-length fromInt multi-byte site names. - * - miscounted the byte-length fromInt multi-byte full names. + * - V2: miscounted the byte-length fromInt multi-byte full names. + * - V1: miscounted the byte-length fromInt multi-byte site names. + * - V0: does math with chars whose signedness was platform-dependent. * * @author lhunath, 2014-08-30 */ @@ -75,18 +77,19 @@ public class MasterKeyV0 extends MasterKey { } } - public String encode(final String siteName, final MPSiteType siteType, int siteCounter, final MPSiteVariant siteVariant, - @Nullable final String siteContext) { + @Override + public String encode(@Nonnull final String siteName, final MPSiteType siteType, @Nonnull UnsignedInteger siteCounter, + final MPSiteVariant siteVariant, @Nullable final String siteContext) { Preconditions.checkArgument( siteType.getTypeClass() == MPSiteTypeClass.Generated ); Preconditions.checkArgument( !siteName.isEmpty() ); logger.trc( "siteName: %s", siteName ); - logger.trc( "siteCounter: %d", siteCounter ); + logger.trc( "siteCounter: %d", siteCounter.longValue() ); logger.trc( "siteVariant: %d (%s)", siteVariant.ordinal(), siteVariant ); logger.trc( "siteType: %d (%s)", siteType.ordinal(), siteType ); - if (siteCounter == 0) - siteCounter = (int) (System.currentTimeMillis() / (300 * 1000)) * 300; + if (siteCounter.longValue() == 0) + siteCounter = UnsignedInteger.valueOf( (System.currentTimeMillis() / (300 * 1000)) * 300 ); String siteScope = siteVariant.getScope(); byte[] siteNameBytes = siteName.getBytes( MP_charset ); @@ -108,7 +111,7 @@ public class MasterKeyV0 extends MasterKey { int[] sitePasswordSeed = new int[sitePasswordSeedBytes.length]; for (int i = 0; i < sitePasswordSeedBytes.length; ++i) { ByteBuffer buf = ByteBuffer.allocate( Integer.SIZE / Byte.SIZE ).order( ByteOrder.BIG_ENDIAN ); - Arrays.fill( buf.array(), sitePasswordSeedBytes[i] > 0? (byte)0x00: (byte) 0xFF ); + Arrays.fill( buf.array(), sitePasswordSeedBytes[i] > 0? (byte) 0x00: (byte) 0xFF ); buf.position( 2 ); buf.put( sitePasswordSeedBytes[i] ).rewind(); sitePasswordSeed[i] = buf.getInt() & 0xFFFF; @@ -135,8 +138,13 @@ public class MasterKeyV0 extends MasterKey { } @Override - protected byte[] bytesForInt(final int integer) { - return ByteBuffer.allocate( MP_intLen / Byte.SIZE ).order( MP_byteOrder ).putInt( integer ).array(); + protected byte[] bytesForInt(final int number) { + return ByteBuffer.allocate( MP_intLen / Byte.SIZE ).order( MP_byteOrder ).putInt( number ).array(); + } + + @Override + protected byte[] bytesForInt(@Nonnull final UnsignedInteger number) { + return ByteBuffer.allocate( MP_intLen / Byte.SIZE ).order( MP_byteOrder ).putInt( number.intValue() ).array(); } @Override diff --git a/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKeyV1.java b/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKeyV1.java index bcb9d58d..d58dcf4e 100644 --- a/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKeyV1.java +++ b/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKeyV1.java @@ -2,15 +2,17 @@ package com.lyndir.masterpassword; import com.google.common.base.Preconditions; import com.google.common.primitives.Bytes; +import com.google.common.primitives.UnsignedInteger; import com.lyndir.lhunath.opal.system.*; import com.lyndir.lhunath.opal.system.logging.Logger; +import javax.annotation.Nonnull; import javax.annotation.Nullable; /** * bugs: - * - miscounted the byte-length fromInt multi-byte site names. - * - miscounted the byte-length fromInt multi-byte full names. + * - V2: miscounted the byte-length fromInt multi-byte full names. + * - V1: miscounted the byte-length fromInt multi-byte site names. * * @author lhunath, 2014-08-30 */ @@ -29,18 +31,19 @@ public class MasterKeyV1 extends MasterKeyV0 { return Version.V1; } - public String encode(final String siteName, final MPSiteType siteType, int siteCounter, final MPSiteVariant siteVariant, - @Nullable final String siteContext) { + @Override + public String encode(@Nonnull final String siteName, final MPSiteType siteType, @Nonnull UnsignedInteger siteCounter, + final MPSiteVariant siteVariant, @Nullable final String siteContext) { Preconditions.checkArgument( siteType.getTypeClass() == MPSiteTypeClass.Generated ); Preconditions.checkArgument( !siteName.isEmpty() ); logger.trc( "siteName: %s", siteName ); - logger.trc( "siteCounter: %d", siteCounter ); + logger.trc( "siteCounter: %d", siteCounter.longValue() ); logger.trc( "siteVariant: %d (%s)", siteVariant.ordinal(), siteVariant ); logger.trc( "siteType: %d (%s)", siteType.ordinal(), siteType ); - if (siteCounter == 0) - siteCounter = (int) (System.currentTimeMillis() / (300 * 1000)) * 300; + if (siteCounter.longValue() == 0) + siteCounter = UnsignedInteger.valueOf( (System.currentTimeMillis() / (300 * 1000)) * 300 ); String siteScope = siteVariant.getScope(); byte[] siteNameBytes = siteName.getBytes( MP_charset ); diff --git a/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKeyV2.java b/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKeyV2.java index 7da2856a..e4019d52 100644 --- a/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKeyV2.java +++ b/MasterPassword/Java/masterpassword-algorithm/src/main/java/com/lyndir/masterpassword/MasterKeyV2.java @@ -2,14 +2,16 @@ package com.lyndir.masterpassword; import com.google.common.base.Preconditions; import com.google.common.primitives.Bytes; +import com.google.common.primitives.UnsignedInteger; import com.lyndir.lhunath.opal.system.CodeUtils; import com.lyndir.lhunath.opal.system.logging.Logger; +import javax.annotation.Nonnull; import javax.annotation.Nullable; /** * bugs: - * - miscounted the byte-length fromInt multi-byte full names. + * - V2: miscounted the byte-length fromInt multi-byte full names. * * @author lhunath, 2014-08-30 */ @@ -28,18 +30,19 @@ public class MasterKeyV2 extends MasterKeyV1 { return Version.V2; } - public String encode(final String siteName, final MPSiteType siteType, int siteCounter, final MPSiteVariant siteVariant, - @Nullable final String siteContext) { + @Override + public String encode(@Nonnull final String siteName, final MPSiteType siteType, @Nonnull UnsignedInteger siteCounter, + final MPSiteVariant siteVariant, @Nullable final String siteContext) { Preconditions.checkArgument( siteType.getTypeClass() == MPSiteTypeClass.Generated ); Preconditions.checkArgument( !siteName.isEmpty() ); logger.trc( "siteName: %s", siteName ); - logger.trc( "siteCounter: %d", siteCounter ); + logger.trc( "siteCounter: %d", siteCounter.longValue() ); logger.trc( "siteVariant: %d (%s)", siteVariant.ordinal(), siteVariant ); logger.trc( "siteType: %d (%s)", siteType.ordinal(), siteType ); - if (siteCounter == 0) - siteCounter = (int) (System.currentTimeMillis() / (300 * 1000)) * 300; + if (siteCounter.longValue() == 0) + siteCounter = UnsignedInteger.valueOf( (System.currentTimeMillis() / (300 * 1000)) * 300 ); String siteScope = siteVariant.getScope(); byte[] siteNameBytes = siteName.getBytes( MP_charset ); diff --git a/MasterPassword/Java/masterpassword-android/AndroidManifest.xml b/MasterPassword/Java/masterpassword-android/AndroidManifest.xml index bf60405d..2f9c1f5f 100644 --- a/MasterPassword/Java/masterpassword-android/AndroidManifest.xml +++ b/MasterPassword/Java/masterpassword-android/AndroidManifest.xml @@ -12,13 +12,13 @@ android:icon="@drawable/icon" android:label="@string/app_name" android:allowBackup="true"> - + - + diff --git a/MasterPassword/Java/masterpassword-android/pom.xml b/MasterPassword/Java/masterpassword-android/pom.xml index bb16bc0e..906bbfbe 100644 --- a/MasterPassword/Java/masterpassword-android/pom.xml +++ b/MasterPassword/Java/masterpassword-android/pom.xml @@ -107,6 +107,13 @@ GIT-SNAPSHOT + + com.lyndir.masterpassword + masterpassword-tests + GIT-SNAPSHOT + + + com.jakewharton butterknife diff --git a/MasterPassword/Java/masterpassword-android/res/layout/activity_test.xml b/MasterPassword/Java/masterpassword-android/res/layout/activity_test.xml new file mode 100644 index 00000000..81170812 --- /dev/null +++ b/MasterPassword/Java/masterpassword-android/res/layout/activity_test.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + +