/** */ 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'])); } }