/**
*/
public function sign($text, $key, $mode, $opts = array())
{
$rsa = new OpenPGP_Crypt_RSA($key->message);
$pkey = $rsa->key();
$text = $this->_getMessageOb($text)->packets[0];
switch ($pkey->algorithm) {
case 1:
case 2:
case 3:
// RSA
$hash = $opts['sign_hash'] ?: 'SHA256';
$result = $rsa->sign($text, $hash);
break;
case 17:
// DSA; use SHA1 by default, since that is what DSA/DSS was
// designed for.
$hash = $opts['sign_hash'] ?: 'SHA1';
$sig = new OpenPGP_SignaturePacket($text, 'DSA', $hash);
$sig->hashed_subpackets[] = new OpenPGP_SignaturePacket_IssuerPacket(substr($pkey->fingerprint, -16));
$dsa = new Horde_Pgp_Crypt_DSA($pkey);
$sig->sign_data(array('DSA' => array($hash => function ($data) use($dsa, $hash) {
return $dsa->sign($data, $hash);
})));
$result = new OpenPGP_Message(array($sig, $text));
break;
}
switch ($mode) {
case 'clear':
$sm = new Horde_Pgp_Element_SignedMessage(new OpenPGP_Message(array($result[1], $result[0])));
$sm->headers['Hash'] = $hash;
return $sm;
case 'detach':
foreach ($result as $val) {
if ($val instanceof OpenPGP_SignaturePacket) {
return new Horde_Pgp_Element_Signature(new OpenPGP_Message(array($val)));
}
}
break;
case 'message':
return new Horde_Pgp_Element_Message($this->_compressMessageOb($result, $opts['compress']));
}
}