1) Split code into v1 and v2 message paths. 2) Do the Axolotl protocol for v2. 3) Switch all v2 entities to protobuf.
121 lines
3.4 KiB
Java
121 lines
3.4 KiB
Java
/**
|
|
* Copyright (C) 2011 Whisper Systems
|
|
* Copyright (C) 2013 Open Whisper Systems
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
package org.whispersystems.textsecure.crypto;
|
|
|
|
import android.os.Parcel;
|
|
import android.os.Parcelable;
|
|
|
|
import org.whispersystems.textsecure.crypto.ecc.Curve;
|
|
import org.whispersystems.textsecure.crypto.ecc.ECPublicKey;
|
|
import org.whispersystems.textsecure.util.Hex;
|
|
import org.whispersystems.textsecure.util.Util;
|
|
|
|
/**
|
|
* A class for representing an identity key.
|
|
*
|
|
* @author Moxie Marlinspike
|
|
*/
|
|
|
|
public class IdentityKey implements Parcelable, SerializableKey {
|
|
|
|
public static final Parcelable.Creator<IdentityKey> CREATOR = new Parcelable.Creator<IdentityKey>() {
|
|
public IdentityKey createFromParcel(Parcel in) {
|
|
try {
|
|
return new IdentityKey(in);
|
|
} catch (InvalidKeyException e) {
|
|
throw new AssertionError(e);
|
|
}
|
|
}
|
|
|
|
public IdentityKey[] newArray(int size) {
|
|
return new IdentityKey[size];
|
|
}
|
|
};
|
|
|
|
public static final int NIST_SIZE = 1 + ECPublicKey.KEY_SIZE;
|
|
|
|
private ECPublicKey publicKey;
|
|
|
|
public IdentityKey(ECPublicKey publicKey) {
|
|
this.publicKey = publicKey;
|
|
}
|
|
|
|
public IdentityKey(Parcel in) throws InvalidKeyException {
|
|
int length = in.readInt();
|
|
byte[] serialized = new byte[length];
|
|
|
|
in.readByteArray(serialized);
|
|
initializeFromSerialized(serialized, 0);
|
|
}
|
|
|
|
public IdentityKey(byte[] bytes, int offset) throws InvalidKeyException {
|
|
initializeFromSerialized(bytes, offset);
|
|
}
|
|
|
|
public ECPublicKey getPublicKey() {
|
|
return publicKey;
|
|
}
|
|
|
|
private void initializeFromSerialized(byte[] bytes, int offset) throws InvalidKeyException {
|
|
if ((bytes[offset] & 0xff) == 1) {
|
|
this.publicKey = Curve.decodePoint(bytes, offset +1);
|
|
} else {
|
|
this.publicKey = Curve.decodePoint(bytes, offset);
|
|
}
|
|
}
|
|
|
|
public byte[] serialize() {
|
|
if (publicKey.getType() == Curve.NIST_TYPE) {
|
|
byte[] versionBytes = {0x01};
|
|
byte[] encodedKey = publicKey.serialize();
|
|
|
|
return Util.combine(versionBytes, encodedKey);
|
|
} else {
|
|
return publicKey.serialize();
|
|
}
|
|
}
|
|
|
|
public String getFingerprint() {
|
|
return Hex.toString(publicKey.serialize());
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(Object other) {
|
|
if (other == null) return false;
|
|
if (!(other instanceof IdentityKey)) return false;
|
|
|
|
return publicKey.equals(((IdentityKey) other).getPublicKey());
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
return publicKey.hashCode();
|
|
}
|
|
|
|
public int describeContents() {
|
|
// TODO Auto-generated method stub
|
|
return 0;
|
|
}
|
|
|
|
public void writeToParcel(Parcel dest, int flags) {
|
|
byte[] serialized = this.serialize();
|
|
dest.writeInt(serialized.length);
|
|
dest.writeByteArray(serialized);
|
|
}
|
|
|
|
}
|