org.whispersystems.libsignal.ecc.ECKeyPair Java Examples
The following examples show how to use
org.whispersystems.libsignal.ecc.ECKeyPair.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: SessionState.java From libsignal-protocol-java with GNU General Public License v3.0 | 6 votes |
public void setPendingKeyExchange(int sequence, ECKeyPair ourBaseKey, ECKeyPair ourRatchetKey, IdentityKeyPair ourIdentityKey) { PendingKeyExchange structure = PendingKeyExchange.newBuilder() .setSequence(sequence) .setLocalBaseKey(ByteString.copyFrom(ourBaseKey.getPublicKey().serialize())) .setLocalBaseKeyPrivate(ByteString.copyFrom(ourBaseKey.getPrivateKey().serialize())) .setLocalRatchetKey(ByteString.copyFrom(ourRatchetKey.getPublicKey().serialize())) .setLocalRatchetKeyPrivate(ByteString.copyFrom(ourRatchetKey.getPrivateKey().serialize())) .setLocalIdentityKey(ByteString.copyFrom(ourIdentityKey.getPublicKey().serialize())) .setLocalIdentityKeyPrivate(ByteString.copyFrom(ourIdentityKey.getPrivateKey().serialize())) .build(); this.sessionStructure = this.sessionStructure.toBuilder() .setPendingKeyExchange(structure) .build(); }
Example #2
Source File: SessionBuilderTest.java From libsignal-protocol-java with GNU General Public License v3.0 | 6 votes |
public void testBasicPreKeyV2() throws InvalidKeyException, InvalidVersionException, InvalidMessageException, InvalidKeyIdException, DuplicateMessageException, LegacyMessageException, UntrustedIdentityException, NoSessionException { SignalProtocolStore aliceStore = new TestInMemorySignalProtocolStore(); SessionBuilder aliceSessionBuilder = new SessionBuilder(aliceStore, BOB_ADDRESS); SignalProtocolStore bobStore = new TestInMemorySignalProtocolStore(); ECKeyPair bobPreKeyPair = Curve.generateKeyPair(); PreKeyBundle bobPreKey = new PreKeyBundle(bobStore.getLocalRegistrationId(), 1, 31337, bobPreKeyPair.getPublicKey(), 0, null, null, bobStore.getIdentityKeyPair().getPublicKey()); try { aliceSessionBuilder.process(bobPreKey); throw new AssertionError("Should fail with missing unsigned prekey!"); } catch (InvalidKeyException e) { // Good! return; } }
Example #3
Source File: PreKeyUtil.java From bcm-android with GNU General Public License v3.0 | 6 votes |
public static SignedPreKeyRecord generateSignedPreKey(Context context, AccountContext accountContext, IdentityKeyPair identityKeyPair, boolean active) { try { SignedPreKeyStore signedPreKeyStore = new TextSecurePreKeyStore(context, accountContext); int signedPreKeyId = getNextSignedPreKeyId(context, accountContext); ECKeyPair keyPair = Curve.generateKeyPair(); byte[] signature = Curve.calculateSignature(identityKeyPair.getPrivateKey(), keyPair.getPublicKey().serialize()); SignedPreKeyRecord record = new SignedPreKeyRecord(signedPreKeyId, System.currentTimeMillis(), keyPair, signature); signedPreKeyStore.storeSignedPreKey(signedPreKeyId, record); setNextSignedPreKeyId(context, accountContext,(signedPreKeyId + 1) % Medium.MAX_VALUE); if (active) { setActiveSignedPreKeyId(context, accountContext, signedPreKeyId); } return record; } catch (InvalidKeyException e) { throw new AssertionError(e); } }
Example #4
Source File: ProvisioningCipher.java From bcm-android with GNU General Public License v3.0 | 6 votes |
public byte[] encrypt(ProvisionMessage message) throws InvalidKeyException { ECKeyPair ourKeyPair = Curve.generateKeyPair(); byte[] sharedSecret = Curve.calculateAgreement(theirPublicKey, ourKeyPair.getPrivateKey()); byte[] derivedSecret = new HKDFv3().deriveSecrets(sharedSecret, "TextSecure Provisioning Message".getBytes(), 64); byte[][] parts = Util.split(derivedSecret, 32, 32); byte[] version = {0x01}; byte[] ciphertext = getCiphertext(parts[0], message.toByteArray()); byte[] mac = getMac(parts[1], Util.join(version, ciphertext)); byte[] body = Util.join(version, ciphertext, mac); return ProvisionEnvelope.newBuilder() .setPublicKey(ByteString.copyFrom(ourKeyPair.getPublicKey().serialize())) .setBody(ByteString.copyFrom(body)) .build() .toByteArray(); }
Example #5
Source File: NumericFingerprintGeneratorTest.java From libsignal-protocol-java with GNU General Public License v3.0 | 6 votes |
public void testMismatchingIdentifiers() throws FingerprintVersionMismatchException, FingerprintParsingException { ECKeyPair aliceKeyPair = Curve.generateKeyPair(); ECKeyPair bobKeyPair = Curve.generateKeyPair(); IdentityKey aliceIdentityKey = new IdentityKey(aliceKeyPair.getPublicKey()); IdentityKey bobIdentityKey = new IdentityKey(bobKeyPair.getPublicKey()); NumericFingerprintGenerator generator = new NumericFingerprintGenerator(1024); Fingerprint aliceFingerprint = generator.createFor(VERSION_1, "+141512222222".getBytes(), aliceIdentityKey, "+14153333333".getBytes(), bobIdentityKey); Fingerprint bobFingerprint = generator.createFor(VERSION_1, "+14153333333".getBytes(), bobIdentityKey, "+14152222222".getBytes(), aliceIdentityKey); assertFalse(aliceFingerprint.getDisplayableFingerprint().getDisplayText().equals( bobFingerprint.getDisplayableFingerprint().getDisplayText())); assertFalse(aliceFingerprint.getScannableFingerprint().compareTo(bobFingerprint.getScannableFingerprint().getSerialized())); assertFalse(bobFingerprint.getScannableFingerprint().compareTo(aliceFingerprint.getScannableFingerprint().getSerialized())); }
Example #6
Source File: AsymmetricMasterCipher.java From mollyim-android with GNU General Public License v3.0 | 6 votes |
public byte[] encryptBytes(byte[] body) { try { ECPublicKey theirPublic = asymmetricMasterSecret.getDjbPublicKey(); ECKeyPair ourKeyPair = Curve.generateKeyPair(); byte[] secret = Curve.calculateAgreement(theirPublic, ourKeyPair.getPrivateKey()); MasterCipher masterCipher = getMasterCipherForSecret(secret); byte[] encryptedBodyBytes = masterCipher.encrypt(body); PublicKey ourPublicKey = new PublicKey(31337, ourKeyPair.getPublicKey()); byte[] publicKeyBytes = ourPublicKey.serialize(); return Util.combine(publicKeyBytes, encryptedBodyBytes); } catch (InvalidKeyException e) { throw new AssertionError(e); } }
Example #7
Source File: PreKeyUtil.java From mollyim-android with GNU General Public License v3.0 | 6 votes |
public synchronized static SignedPreKeyRecord generateSignedPreKey(Context context, IdentityKeyPair identityKeyPair, boolean active) { try { SignedPreKeyStore signedPreKeyStore = new TextSecurePreKeyStore(context); int signedPreKeyId = TextSecurePreferences.getNextSignedPreKeyId(context); ECKeyPair keyPair = Curve.generateKeyPair(); byte[] signature = Curve.calculateSignature(identityKeyPair.getPrivateKey(), keyPair.getPublicKey().serialize()); SignedPreKeyRecord record = new SignedPreKeyRecord(signedPreKeyId, System.currentTimeMillis(), keyPair, signature); signedPreKeyStore.storeSignedPreKey(signedPreKeyId, record); TextSecurePreferences.setNextSignedPreKeyId(context, (signedPreKeyId + 1) % Medium.MAX_VALUE); if (active) { TextSecurePreferences.setActiveSignedPreKeyId(context, signedPreKeyId); } return record; } catch (InvalidKeyException e) { throw new AssertionError(e); } }
Example #8
Source File: PreKeyUtil.java From mollyim-android with GNU General Public License v3.0 | 6 votes |
public synchronized static List<PreKeyRecord> generatePreKeys(Context context) { PreKeyStore preKeyStore = new TextSecurePreKeyStore(context); List<PreKeyRecord> records = new LinkedList<>(); int preKeyIdOffset = TextSecurePreferences.getNextPreKeyId(context); for (int i=0;i<BATCH_SIZE;i++) { int preKeyId = (preKeyIdOffset + i) % Medium.MAX_VALUE; ECKeyPair keyPair = Curve.generateKeyPair(); PreKeyRecord record = new PreKeyRecord(preKeyId, keyPair); preKeyStore.storePreKey(preKeyId, record); records.add(record); } TextSecurePreferences.setNextPreKeyId(context, (preKeyIdOffset + BATCH_SIZE + 1) % Medium.MAX_VALUE); return records; }
Example #9
Source File: SimultaneousInitiateTests.java From libsignal-protocol-java with GNU General Public License v3.0 | 6 votes |
private PreKeyBundle createAlicePreKeyBundle(SignalProtocolStore aliceStore) throws InvalidKeyException { ECKeyPair aliceUnsignedPreKey = Curve.generateKeyPair(); int aliceUnsignedPreKeyId = new Random().nextInt(Medium.MAX_VALUE); byte[] aliceSignature = Curve.calculateSignature(aliceStore.getIdentityKeyPair().getPrivateKey(), aliceSignedPreKey.getPublicKey().serialize()); PreKeyBundle alicePreKeyBundle = new PreKeyBundle(1, 1, aliceUnsignedPreKeyId, aliceUnsignedPreKey.getPublicKey(), aliceSignedPreKeyId, aliceSignedPreKey.getPublicKey(), aliceSignature, aliceStore.getIdentityKeyPair().getPublicKey()); aliceStore.storeSignedPreKey(aliceSignedPreKeyId, new SignedPreKeyRecord(aliceSignedPreKeyId, System.currentTimeMillis(), aliceSignedPreKey, aliceSignature)); aliceStore.storePreKey(aliceUnsignedPreKeyId, new PreKeyRecord(aliceUnsignedPreKeyId, aliceUnsignedPreKey)); return alicePreKeyBundle; }
Example #10
Source File: SimultaneousInitiateTests.java From libsignal-protocol-java with GNU General Public License v3.0 | 6 votes |
private PreKeyBundle createBobPreKeyBundle(SignalProtocolStore bobStore) throws InvalidKeyException { ECKeyPair bobUnsignedPreKey = Curve.generateKeyPair(); int bobUnsignedPreKeyId = new Random().nextInt(Medium.MAX_VALUE); byte[] bobSignature = Curve.calculateSignature(bobStore.getIdentityKeyPair().getPrivateKey(), bobSignedPreKey.getPublicKey().serialize()); PreKeyBundle bobPreKeyBundle = new PreKeyBundle(1, 1, bobUnsignedPreKeyId, bobUnsignedPreKey.getPublicKey(), bobSignedPreKeyId, bobSignedPreKey.getPublicKey(), bobSignature, bobStore.getIdentityKeyPair().getPublicKey()); bobStore.storeSignedPreKey(bobSignedPreKeyId, new SignedPreKeyRecord(bobSignedPreKeyId, System.currentTimeMillis(), bobSignedPreKey, bobSignature)); bobStore.storePreKey(bobUnsignedPreKeyId, new PreKeyRecord(bobUnsignedPreKeyId, bobUnsignedPreKey)); return bobPreKeyBundle; }
Example #11
Source File: SignedPreKeyDatabase.java From mollyim-android with GNU General Public License v3.0 | 6 votes |
public @NonNull List<SignedPreKeyRecord> getAllSignedPreKeys() { SQLiteDatabase database = databaseHelper.getReadableDatabase(); List<SignedPreKeyRecord> results = new LinkedList<>(); try (Cursor cursor = database.query(TABLE_NAME, null, null, null, null, null, null)) { while (cursor != null && cursor.moveToNext()) { try { int keyId = cursor.getInt(cursor.getColumnIndexOrThrow(KEY_ID)); ECPublicKey publicKey = Curve.decodePoint(Base64.decode(cursor.getString(cursor.getColumnIndexOrThrow(PUBLIC_KEY))), 0); ECPrivateKey privateKey = Curve.decodePrivatePoint(Base64.decode(cursor.getString(cursor.getColumnIndexOrThrow(PRIVATE_KEY)))); byte[] signature = Base64.decode(cursor.getString(cursor.getColumnIndexOrThrow(SIGNATURE))); long timestamp = cursor.getLong(cursor.getColumnIndexOrThrow(TIMESTAMP)); results.add(new SignedPreKeyRecord(keyId, timestamp, new ECKeyPair(publicKey, privateKey), signature)); } catch (InvalidKeyException | IOException e) { Log.w(TAG, e); } } } return results; }
Example #12
Source File: SignedPreKeyDatabase.java From mollyim-android with GNU General Public License v3.0 | 6 votes |
public @Nullable SignedPreKeyRecord getSignedPreKey(int keyId) { SQLiteDatabase database = databaseHelper.getReadableDatabase(); try (Cursor cursor = database.query(TABLE_NAME, null, KEY_ID + " = ?", new String[] {String.valueOf(keyId)}, null, null, null)) { if (cursor != null && cursor.moveToFirst()) { try { ECPublicKey publicKey = Curve.decodePoint(Base64.decode(cursor.getString(cursor.getColumnIndexOrThrow(PUBLIC_KEY))), 0); ECPrivateKey privateKey = Curve.decodePrivatePoint(Base64.decode(cursor.getString(cursor.getColumnIndexOrThrow(PRIVATE_KEY)))); byte[] signature = Base64.decode(cursor.getString(cursor.getColumnIndexOrThrow(SIGNATURE))); long timestamp = cursor.getLong(cursor.getColumnIndexOrThrow(TIMESTAMP)); return new SignedPreKeyRecord(keyId, timestamp, new ECKeyPair(publicKey, privateKey), signature); } catch (InvalidKeyException | IOException e) { Log.w(TAG, e); } } } return null; }
Example #13
Source File: PreKeyUtil.java From bcm-android with GNU General Public License v3.0 | 6 votes |
public static List<PreKeyRecord> generatePreKeys(Context context, AccountContext accountContext) { PreKeyStore preKeyStore = new TextSecurePreKeyStore(context, accountContext); List<PreKeyRecord> records = new LinkedList<>(); int preKeyIdOffset = getNextPreKeyId(context, accountContext); for (int i = 0; i < BATCH_SIZE; i++) { int preKeyId = (preKeyIdOffset + i) % Medium.MAX_VALUE; ECKeyPair keyPair = Curve.generateKeyPair(); PreKeyRecord record = new PreKeyRecord(preKeyId, keyPair); preKeyStore.storePreKey(preKeyId, record); records.add(record); } setNextPreKeyId(context, accountContext,(preKeyIdOffset + BATCH_SIZE + 1) % Medium.MAX_VALUE); return records; }
Example #14
Source File: AsymmetricMasterCipher.java From bcm-android with GNU General Public License v3.0 | 6 votes |
public byte[] encryptBytes(byte[] body) { try { ECPublicKey theirPublic = asymmetricMasterSecret.getDjbPublicKey(); ECKeyPair ourKeyPair = Curve.generateKeyPair(); byte[] secret = Curve.calculateAgreement(theirPublic, ourKeyPair.getPrivateKey()); MasterCipher masterCipher = getMasterCipherForSecret(secret); byte[] encryptedBodyBytes = masterCipher.encryptBytes(body); PublicKey ourPublicKey = new PublicKey(31337, ourKeyPair.getPublicKey()); byte[] publicKeyBytes = ourPublicKey.serialize(); return Util.combine(publicKeyBytes, encryptedBodyBytes); } catch (InvalidKeyException e) { throw new AssertionError(e); } }
Example #15
Source File: Manager.java From signald with GNU General Public License v3.0 | 6 votes |
private List<PreKeyRecord> generatePreKeys() throws IOException { List<PreKeyRecord> records = new LinkedList<>(); for (int i = 0; i < PREKEY_BATCH_SIZE; i++) { int preKeyId = (accountData.preKeyIdOffset + i) % Medium.MAX_VALUE; ECKeyPair keyPair = Curve.generateKeyPair(); PreKeyRecord record = new PreKeyRecord(preKeyId, keyPair); accountData.axolotlStore.preKeys.storePreKey(preKeyId, record); records.add(record); } accountData.preKeyIdOffset = (accountData.preKeyIdOffset + PREKEY_BATCH_SIZE + 1) % Medium.MAX_VALUE; accountData.save(); return records; }
Example #16
Source File: NumericFingerprintGeneratorTest.java From libsignal-protocol-java with GNU General Public License v3.0 | 6 votes |
public void testMismatchingFingerprints() throws FingerprintVersionMismatchException, FingerprintIdentifierMismatchException, FingerprintParsingException { ECKeyPair aliceKeyPair = Curve.generateKeyPair(); ECKeyPair bobKeyPair = Curve.generateKeyPair(); ECKeyPair mitmKeyPair = Curve.generateKeyPair(); IdentityKey aliceIdentityKey = new IdentityKey(aliceKeyPair.getPublicKey()); IdentityKey bobIdentityKey = new IdentityKey(bobKeyPair.getPublicKey()); IdentityKey mitmIdentityKey = new IdentityKey(mitmKeyPair.getPublicKey()); NumericFingerprintGenerator generator = new NumericFingerprintGenerator(1024); Fingerprint aliceFingerprint = generator.createFor(VERSION_1, "+14152222222".getBytes(), aliceIdentityKey, "+14153333333".getBytes(), mitmIdentityKey); Fingerprint bobFingerprint = generator.createFor(VERSION_1, "+14153333333".getBytes(), bobIdentityKey, "+14152222222".getBytes(), aliceIdentityKey); assertFalse(aliceFingerprint.getDisplayableFingerprint().getDisplayText().equals( bobFingerprint.getDisplayableFingerprint().getDisplayText())); assertFalse(aliceFingerprint.getScannableFingerprint().compareTo(bobFingerprint.getScannableFingerprint().getSerialized())); assertFalse(bobFingerprint.getScannableFingerprint().compareTo(aliceFingerprint.getScannableFingerprint().getSerialized())); }
Example #17
Source File: ProvisioningCipher.java From libsignal-service-java with GNU General Public License v3.0 | 6 votes |
public byte[] encrypt(ProvisionMessage message) throws InvalidKeyException { ECKeyPair ourKeyPair = Curve.generateKeyPair(); byte[] sharedSecret = Curve.calculateAgreement(theirPublicKey, ourKeyPair.getPrivateKey()); byte[] derivedSecret = new HKDFv3().deriveSecrets(sharedSecret, "TextSecure Provisioning Message".getBytes(), 64); byte[][] parts = Util.split(derivedSecret, 32, 32); byte[] version = {0x01}; byte[] ciphertext = getCiphertext(parts[0], message.toByteArray()); byte[] mac = getMac(parts[1], Util.join(version, ciphertext)); byte[] body = Util.join(version, ciphertext, mac); return ProvisionEnvelope.newBuilder() .setPublicKey(ByteString.copyFrom(ourKeyPair.getPublicKey().serialize())) .setBody(ByteString.copyFrom(body)) .build() .toByteArray(); }
Example #18
Source File: Manager.java From signal-cli with GNU General Public License v3.0 | 6 votes |
private List<PreKeyRecord> generatePreKeys() { List<PreKeyRecord> records = new ArrayList<>(ServiceConfig.PREKEY_BATCH_SIZE); final int offset = account.getPreKeyIdOffset(); for (int i = 0; i < ServiceConfig.PREKEY_BATCH_SIZE; i++) { int preKeyId = (offset + i) % Medium.MAX_VALUE; ECKeyPair keyPair = Curve.generateKeyPair(); PreKeyRecord record = new PreKeyRecord(preKeyId, keyPair); records.add(record); } account.addPreKeys(records); account.save(); return records; }
Example #19
Source File: NumericFingerprintGeneratorTest.java From libsignal-protocol-java with GNU General Public License v3.0 | 6 votes |
public void testMatchingFingerprints() throws FingerprintVersionMismatchException, FingerprintIdentifierMismatchException, FingerprintParsingException { ECKeyPair aliceKeyPair = Curve.generateKeyPair(); ECKeyPair bobKeyPair = Curve.generateKeyPair(); IdentityKey aliceIdentityKey = new IdentityKey(aliceKeyPair.getPublicKey()); IdentityKey bobIdentityKey = new IdentityKey(bobKeyPair.getPublicKey()); NumericFingerprintGenerator generator = new NumericFingerprintGenerator(1024); Fingerprint aliceFingerprint = generator.createFor(VERSION_1, "+14152222222".getBytes(), aliceIdentityKey, "+14153333333".getBytes(), bobIdentityKey); Fingerprint bobFingerprint = generator.createFor(VERSION_1, "+14153333333".getBytes(), bobIdentityKey, "+14152222222".getBytes(), aliceIdentityKey); assertEquals(aliceFingerprint.getDisplayableFingerprint().getDisplayText(), bobFingerprint.getDisplayableFingerprint().getDisplayText()); assertTrue(aliceFingerprint.getScannableFingerprint().compareTo(bobFingerprint.getScannableFingerprint().getSerialized())); assertTrue(bobFingerprint.getScannableFingerprint().compareTo(aliceFingerprint.getScannableFingerprint().getSerialized())); assertEquals(aliceFingerprint.getDisplayableFingerprint().getDisplayText().length(), 60); }
Example #20
Source File: SessionBuilder.java From Silence with GNU General Public License v3.0 | 6 votes |
/** * Initiate a new session by sending an initial KeyExchangeMessage to the recipient. * * @return the KeyExchangeMessage to deliver. */ public KeyExchangeMessage process() { synchronized (SessionCipher.SESSION_LOCK) { try { int sequence = KeyHelper.getRandomSequence(65534) + 1; int flags = KeyExchangeMessage.INITIATE_FLAG; ECKeyPair baseKey = Curve.generateKeyPair(); ECKeyPair ratchetKey = Curve.generateKeyPair(); IdentityKeyPair identityKey = identityKeyStore.getIdentityKeyPair(); byte[] baseKeySignature = Curve.calculateSignature(identityKey.getPrivateKey(), baseKey.getPublicKey().serialize()); SessionRecord sessionRecord = sessionStore.loadSession(remoteAddress); sessionRecord.getSessionState().setPendingKeyExchange(sequence, baseKey, ratchetKey, identityKey); sessionStore.storeSession(remoteAddress, sessionRecord); return new KeyExchangeMessage(CiphertextMessage.CURRENT_VERSION, sequence, flags, baseKey.getPublicKey(), baseKeySignature, ratchetKey.getPublicKey(), identityKey.getPublicKey()); } catch (InvalidKeyException e) { throw new AssertionError(e); } } }
Example #21
Source File: AliceSignalProtocolParameters.java From libsignal-protocol-java with GNU General Public License v3.0 | 6 votes |
private AliceSignalProtocolParameters(IdentityKeyPair ourIdentityKey, ECKeyPair ourBaseKey, IdentityKey theirIdentityKey, ECPublicKey theirSignedPreKey, ECPublicKey theirRatchetKey, Optional<ECPublicKey> theirOneTimePreKey) { this.ourIdentityKey = ourIdentityKey; this.ourBaseKey = ourBaseKey; this.theirIdentityKey = theirIdentityKey; this.theirSignedPreKey = theirSignedPreKey; this.theirRatchetKey = theirRatchetKey; this.theirOneTimePreKey = theirOneTimePreKey; if (ourIdentityKey == null || ourBaseKey == null || theirIdentityKey == null || theirSignedPreKey == null || theirRatchetKey == null || theirOneTimePreKey == null) { throw new IllegalArgumentException("Null values!"); } }
Example #22
Source File: BobSignalProtocolParameters.java From libsignal-protocol-java with GNU General Public License v3.0 | 6 votes |
BobSignalProtocolParameters(IdentityKeyPair ourIdentityKey, ECKeyPair ourSignedPreKey, ECKeyPair ourRatchetKey, Optional<ECKeyPair> ourOneTimePreKey, IdentityKey theirIdentityKey, ECPublicKey theirBaseKey) { this.ourIdentityKey = ourIdentityKey; this.ourSignedPreKey = ourSignedPreKey; this.ourRatchetKey = ourRatchetKey; this.ourOneTimePreKey = ourOneTimePreKey; this.theirIdentityKey = theirIdentityKey; this.theirBaseKey = theirBaseKey; if (ourIdentityKey == null || ourSignedPreKey == null || ourRatchetKey == null || ourOneTimePreKey == null || theirIdentityKey == null || theirBaseKey == null) { throw new IllegalArgumentException("Null value!"); } }
Example #23
Source File: SymmetricSignalProtocolParameters.java From libsignal-protocol-java with GNU General Public License v3.0 | 6 votes |
SymmetricSignalProtocolParameters(ECKeyPair ourBaseKey, ECKeyPair ourRatchetKey, IdentityKeyPair ourIdentityKey, ECPublicKey theirBaseKey, ECPublicKey theirRatchetKey, IdentityKey theirIdentityKey) { this.ourBaseKey = ourBaseKey; this.ourRatchetKey = ourRatchetKey; this.ourIdentityKey = ourIdentityKey; this.theirBaseKey = theirBaseKey; this.theirRatchetKey = theirRatchetKey; this.theirIdentityKey = theirIdentityKey; if (ourBaseKey == null || ourRatchetKey == null || ourIdentityKey == null || theirBaseKey == null || theirRatchetKey == null || theirIdentityKey == null) { throw new IllegalArgumentException("Null values!"); } }
Example #24
Source File: AsymmetricMasterCipher.java From Silence with GNU General Public License v3.0 | 6 votes |
public String encryptBody(String body) { try { ECPublicKey theirPublic = asymmetricMasterSecret.getDjbPublicKey(); ECKeyPair ourKeyPair = Curve.generateKeyPair(); byte[] secret = Curve.calculateAgreement(theirPublic, ourKeyPair.getPrivateKey()); MasterCipher masterCipher = getMasterCipherForSecret(secret); byte[] encryptedBodyBytes = masterCipher.encryptBytes(body.getBytes()); PublicKey ourPublicKey = new PublicKey(31337, ourKeyPair.getPublicKey()); byte[] publicKeyBytes = ourPublicKey.serialize(); byte[] combined = Util.combine(publicKeyBytes, encryptedBodyBytes); return Base64.encodeBytes(combined); } catch (InvalidKeyException e) { throw new AssertionError(e); } }
Example #25
Source File: SessionCipher.java From libsignal-protocol-java with GNU General Public License v3.0 | 6 votes |
private ChainKey getOrCreateChainKey(SessionState sessionState, ECPublicKey theirEphemeral) throws InvalidMessageException { try { if (sessionState.hasReceiverChain(theirEphemeral)) { return sessionState.getReceiverChainKey(theirEphemeral); } else { RootKey rootKey = sessionState.getRootKey(); ECKeyPair ourEphemeral = sessionState.getSenderRatchetKeyPair(); Pair<RootKey, ChainKey> receiverChain = rootKey.createChain(theirEphemeral, ourEphemeral); ECKeyPair ourNewEphemeral = Curve.generateKeyPair(); Pair<RootKey, ChainKey> senderChain = receiverChain.first().createChain(theirEphemeral, ourNewEphemeral); sessionState.setRootKey(senderChain.first()); sessionState.addReceiverChain(theirEphemeral, receiverChain.second()); sessionState.setPreviousCounter(Math.max(sessionState.getSenderChainKey().getIndex()-1, 0)); sessionState.setSenderChain(ourNewEphemeral, senderChain.second()); return receiverChain.second(); } } catch (InvalidKeyException e) { throw new InvalidMessageException(e); } }
Example #26
Source File: ProvisioningCipher.java From mollyim-android with GNU General Public License v3.0 | 6 votes |
public byte[] encrypt(ProvisionMessage message) throws InvalidKeyException { ECKeyPair ourKeyPair = Curve.generateKeyPair(); byte[] sharedSecret = Curve.calculateAgreement(theirPublicKey, ourKeyPair.getPrivateKey()); byte[] derivedSecret = new HKDFv3().deriveSecrets(sharedSecret, "TextSecure Provisioning Message".getBytes(), 64); byte[][] parts = Util.split(derivedSecret, 32, 32); byte[] version = {0x01}; byte[] ciphertext = getCiphertext(parts[0], message.toByteArray()); byte[] mac = getMac(parts[1], Util.join(version, ciphertext)); byte[] body = Util.join(version, ciphertext, mac); return ProvisionEnvelope.newBuilder() .setPublicKey(ByteString.copyFrom(ourKeyPair.getPublicKey().serialize())) .setBody(ByteString.copyFrom(body)) .build() .toByteArray(); }
Example #27
Source File: OneTimePreKeyDatabase.java From mollyim-android with GNU General Public License v3.0 | 6 votes |
public @Nullable PreKeyRecord getPreKey(int keyId) { SQLiteDatabase database = databaseHelper.getReadableDatabase(); try (Cursor cursor = database.query(TABLE_NAME, null, KEY_ID + " = ?", new String[] {String.valueOf(keyId)}, null, null, null)) { if (cursor != null && cursor.moveToFirst()) { try { ECPublicKey publicKey = Curve.decodePoint(Base64.decode(cursor.getString(cursor.getColumnIndexOrThrow(PUBLIC_KEY))), 0); ECPrivateKey privateKey = Curve.decodePrivatePoint(Base64.decode(cursor.getString(cursor.getColumnIndexOrThrow(PRIVATE_KEY)))); return new PreKeyRecord(keyId, new ECKeyPair(publicKey, privateKey)); } catch (InvalidKeyException | IOException e) { Log.w(TAG, e); } } } return null; }
Example #28
Source File: SessionState.java From libsignal-protocol-java with GNU General Public License v3.0 | 5 votes |
public ECKeyPair getPendingKeyExchangeBaseKey() throws InvalidKeyException { ECPublicKey publicKey = Curve.decodePoint(sessionStructure.getPendingKeyExchange() .getLocalBaseKey().toByteArray(), 0); ECPrivateKey privateKey = Curve.decodePrivatePoint(sessionStructure.getPendingKeyExchange() .getLocalBaseKeyPrivate() .toByteArray()); return new ECKeyPair(publicKey, privateKey); }
Example #29
Source File: SessionState.java From libsignal-protocol-java with GNU General Public License v3.0 | 5 votes |
public ECKeyPair getPendingKeyExchangeRatchetKey() throws InvalidKeyException { ECPublicKey publicKey = Curve.decodePoint(sessionStructure.getPendingKeyExchange() .getLocalRatchetKey().toByteArray(), 0); ECPrivateKey privateKey = Curve.decodePrivatePoint(sessionStructure.getPendingKeyExchange() .getLocalRatchetKeyPrivate() .toByteArray()); return new ECKeyPair(publicKey, privateKey); }
Example #30
Source File: RatchetingSession.java From libsignal-protocol-java with GNU General Public License v3.0 | 5 votes |
public static void initializeSession(SessionState sessionState, SymmetricSignalProtocolParameters parameters) throws InvalidKeyException { if (isAlice(parameters.getOurBaseKey().getPublicKey(), parameters.getTheirBaseKey())) { AliceSignalProtocolParameters.Builder aliceParameters = AliceSignalProtocolParameters.newBuilder(); aliceParameters.setOurBaseKey(parameters.getOurBaseKey()) .setOurIdentityKey(parameters.getOurIdentityKey()) .setTheirRatchetKey(parameters.getTheirRatchetKey()) .setTheirIdentityKey(parameters.getTheirIdentityKey()) .setTheirSignedPreKey(parameters.getTheirBaseKey()) .setTheirOneTimePreKey(Optional.<ECPublicKey>absent()); RatchetingSession.initializeSession(sessionState, aliceParameters.create()); } else { BobSignalProtocolParameters.Builder bobParameters = BobSignalProtocolParameters.newBuilder(); bobParameters.setOurIdentityKey(parameters.getOurIdentityKey()) .setOurRatchetKey(parameters.getOurRatchetKey()) .setOurSignedPreKey(parameters.getOurBaseKey()) .setOurOneTimePreKey(Optional.<ECKeyPair>absent()) .setTheirBaseKey(parameters.getTheirBaseKey()) .setTheirIdentityKey(parameters.getTheirIdentityKey()); RatchetingSession.initializeSession(sessionState, bobParameters.create()); } }