All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.signal.internal.Native Maven / Gradle / Ivy

//
// Copyright (C) 2020 Signal Messenger, LLC.
// All rights reserved.
//
// SPDX-License-Identifier: GPL-3.0-only
//

package org.signal.client.internal;

import org.whispersystems.libsignal.protocol.CiphertextMessage;
import org.whispersystems.libsignal.state.IdentityKeyStore;
import org.whispersystems.libsignal.state.SessionStore;
import org.whispersystems.libsignal.state.PreKeyStore;
import org.whispersystems.libsignal.state.SignedPreKeyStore;
import org.whispersystems.libsignal.groups.state.SenderKeyStore;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;

public final class Native {
  private static void copyToTempFileAndLoad(InputStream in, String extension) throws IOException {
    File tempFile = Files.createTempFile("resource", extension).toFile();
    tempFile.deleteOnExit();

    try (OutputStream out = new FileOutputStream(tempFile)) {
      byte[] buffer = new byte[4096];
      int read;

      while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
      }
    }
    System.load(tempFile.getAbsolutePath());
  }

  /*
  If a .so and/or .dylib is embedded within this jar as a resource file, attempt
  to copy it to a temporary file and then load it. This allows the jar to be
  used even without a libsignal_jni shared library existing on the filesystem.
  */
  private static void loadLibrary() {
    try {
      String  osName    = System.getProperty("os.name").toLowerCase(java.util.Locale.ROOT);
      boolean isMacOs   = osName.startsWith("mac os");
      String  extension = isMacOs ? ".dylib" : ".so";

      try (InputStream in = Native.class.getResourceAsStream("/libsignal_jni" + extension)) {
        if (in != null) {
          copyToTempFileAndLoad(in, extension);
        } else {
          System.loadLibrary("signal_jni");
        }
      }
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  static {
    loadLibrary();
  }

  private Native() {}

  public static native byte[] HKDF_DeriveSecrets(int version, byte[] inputKeyMaterial,
                                                  byte[] salt, byte[] info, int outputLength);

  public static native long ECPublicKey_Deserialize(byte[] data, int offset);
  public static native byte[] ECPublicKey_Serialize(long handle);
  public static native byte[] ECPublicKey_GetPublicKeyBytes(long handle);
  public static native int ECPublicKey_Compare(long handle1, long handle2);
  public static native boolean ECPublicKey_Verify(long handle, byte[] message, byte[] signature);
  public static native void ECPublicKey_Destroy(long handle);

  public static native long ECPrivateKey_Generate();
  public static native long ECPrivateKey_Deserialize(byte[] data);
  public static native byte[] ECPrivateKey_Serialize(long handle);
  public static native byte[] ECPrivateKey_Sign(long handle, byte[] message);
  public static native byte[] ECPrivateKey_Agree(long handle, long pubkey_handle);
  public static native long ECPrivateKey_GetPublicKey(long handle);
  public static native void ECPrivateKey_Destroy(long handle);

  public static native byte[] IdentityKeyPair_Serialize(long pubHandle, long privHandle);

  public static native long NumericFingerprintGenerator_New(int iterations, int version, byte[] localIdentifier, byte[] localKey, byte[] remoteIdentifier, byte[] remoteKey);
  public static native String NumericFingerprintGenerator_GetDisplayString(long handle);
  public static native byte[] NumericFingerprintGenerator_GetScannableEncoding(long handle);
  public static native void NumericFingerprintGenerator_Destroy(long handle);
  public static native String DisplayableFingerprint_Format(byte[] localFingerprint, byte[] remoteFingerprint);
  public static native boolean ScannableFingerprint_Compare(byte[] ourFingerprint, byte[] scannedFingerprint);

  public static native long ProtocolAddress_New(String name, int device_id);
  public static native long ProtocolAddress_Destroy(long handle);
  public static native String ProtocolAddress_Name(long handle);
  public static native int ProtocolAddress_DeviceId(long handle);

  public static native long SignedPreKeyRecord_New(int id, long timestamp, long pubKeyHandle, long privKeyHandle, byte[] signature);
  public static native long SignedPreKeyRecord_Deserialize(byte[] serialized);
  public static native void SignedPreKeyRecord_Destroy(long handle);
  public static native int SignedPreKeyRecord_GetId(long handle);
  public static native long SignedPreKeyRecord_GetTimestamp(long handle);
  public static native long SignedPreKeyRecord_GetPublicKey(long handle);
  public static native long SignedPreKeyRecord_GetPrivateKey(long handle);
  public static native byte[] SignedPreKeyRecord_GetSignature(long handle);
  public static native byte[] SignedPreKeyRecord_GetSerialized(long handle);

  public static native byte[] SessionState_InitializeAliceSession(long identityKeyPrivateHandle,
                                                                  long identityKeyPublicHandle,
                                                                  long baseKeyPrivateHandle,
                                                                  long baseKeyPublicKeyHandle,
                                                                  long theirIdentityKeyPublicHandle,
                                                                  long theirSignedPreKeyPublicHandle,
                                                                  long theirRatchetKeyPublicHandle);

  public static native byte[] SessionState_InitializeBobSession(long identityKeyPrivateHandle,
                                                                long identityKeyPublicHandle,
                                                                long signedPreKeyPrivateHandle,
                                                                long signedPreKeyPublicKeyHandle,
                                                                long ephemeralKeyPrivateHandle,
                                                                long ephemeralKeyPublicHandle,
                                                                long theirIdentityKeyPublicHandle,
                                                                long theirBaseKeyPublicHandle);

  public static native long PreKeyBundle_New(int registrationId, int deviceId, int preKeyId, long preKeyPublicHandle,
                                             int signedPreKeyId, long signedPreKeyPublicHandle, byte[] signedPreKeySignature, long identityKeyHandle);
  public static native void PreKeyBundle_Destroy(long handle);
  public static native int PreKeyBundle_GetRegistrationId(long handle);
  public static native int PreKeyBundle_GetDeviceId(long handle);
  public static native int PreKeyBundle_GetPreKeyId(long handle);
  public static native int PreKeyBundle_GetSignedPreKeyId(long handle);
  public static native long PreKeyBundle_GetPreKeyPublic(long handle);
  public static native long PreKeyBundle_GetSignedPreKeyPublic(long handle);
  public static native byte[] PreKeyBundle_GetSignedPreKeySignature(long handle);
  public static native long PreKeyBundle_GetIdentityKey(long handle);

  public static native long PreKeyRecord_New(int id, long pubKeyHandle, long privKeyHandle);
  public static native long PreKeyRecord_Deserialize(byte[] serialized);
  public static native void PreKeyRecord_Destroy(long handle);
  public static native int PreKeyRecord_GetId(long handle);
  public static native long PreKeyRecord_GetPublicKey(long handle);
  public static native long PreKeyRecord_GetPrivateKey(long handle);
  public static native byte[] PreKeyRecord_GetSerialized(long handle);

  public static native CiphertextMessage SessionCipher_EncryptMessage(byte[] message, long remoteAddressHandle, SessionStore sessionStore, IdentityKeyStore identityKeyStore);
  public static native byte[] SessionCipher_DecryptSignalMessage(long signalMessageHandle, long remoteAddressHandle, SessionStore sessionStore, IdentityKeyStore identityKeyStore);
  public static native byte[] SessionCipher_DecryptPreKeySignalMessage(long preKeySignalMessageHandle, long remoteAddressHandle, SessionStore sessionStore,
                                                                       IdentityKeyStore identityKeyStore, PreKeyStore preKeyStore, SignedPreKeyStore signedPreKeyStore);

  public static native void SessionBuilder_ProcessPreKeyBundle(long preKeyBundleHandle,
                                                               long remoteAddressHandle,
                                                               SessionStore sessionStore,
                                                               IdentityKeyStore identityKeyStore);

  public static native long GroupSessionBuilder_CreateSenderKeyDistributionMessage(long senderKeyNameHandle,
                                                                SenderKeyStore senderKeyStore);
  public static native void GroupSessionBuilder_ProcessSenderKeyDistributionMessage(long senderKeyNameHandle,
                                                                 long senderKeyDistributionMessageHandle,
                                                                 SenderKeyStore senderKeyStore);

  public static native byte[] GroupCipher_EncryptMessage(long senderKeyNameHandle, byte[] paddedPlaintext, SenderKeyStore senderKeyStore);
  public static native byte[] GroupCipher_DecryptMessage(long senderKeyNameHandle, byte[] ciphertext, SenderKeyStore senderKeyStore);

  public static native long SignalMessage_Deserialize(byte[] serialized);
  public static native long SignalMessage_New(int messageVersion,
                                              byte[] macKey,
                                              long senderRatchetKeyHandle,
                                              int counter,
                                              int previousCounter,
                                              byte[] ciphertext,
                                              long senderIdentityKeyHandle,
                                              long receiverIdentityKeyHandle);
  public static native void SignalMessage_Destroy(long handle);
  public static native byte[] SignalMessage_GetSenderRatchetKey(long handle);
  public static native int SignalMessage_GetMessageVersion(long handle);
  public static native int SignalMessage_GetCounter(long handle);
  public static native byte[] SignalMessage_GetBody(long handle);
  public static native byte[] SignalMessage_GetSerialized(long handle);
  public static native boolean SignalMessage_VerifyMac(long messageHandle, long senderIdentityKeyHandle, long receiverIdentityKeyHandle, byte[] macKey);

  public static native long PreKeySignalMessage_Deserialize(byte[] serialized);
  public static native long PreKeySignalMessage_New(int messageVersion,
                                                    int registrationId,
                                                    int preKeyId,
                                                    int signedPreKeyId,
                                                    long baseKeyHandle,
                                                    long identityKeyHandle,
                                                    long signalMessageHandle);

  public static native void PreKeySignalMessage_Destroy(long handle);
  public static native int PreKeySignalMessage_GetVersion(long handle);
  public static native int PreKeySignalMessage_GetRegistrationId(long handle);
  public static native int PreKeySignalMessage_GetPreKeyId(long handle);
  public static native int PreKeySignalMessage_GetSignedPreKeyId(long handle);
  public static native byte[] PreKeySignalMessage_GetBaseKey(long handle);
  public static native byte[] PreKeySignalMessage_GetIdentityKey(long handle);
  public static native byte[] PreKeySignalMessage_GetSignalMessage(long handle);
  public static native byte[] PreKeySignalMessage_GetSerialized(long handle);

  public static native long SenderKeyName_New(String groupid, String senderName, int senderDeviceId);
  public static native void SenderKeyName_Destroy(long handle);
  public static native String SenderKeyName_GetSenderName(long handle);
  public static native int SenderKeyName_GetSenderDeviceId(long handle);
  public static native String SenderKeyName_GetGroupId(long handle);

  public static native long SenderKeyState_New(int id, int iteration, byte[] chainKey, long signaturePublicHandle, long signaturePrivateHandle);
  public static native void SenderKeyState_Destroy(long handle);
  public static native long SenderKeyState_Deserialize(byte[] serialized);
  public static native byte[] SenderKeyState_GetSerialized(long handle);

  public static native long SenderKeyMessage_Deserialize(byte[] serialized);
  public static native long SenderKeyMessage_New(int keyId, int iteration, byte[] ciphertext, long pkHandle);
  public static native void SenderKeyMessage_Destroy(long handle);
  public static native int SenderKeyMessage_GetKeyId(long handle);
  public static native int SenderKeyMessage_GetIteration(long handle);
  public static native byte[] SenderKeyMessage_GetCipherText(long handle);
  public static native byte[] SenderKeyMessage_GetSerialized(long handle);
  public static native boolean SenderKeyMessage_VerifySignature(long handle, long pkHandle);

  public static native long SenderKeyDistributionMessage_Deserialize(byte[] data);
  public static native long SenderKeyDistributionMessage_New(int id, int iteration, byte[] chainkey, long pkHandle);
  public static native long SenderKeyDistributionMessage_Destroy(long handle);
  public static native int SenderKeyDistributionMessage_GetIteration(long handle);
  public static native int SenderKeyDistributionMessage_GetId(long handle);
  public static native byte[] SenderKeyDistributionMessage_GetChainKey(long handle);
  public static native byte[] SenderKeyDistributionMessage_GetSignatureKey(long handle);
  public static native byte[] SenderKeyDistributionMessage_GetSerialized(long handle);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy