/**
  * Return a new instance of task result represented by a task id and its exception.
  *
  * @param id the identification of the task that send this result.
  * @param exception the exception that occurred in the task.
  * @param output the output of the task.
  * @param execDuration the execution duration of the task itself
  * @param propagatedProperties the map of all properties that has been propagated through
  *     Exporter.propagateProperty
  */
 public TaskResultImpl(
     TaskId id,
     Throwable exception,
     TaskLogs output,
     long execDuration,
     Map<String, BigString> propagatedProperties) {
   this(id, output);
   this.taskDuration = execDuration;
   this.exception = exception;
   this.propagatedProperties = propagatedProperties;
   try {
     // try to serialize the user exception
     this.serializedException = ObjectToByteConverter.ObjectStream.convert(exception);
   } catch (IOException ioe2) {
     // cannot serialize the exception
     logger.error("", ioe2);
     try {
       // serialize a NotSerializableException with the cause message
       this.serializedException =
           ObjectToByteConverter.ObjectStream.convert(
               new NotSerializableException(ioe2.getMessage()));
     } catch (IOException ioe3) {
       // this should not append as the NotSerializableException is serializable and
       // the given argument is a string (also serializable)
       logger.error("", ioe3);
     }
   }
 }
  /**
   * Creates new encrypted credentials
   *
   * <p>Encrypts the message '<code>login</code>:<code>password</code>' using the public key <code>
   * pubKey</code> and <code>cipher</code> and store it in a new Credentials object.
   *
   * @see KeyPairUtil#encrypt(String, String, String, byte[])
   * @param login the login to encrypt
   * @param password the corresponding password to encrypt
   * @param pubKey public key used for encryption
   * @param cipher cipher parameters: combination of transformations
   * @return the Credentials object containing the encrypted data
   * @throws KeyException key generation or encryption failed
   */
  @Deprecated
  public static Credentials createCredentials(
      String login, String password, byte[] datakey, PublicKey pubKey, String cipher)
      throws KeyException {

    CredData cc = new CredData();
    cc.setLogin(CredData.parseLogin(login));
    cc.setDomain(CredData.parseDomain(login));
    cc.setPassword(password);
    cc.setKey(datakey);

    // serialize clear credentials to byte array
    byte[] clearCred = null;
    try {
      clearCred = ObjectToByteConverter.ObjectStream.convert(cc);
    } catch (IOException e1) {
      throw new KeyException(e1.getMessage());
    }

    int size = -1;
    if (pubKey instanceof java.security.interfaces.RSAPublicKey) {
      size = ((RSAPublicKey) pubKey).getModulus().bitLength();
    } else if (pubKey instanceof java.security.interfaces.DSAPublicKey) {
      size = ((DSAPublicKey) pubKey).getParams().getP().bitLength();
    } else if (pubKey instanceof javax.crypto.interfaces.DHPublicKey) {
      size = ((DHPublicKey) pubKey).getParams().getP().bitLength();
    }

    // generate symmetric key
    SecretKey aesKey = KeyUtil.generateKey(AES_ALGO, AES_KEYSIZE);

    byte[] encData = null;
    byte[] encAes = null;

    // encrypt AES key with public RSA key
    try {
      encAes = KeyPairUtil.encrypt(pubKey, size, cipher, aesKey.getEncoded());
    } catch (KeyException e) {
      throw new KeyException("Symmetric key encryption failed", e);
    }

    // encrypt clear credentials with AES key
    try {
      encData = KeyUtil.encrypt(aesKey, AES_CIPHER, clearCred);
    } catch (KeyException e) {
      throw new KeyException("Message encryption failed", e);
    }

    Credentials cred = new Credentials(pubKey.getAlgorithm(), size, cipher, encAes, encData);
    return cred;
  }