function decrypt($packet)
{
if (!is_object($packet)) {
$packet = OpenPGP_Message::parse($packet);
}
if ($packet instanceof OpenPGP_SecretKeyPacket || $packet instanceof Crypt_RSA || $packet instanceof ArrayAccess && $packet[0] instanceof OpenPGP_SecretKeyPacket) {
$keys = $packet;
$message = $this->message;
} else {
$keys = $this->key;
$message = $packet;
}
if (!$keys || !$message) {
return NULL;
}
// Missing some data
if (!$keys instanceof Crypt_RSA) {
$keys = new self($keys);
}
foreach ($message as $p) {
if ($p instanceof OpenPGP_AsymmetricSessionKeyPacket) {
if ($keys instanceof Crypt_RSA) {
$sk = self::try_decrypt_session($keys, substr($p->encyrpted_data, 2));
} else {
if (strlen(str_replace('0', '', $p->keyid)) < 1) {
foreach ($keys->key as $k) {
$sk = self::try_decrypt_session(self::convert_private_key($k), substr($p->encyrpted_data, 2));
if ($sk) {
break;
}
}
} else {
$key = $keys->private_key($p->keyid);
$sk = self::try_decrypt_session($key, substr($p->encrypted_data, 2));
}
}
if (!$sk) {
continue;
}
$r = OpenPGP_Crypt_Symmetric::decryptPacket(OpenPGP_Crypt_Symmetric::getEncryptedData($message), $sk[0], $sk[1]);
if ($r) {
return $r;
}
}
}
return NULL;
/* Failed */
}