function sign($packet, $hash = 'SHA256', $keyid = NULL)
{
if (!is_object($packet)) {
if ($this->key) {
$packet = new OpenPGP_LiteralDataPacket($packet);
} else {
$packet = OpenPGP_Message::parse($packet);
}
}
if ($packet instanceof OpenPGP_SecretKeyPacket || $packet instanceof Crypt_RSA || $packet instanceof ArrayAccess && $packet[0] instanceof OpenPGP_SecretKeyPacket) {
$key = $packet;
$message = $this->message;
} else {
$key = $this->key;
$message = $packet;
}
if (!$key || !$message) {
return NULL;
}
// Missing some data
if ($message instanceof OpenPGP_Message) {
list($dummy, $message) = $message->signature_and_data();
}
if (!$key instanceof Crypt_RSA) {
$key = new self($key);
if (!$keyid) {
$keyid = substr($key->key()->fingerprint, -16, 16);
}
$key = $key->private_key($keyid);
}
$key->setHash(strtolower($hash));
$sig = new OpenPGP_SignaturePacket($message, 'RSA', strtoupper($hash));
$sig->hashed_subpackets[] = new OpenPGP_SignaturePacket_IssuerPacket($keyid);
$sig->sign_data(array('RSA' => array($hash => array($key, 'sign'))));
return new OpenPGP_Message(array($sig, $message));
}