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

org.signal.libsignal.metadata.certificate.SenderCertificate Maven / Gradle / Ivy

package org.signal.libsignal.metadata.certificate;


import com.google.protobuf.InvalidProtocolBufferException;

import org.signal.libsignal.metadata.SignalProtos;
import org.whispersystems.libsignal.InvalidKeyException;
import org.whispersystems.libsignal.ecc.Curve;
import org.whispersystems.libsignal.ecc.ECPublicKey;
import org.whispersystems.libsignal.util.guava.Optional;


public class SenderCertificate {

  private final ServerCertificate signer;
  private final ECPublicKey       key;
  private final int               senderDeviceId;
  private final Optional  senderUuid;
  private final Optional  senderE164;
  private final long              expiration;

  private final byte[] serialized;
  private final byte[] certificate;
  private final byte[] signature;

  public SenderCertificate(byte[] serialized) throws InvalidCertificateException {
    try {
      SignalProtos.SenderCertificate wrapper = SignalProtos.SenderCertificate.parseFrom(serialized);

      if (!wrapper.hasSignature() || !wrapper.hasCertificate()) {
        throw new InvalidCertificateException("Missing fields");
      }

      SignalProtos.SenderCertificate.Certificate certificate = SignalProtos.SenderCertificate.Certificate.parseFrom(wrapper.getCertificate());

      if (!certificate.hasSigner()       ||
          !certificate.hasIdentityKey()  ||
          !certificate.hasSenderDevice() ||
          !certificate.hasExpires()      ||
          (!certificate.hasSenderUuid() && !certificate.hasSenderE164()))
      {
        throw new InvalidCertificateException("Missing fields");
      }

      this.signer         = new ServerCertificate(certificate.getSigner().toByteArray());
      this.key            = Curve.decodePoint(certificate.getIdentityKey().toByteArray(), 0);
      this.senderUuid     = certificate.hasSenderUuid() ? Optional.of(certificate.getSenderUuid()) : Optional.absent();
      this.senderE164     = certificate.hasSenderE164() ? Optional.of(certificate.getSenderE164()) : Optional.absent();
      this.senderDeviceId = certificate.getSenderDevice();
      this.expiration     = certificate.getExpires();

      this.serialized  = serialized;
      this.certificate = wrapper.getCertificate().toByteArray();
      this.signature   = wrapper.getSignature().toByteArray();

    } catch (InvalidProtocolBufferException | InvalidKeyException e) {
      throw new InvalidCertificateException(e);
    }
  }

  public ServerCertificate getSigner() {
    return signer;
  }

  public ECPublicKey getKey() {
    return key;
  }

  public int getSenderDeviceId() {
    return senderDeviceId;
  }

  public Optional getSenderUuid() {
    return senderUuid;
  }

  public Optional getSenderE164() {
    return senderE164;
  }

  public String getSender() {
    return senderE164.or(senderUuid).orNull();
  }

  public long getExpiration() {
    return expiration;
  }

  public byte[] getSerialized() {
    return serialized;
  }

  public byte[] getCertificate() {
    return certificate;
  }

  public byte[] getSignature() {
    return signature;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy