public byte[] getRemotePublicKey() throws CryptoManagerException {

    if (remotePubKey == null) {

      throw (new CryptoManagerException("key not yet available"));
    }

    return (CryptoECCUtils.keyToRawdata(remotePubKey));
  }
  public void getMessage(ByteBuffer buffer, boolean keys) throws CryptoManagerException {

    // System.out.println( "get( " + keys + ") " + this );

    try {
      putInt(buffer, VERSION, 255);

      SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

      Signature sig = CryptoECCUtils.getSignature(myPrivateKey);

      if (keys) {

        final byte[] rawMyPubkey = CryptoECCUtils.keyToRawdata(myPublicKey);

        final byte[] rawEphemeralPubkey = CryptoECCUtils.keyToRawdata(ephemeralKeyPair.getPublic());

        sig.update(rawMyPubkey);

        sig.update(rawEphemeralPubkey);

        final byte[] rawSign = sig.sign();

        final byte[] pad = new byte[random.nextInt(32)];

        random.nextBytes(pad);

        putBytes(buffer, rawMyPubkey, 65535);

        putBytes(buffer, rawEphemeralPubkey, 65535);

        putBytes(buffer, rawSign, 65535);

        putBytes(buffer, pad, 65535);

      } else {

        if (sharedSecret == null) {

          throw (new CryptoManagerException("phase error: keys not received"));
        }

        final byte[] IV = new byte[20 + random.nextInt(32)];

        random.nextBytes(IV);

        sig.update(IV);

        sig.update(sharedSecret);

        final byte[] rawSig = sig.sign();

        putBytes(buffer, IV, 65535);

        putBytes(buffer, rawSig, 65535);
      }
    } catch (CryptoManagerException e) {

      throw (e);

    } catch (Throwable e) {

      throw (new CryptoManagerException("Failed to generate message"));
    }
  }