package.xml 0000664 0001750 0001750 00000133434 12653673427 011326 0 ustar jan jan
* - http: (Horde_Http_Client) The HTTP client object to use. * - keyserver: (string) The public PGP keyserver to use. * - port: (integer) The public PGP keyserver port. **/ public function __construct($pgp, array $params = array()) { $this->_pgp = $pgp; $this->_http = (isset($params['http']) && ($params['http'] instanceof Horde_Http_Client)) ? $params['http'] : new Horde_Http_Client(); $this->_keyserver = isset($params['keyserver']) ? $params['keyserver'] : 'http://pool.sks-keyservers.net'; $this->_keyserver .= ':' . (isset($params['port']) ? $params['port'] : '11371'); } /** * Returns PGP public key data retrieved from a public keyserver. * * @param string $keyid The key ID of the PGP key. * * @return string The PGP public key. * @throws Horde_Crypt_Exception */ public function get($keyid) { /* Connect to the public keyserver. */ $url = $this->_createUrl('/pks/lookup', array( 'op' => 'get', 'search' => $this->_pgp->getKeyIDString($keyid) )); try { $output = $this->_http->get($url)->getBody(); } catch (Horde_Http_Exception $e) { throw new Horde_Crypt_Exception($e); } /* Grab PGP key from output. */ if (($start = strstr($output, '-----BEGIN'))) { $length = strpos($start, '-----END') + 34; return substr($start, 0, $length); } throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("Could not obtain public key from the keyserver.")); } /** * Sends a PGP public key to a public keyserver. * * @param string $pubkey The PGP public key * * @throws Horde_Crypt_Exception */ public function put($pubkey) { /* Get the key ID of the public key. */ $info = $this->_pgp->pgpPacketInformation($pubkey); /* See if the public key already exists on the keyserver. */ try { $this->get($info['keyid']); } catch (Horde_Crypt_Exception $e) { $pubkey = 'keytext=' . urlencode(rtrim($pubkey)); try { $this->_http->post( $this->_createUrl('/pks/add'), $pubkey, array( 'User-Agent: Horde Application Framework', 'Content-Type: application/x-www-form-urlencoded', 'Content-Length: ' . strlen($pubkey), 'Connection: close' ) ); } catch (Horde_Http_Exception $e) { throw new Horde_Crypt_Exception($e); } } throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("Key already exists on the public keyserver.")); } /** * Returns the first matching key ID for an email address from a public * keyserver. * * @param string $address The email address of the PGP key. * * @return string The PGP key ID. * @throws Horde_Crypt_Exception */ public function getKeyId($address) { $pubkey = null; /* Connect to the public keyserver. */ $url = $this->_createUrl('/pks/lookup', array( 'op' => 'index', 'options' => 'mr', 'search' => $address )); try { $output = $this->_http->get($url)->getBody(); } catch (Horde_Http_Exception $e) { throw new Horde_Crypt_Exception($e); } if (strpos($output, '-----BEGIN PGP PUBLIC KEY BLOCK') !== false) { $pubkey = $output; } elseif (strpos($output, 'pub:') !== false) { $output = explode("\n", $output); $keyids = $keyuids = array(); $curid = null; foreach ($output as $line) { if (substr($line, 0, 4) == 'pub:') { $line = explode(':', $line); /* Ignore invalid lines and expired keys. */ if (count($line) != 7 || (!empty($line[5]) && $line[5] <= time())) { continue; } $curid = $line[4]; $keyids[$curid] = $line[1]; } elseif (!is_null($curid) && substr($line, 0, 4) == 'uid:') { preg_match("/<([^>]+)>/", $line, $matches); $keyuids[$curid][] = $matches[1]; } } /* Remove keys without a matching UID. */ foreach ($keyuids as $id => $uids) { $match = false; foreach ($uids as $uid) { if ($uid == $address) { $match = true; break; } } if (!$match) { unset($keyids[$id]); } } /* Sort by timestamp to use the newest key. */ if (count($keyids)) { ksort($keyids); $pubkey = $this->get(array_pop($keyids)); } } if ($pubkey) { $sig = $this->_pgp->pgpPacketSignature($pubkey, $address); if (!empty($sig['keyid']) && (empty($sig['public_key']['expires']) || $sig['public_key']['expires'] > time())) { return substr($this->_pgp->getKeyIDString($sig['keyid']), 2); } } throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("Could not obtain public key from the keyserver.")); } /** * Create the URL for the keyserver. * * @param string $uri Action URI. * @param array $params List of parameters to add to URL. * * @return Horde_Url Keyserver URL. */ protected function _createUrl($uri, array $params = array()) { $url = new Horde_Url($this->_keyserver . $uri, true); return $url->add($params); } } Horde_Crypt-2.7.0/lib/Horde/Crypt/Pgp/Parse.php 0000664 0001750 0001750 00000017605 12653673426 017316 0 ustar jan jan * @category Horde * @copyright 2002-2016 Horde LLC * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1 * @package Crypt * @since 2.4.0 */ class Horde_Crypt_Pgp_Parse { /** * Armor Header Lines - From RFC 2440: * * An Armor Header Line consists of the appropriate header line text * surrounded by five (5) dashes ('-', 0x2D) on either side of the header * line text. The header line text is chosen based upon the type of data * that is being encoded in Armor, and how it is being encoded. * * All Armor Header Lines are prefixed with 'PGP'. * * The Armor Tail Line is composed in the same manner as the Armor Header * Line, except the string "BEGIN" is replaced by the string "END." */ /* Used for signed, encrypted, or compressed files. */ const ARMOR_MESSAGE = 1; /* Used for signed files. */ const ARMOR_SIGNED_MESSAGE = 2; /* Used for armoring public keys. */ const ARMOR_PUBLIC_KEY = 3; /* Used for armoring private keys. */ const ARMOR_PRIVATE_KEY = 4; /* Used for detached signatures, PGP/MIME signatures, and natures * following clearsigned messages. */ const ARMOR_SIGNATURE = 5; /* Regular text contained in an PGP message. */ const ARMOR_TEXT = 6; /** * Metadata names for data. */ const PGP_ARMOR = 'pgp_armor'; /* @since 2.5.0 */ const SIG_CHARSET = 'pgp_sig_charset'; const SIG_RAW = 'pgp_sig_raw'; /** * Strings in armor header lines used to distinguish between the different * types of PGP decryption/encryption. * * @var array */ protected $_armor = array( 'MESSAGE' => self::ARMOR_MESSAGE, 'SIGNED MESSAGE' => self::ARMOR_SIGNED_MESSAGE, 'PUBLIC KEY BLOCK' => self::ARMOR_PUBLIC_KEY, 'PRIVATE KEY BLOCK' => self::ARMOR_PRIVATE_KEY, 'SIGNATURE' => self::ARMOR_SIGNATURE ); /** * Parses a message into text and PGP components. * * @param mixed $text Either the text to parse or a Horde_Stream object. * * @return array An array with the parsed text, returned in blocks of * text corresponding to their actual order. Keys: *
* - data: (array) The data for each section. Each line has been * stripped of EOL characters. * - type: (integer) The type of data contained in block. Valid types * are the class ARMOR_* constants. **/ public function parse($text) { $data = array(); $temp = array( 'type' => self::ARMOR_TEXT ); if ($text instanceof Horde_Stream) { $stream = $text; $stream->rewind(); } else { $stream = new Horde_Stream_Temp(); $stream->add($text, true); } while (!$stream->eof()) { $val = rtrim($stream->getToChar("\n", false), "\r"); if ((strpos($val, '-----') === 0) && preg_match('/^-----(BEGIN|END) PGP ([^-]+)-----\s*$/', $val, $matches)) { if (isset($temp['data'])) { $data[] = $temp; } $temp = array(); if ($matches[1] == 'BEGIN') { $temp['type'] = $this->_armor[$matches[2]]; $temp['data'][] = $val; } elseif ($matches[1] == 'END') { $temp['type'] = self::ARMOR_TEXT; $data[count($data) - 1]['data'][] = $val; } } else { $temp['data'][] = $val; } } if (isset($temp['data']) && ((count($temp['data']) > 1) || !empty($temp['data'][0]))) { $data[] = $temp; } return $data; } /** * Parses an armored message into a Horde_Mime_Part object. * * @param mixed $text Either the text to parse or a Horde_Stream object. * * @return mixed Either null if no PGP data was found, or a * Horde_Mime_Part object. For detached signature data: * the full contents of the armored text (data + sig) is * contained in the SIG_RAW metadata, and the charset is * contained in the SIG_CHARSET metadata, within the * application/pgp-signature part. */ public function parseToPart($text, $charset = 'UTF-8') { $parts = $this->parse($text); if (empty($parts) || ((count($parts) == 1) && ($parts[0]['type'] == self::ARMOR_TEXT))) { return null; } $new_part = new Horde_Mime_Part(); $new_part->setType('multipart/mixed'); foreach ($parts as $val) { switch ($val['type']) { case self::ARMOR_TEXT: $part = new Horde_Mime_Part(); $part->setType('text/plain'); $part->setCharset($charset); $part->setContents(implode("\n", $val['data'])); $new_part->addPart($part); break; case self::ARMOR_PUBLIC_KEY: $part = new Horde_Mime_Part(); $part->setType('application/pgp-keys'); $part->setContents(implode("\n", $val['data'])); $new_part->addPart($part); break; case self::ARMOR_MESSAGE: $part = new Horde_Mime_Part(); $part->setType('multipart/encrypted'); $part->setMetadata(self::PGP_ARMOR, true); $part->setContentTypeParameter('protocol', 'application/pgp-encrypted'); $part1 = new Horde_Mime_Part(); $part1->setType('application/pgp-encrypted'); $part1->setContents("Version: 1\n"); $part2 = new Horde_Mime_Part(); $part2->setType('application/octet-stream'); $part2->setContents(implode("\n", $val['data'])); $part2->setDisposition('inline'); $part->addPart($part1); $part->addPart($part2); $new_part->addPart($part); break; case self::ARMOR_SIGNED_MESSAGE: if (($sig = current($parts)) && ($sig['type'] == self::ARMOR_SIGNATURE)) { $part = new Horde_Mime_Part(); $part->setType('multipart/signed'); // TODO: add micalg parameter $part->setContentTypeParameter('protocol', 'application/pgp-signature'); $part1 = new Horde_Mime_Part(); $part1->setType('text/plain'); $part1->setCharset($charset); $part1_data = implode("\n", $val['data']); $part1->setContents(substr($part1_data, strpos($part1_data, "\n\n") + 2)); $part2 = new Horde_Mime_Part(); $part2->setType('application/pgp-signature'); $part2->setContents(implode("\n", $sig['data'])); $part2->setMetadata(self::SIG_CHARSET, $charset); $part2->setMetadata(self::SIG_RAW, implode("\n", $val['data']) . "\n" . implode("\n", $sig['data'])); $part->addPart($part1); $part->addPart($part2); $new_part->addPart($part); next($parts); } } } return $new_part; } } Horde_Crypt-2.7.0/lib/Horde/Crypt/Exception.php 0000664 0001750 0001750 00000000744 12653673426 017450 0 ustar jan jan * @category Horde * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1 * @package Crypt */ class Horde_Crypt_Exception extends Horde_Exception_Wrapped { } Horde_Crypt-2.7.0/lib/Horde/Crypt/Pgp.php 0000664 0001750 0001750 00000100572 12653673426 016240 0 ustar jan jan * @author Jan Schneider
* Array Format: * ------------- * [public_key]/[secret_key] => Array * ( * [created] => Key creation - UNIX timestamp * [expires] => Key expiration - UNIX timestamp (0 = never expires) * [size] => Size of the key in bits * ) * * [keyid] => Key ID of the PGP data (if available) * 16-bit hex value * * [signature] => Array ( * [id{n}/'_SIGNATURE'] => Array ( * [name] => Full Name * [comment] => Comment * [email] => E-mail Address * [keyid] => 16-bit hex value * [created] => Signature creation - UNIX timestamp * [expires] => Signature expiration - UNIX timestamp * [micalg] => The hash used to create the signature * [sig_{hex}] => Array [details of a sig verifying the ID] ( * [created] => Signature creation - UNIX timestamp * [expires] => Signature expiration - UNIX timestamp * [keyid] => 16-bit hex value * [micalg] => The hash used to create the signature * ) * ) * ) ** * Each user ID will be stored in the array 'signature' and have data * associated with it, including an array for information on each * signature that has signed that UID. Signatures not associated with a * UID (e.g. revocation signatures and sub keys) will be stored under the * special keyword '_SIGNATURE'. */ public function pgpPacketInformation($pgpdata) { $this->_initDrivers(); foreach ($this->_backends as $val) { try { return $val->packetInfo($pgpdata); } catch (Horde_Crypt_Exception $e) {} } return array(); } /** * Returns all information on a PGP data block. * * @since Horde_Crypt 2.7.0 * @see pgpPacketInformation() * * @param string $pgpdata The PGP data block. * * @return array An array with information on the PGP data block. The * array contains one or more entries as returned from * pgpPacketInformation(). */ public function pgpPacketInformationMultiple($pgpdata) { $this->_initDrivers(); foreach ($this->_backends as $val) { try { return $val->packetInfoMultiple($pgpdata); } catch (Horde_Crypt_Exception $e) {} } return array(); } /** * Returns human readable information on a PGP key. * * @param string $pgpdata The PGP data block. * * @return string Tabular information on the PGP key. * @throws Horde_Crypt_Exception */ public function pgpPrettyKey($pgpdata) { $msg = ''; $fingerprints = $this->getFingerprintsFromKey($pgpdata); $info = $this->pgpPacketInformation($pgpdata); if (empty($info['signature'])) { return $msg; } /* Making the property names the same width for all localizations .*/ $leftrow = array( Horde_Crypt_Translation::t("Name"), Horde_Crypt_Translation::t("Key Type"), Horde_Crypt_Translation::t("Key Creation"), Horde_Crypt_Translation::t("Expiration Date"), Horde_Crypt_Translation::t("Key Length"), Horde_Crypt_Translation::t("Comment"), Horde_Crypt_Translation::t("E-Mail"), Horde_Crypt_Translation::t("Hash-Algorithm"), Horde_Crypt_Translation::t("Key ID"), Horde_Crypt_Translation::t("Key Fingerprint") ); array_walk( $leftrow, function (&$s, $k, $m) { $s .= ':' . str_repeat(' ', $m - Horde_String::length($s)); }, max(array_map('strlen', $leftrow)) + 2 ); foreach ($info['signature'] as $uid_idx => $val) { if ($uid_idx == '_SIGNATURE') { continue; } $key = $this->pgpPacketSignatureByUidIndex($pgpdata, $uid_idx); $keyid = empty($key['keyid']) ? null : $this->getKeyIDString($key['keyid']); $fingerprint = isset($fingerprints[$keyid]) ? $fingerprints[$keyid] : null; $sig_key = 'sig_' . $key['keyid']; $msg .= $leftrow[0] . (isset($key['name']) ? stripcslashes($key['name']) : '') . "\n" . $leftrow[1] . (($key['key_type'] == 'public_key') ? Horde_Crypt_Translation::t("Public Key") : Horde_Crypt_Translation::t("Private Key")) . "\n" . $leftrow[2] . strftime("%D", $val[$sig_key]['created']) . "\n" . $leftrow[3] . (empty($val[$sig_key]['expires']) ? '[' . Horde_Crypt_Translation::t("Never") . ']' : strftime("%D", $val[$sig_key]['expires'])) . "\n" . $leftrow[4] . $key['key_size'] . " Bytes\n" . $leftrow[5] . (empty($key['comment']) ? '[' . Horde_Crypt_Translation::t("None") . ']' : $key['comment']) . "\n" . $leftrow[6] . (empty($key['email']) ? '[' . Horde_Crypt_Translation::t("None") . ']' : $key['email']) . "\n" . $leftrow[7] . (empty($key['micalg']) ? '[' . Horde_Crypt_Translation::t("Unknown") . ']' : $key['micalg']) . "\n" . $leftrow[8] . (empty($keyid) ? '[' . Horde_Crypt_Translation::t("Unknown") . ']' : $keyid) . "\n" . $leftrow[9] . (empty($fingerprint) ? '[' . Horde_Crypt_Translation::t("Unknown") . ']' : $fingerprint) . "\n\n"; } return $msg; } /** * TODO * * @since 2.4.0 */ public function getKeyIDString($keyid) { /* Get the 8 character key ID string. */ if (strpos($keyid, '0x') === 0) { $keyid = substr($keyid, 2); } if (strlen($keyid) > 8) { $keyid = substr($keyid, -8); } return '0x' . $keyid; } /** * Returns only information on the first ID that matches the email address * input. * * @param string $pgpdata The PGP data block. * @param string $email An e-mail address. * * @return array An array with information on the PGP data block. If an * element is not present in the data block, it will * likewise not be set in the array. Array elements: * - comment: Comment * - created: Signature creation (UNIX timestamp) * - email: E-mail Address * - key_created: Key creation (UNIX timestamp) * - key_expires: Key expiration (UNIX timestamp; 0 = never expires) * - key_size: Size of the key in bits * - key_type: The key type (public_key or secret_key) * - keyid: 16-bit hex value * - micalg: The hash used to create the signature * - name: Full Name */ public function pgpPacketSignature($pgpdata, $email) { $data = $this->pgpPacketInformation($pgpdata); $out = array(); /* Check that [signature] key exists. */ if (!isset($data['signature'])) { return $out; } /* Store the signature information now. */ if (($email == '_SIGNATURE') && isset($data['signature']['_SIGNATURE'])) { foreach ($data['signature'][$email] as $key => $value) { $out[$key] = $value; } } else { $uid_idx = 1; while (isset($data['signature']['id' . $uid_idx])) { if ($data['signature']['id' . $uid_idx]['email'] == $email) { foreach ($data['signature']['id' . $uid_idx] as $key => $val) { $out[$key] = $val; } break; } ++$uid_idx; } } return $this->_pgpPacketSignature($data, $out); } /** * Returns information on a PGP signature embedded in PGP data. Similar * to pgpPacketSignature(), but returns information by unique User ID * Index (format id{n} where n is an integer of 1 or greater). * * @see pgpPacketSignature() * * @param string $pgpdata See pgpPacketSignature(). * @param string $uid_idx The UID index. * * @return array See pgpPacketSignature(). */ public function pgpPacketSignatureByUidIndex($pgpdata, $uid_idx) { $data = $this->pgpPacketInformation($pgpdata); return isset($data['signature'][$uid_idx]) ? $this->_pgpPacketSignature($data, $data['signature'][$uid_idx]) : array(); } /** * Adds some data to the pgpPacketSignature*() function array. * * @see pgpPacketSignature(). * * @param array $data See pgpPacketSignature(). * @param array $out The return array. * * @return array The return array. */ protected function _pgpPacketSignature($data, $out) { /* If empty, return now. */ if (empty($out)) { return $out; } $key_type = null; /* Store any public/private key information. */ if (isset($data['public_key'])) { $key_type = 'public_key'; } elseif (isset($data['secret_key'])) { $key_type = 'secret_key'; } if ($key_type) { $out['key_type'] = $key_type; if (isset($data[$key_type]['created'])) { $out['key_created'] = $data[$key_type]['created']; } if (isset($data[$key_type]['expires'])) { $out['key_expires'] = $data[$key_type]['expires']; } if (isset($data[$key_type]['size'])) { $out['key_size'] = $data[$key_type]['size']; } } return $out; } /** * Returns the key ID of the key used to sign a block of PGP data. * * @param string $text The PGP signed text block. * * @return string The key ID of the key used to sign $text, or null if * not found. */ public function getSignersKeyID($text) { $this->_initDrivers(); foreach ($this->_backends as $val) { try { return $val->getSignersKeyId($text); } catch (Horde_Crypt_Exception $e) {} } return null; } /** * Verify a passphrase for a given public/private keypair. * * @param string $public_key The user's PGP public key. * @param string $private_key The user's PGP private key. * @param string $passphrase The user's passphrase. * * @return boolean Returns true on valid passphrase, false on invalid * passphrase. * @throws Horde_Crypt_Exception */ public function verifyPassphrase($public_key, $private_key, $passphrase) { /* Get e-mail address of public key. */ $info = $this->pgpPacketInformation($public_key); if (!isset($info['signature']['id1']['email'])) { throw new Horde_Crypt_Exception( Horde_Crypt_Translation::t("Could not determine the recipient's e-mail address.") ); } /* Encrypt a test message. */ try { $result = $this->encrypt( 'Test', array( 'type' => 'message', 'pubkey' => $public_key, 'recips' => array( $info['signature']['id1']['email'] => $public_key ) ) ); } catch (Horde_Crypt_Exception $e) { return false; } /* Try to decrypt the message. */ try { $this->decrypt( $result, array( 'type' => 'message', 'pubkey' => $public_key, 'privkey' => $private_key, 'passphrase' => $passphrase ) ); } catch (Horde_Crypt_Exception $e) { return false; } return true; } /** * Sends a PGP public key to a public keyserver. * * @param string $pubkey The PGP public key * @param string $server The keyserver to use. * @param float $timeout The keyserver timeout. * * @throws Horde_Crypt_Exception */ public function putPublicKeyserver($pubkey, $server = self::KEYSERVER_PUBLIC, $timeout = self::KEYSERVER_TIMEOUT) { return $this->_getKeyserverOb($server)->put($pubkey); } /** * Returns the first matching key ID for an email address from a * public keyserver. * * @param string $address The email address of the PGP key. * @param string $server The keyserver to use. * @param float $timeout The keyserver timeout. * * @return string The PGP key ID. * @throws Horde_Crypt_Exception */ public function getKeyID($address, $server = self::KEYSERVER_PUBLIC, $timeout = self::KEYSERVER_TIMEOUT) { return $this->_getKeyserverOb($server)->getKeyId($address); } /** * Get the fingerprints from a key block. * * @param string $pgpdata The PGP data block. * * @return array The fingerprints in $pgpdata indexed by key id. */ public function getFingerprintsFromKey($pgpdata) { $this->_initDrivers(); foreach ($this->_backends as $val) { try { return $val->getFingerprintsFromKey($pgpdata); } catch (Horde_Crypt_Exception $e) {} } return array(); } /** * Generates a public key from a private key. * * @param string $data Armor text of private key. * * @return string Armor text of public key, or null if it could not be * generated. */ public function getPublicKeyFromPrivateKey($data) { $this->_initDrivers(); foreach ($this->_backends as $val) { try { return $val->getPublicKeyFromPrivateKey($data); } catch (Horde_Crypt_Exception $e) {} } return null; } /** * Encrypts text using PGP. * * @param string $text The text to be PGP encrypted. * @param array $params The parameters needed for encryption. * See the individual _encrypt*() functions for the * parameter requirements. * * @return string The encrypted message. * @throws Horde_Crypt_Exception */ public function encrypt($text, $params = array()) { switch (isset($params['type']) ? $params['type'] : false) { case 'message': $error = Horde_Crypt_Translation::t( "Could not PGP encrypt message." ); $func = 'encryptMessage'; break; case 'signature': /* Check for required parameters. */ if (!isset($params['pubkey']) || !isset($params['privkey']) || !isset($params['passphrase'])) { /* This is a programming error, not a user displayable * error. */ throw new InvalidArgumentException( 'A public PGP key, private PGP key, and passphrase are required to sign a message.' ); } $error = Horde_Crypt_Translation::t("Could not PGP sign message."); $func = 'encryptSignature'; break; default: throw new InvalidArgumentException( 'Incorrect "type" parameter provided.' ); } $this->_initDrivers(); foreach ($this->_backends as $val) { try { return $val->$func($text, $params); } catch (Horde_Crypt_Exception $e) {} } throw new Horde_Crypt_Exception($error); } /** * Decrypts text using PGP. * * @param string $text The text to be PGP decrypted. * @param array $params The parameters needed for decryption. * See the individual _decrypt*() functions for the * parameter requirements. * * @return object An object with the following properties: * - message: (string) The signature result text. * - result: (boolean) The result of the signature test. * * @throws Horde_Crypt_Exception */ public function decrypt($text, $params = array()) { switch (isset($params['type']) ? $params['type'] : false) { case 'detached-signature': case 'signature': /* Check for required parameters. */ if (!isset($params['pubkey'])) { throw new InvalidArgumentException( 'A public PGP key is required to verify a signed message.' ); } if (($params['type'] === 'detached-signature') && !isset($params['signature'])) { throw new InvalidArgumentException( 'The detached PGP signature block is required to verify the signed message.' ); } $func = 'decryptSignature'; break; case 'message': /* Check for required parameters. */ if (!isset($params['passphrase']) && empty($params['no_passphrase'])) { throw new InvalidArgumentException( 'A passphrase is required to decrypt a message.' ); } $func = 'decryptMessage'; break; default: throw new InvalidArgumentException( 'Incorrect "type" parameter provided.' ); } $this->_initDrivers(); foreach ($this->_backends as $val) { try { return $val->$func($text, $params); } catch (Horde_Crypt_Exception $e) {} } throw new Horde_Crypt_Exception( Horde_Crypt_Translation::t("Could not decrypt PGP data.") ); } /** * Returns whether a text has been encrypted symmetrically. * * @todo Return null, instead of exception, if tools are not available to * determine whether data was encrypted symmetrically. * * @param string $text The PGP encrypted text. * * @return boolean True if the text is symmetrically encrypted. * @throws Horde_Crypt_Exception */ public function encryptedSymmetrically($text) { $this->_initDrivers(); foreach ($this->_backends as $val) { try { return $val->isEncryptedSymmetrically($text); } catch (Horde_Crypt_Exception $e) {} } throw new Horde_Crypt_Exception( Horde_Crypt_Translation::t("Unable to determine if data was encrypted symmetrically.") ); } /** * Signs a MIME part using PGP. * * @param Horde_Mime_Part $mime_part The object to sign. * @param array $params The parameters required for signing. * ({@see _encryptSignature()}). * * @return mixed A Horde_Mime_Part object that is signed according to RFC * 3156. * @throws Horde_Crypt_Exception */ public function signMIMEPart($mime_part, $params = array()) { $params = array_merge($params, array( 'sigtype' => 'detach', 'type' => 'signature' )); /* RFC 3156 Requirements for a PGP signed message: * + Content-Type params 'micalg' & 'protocol' are REQUIRED. * + The digitally signed message MUST be constrained to 7 bits. * + The MIME headers MUST be a part of the signed data. * + Ensure there are no trailing spaces in encoded data by forcing * text to be Q-P encoded (see, e.g., RFC 3676 [4.6]). */ /* Ensure that all text parts are Q-P encoded. */ foreach ($mime_part->contentTypeMap(false) as $key => $val) { if (strpos($val, 'text/') === 0) { $mime_part[$key]->setTransferEncoding('quoted-printable', array( 'send' => true )); } } /* Get the signature. */ $msg_sign = $this->encrypt($mime_part->toString(array( 'canonical' => true, 'headers' => true )), $params); /* Add the PGP signature. */ $pgp_sign = new Horde_Mime_Part(); $pgp_sign->setType('application/pgp-signature'); $pgp_sign->setHeaderCharset('UTF-8'); $pgp_sign->setDisposition('inline'); $pgp_sign->setDescription( Horde_Crypt_Translation::t("PGP Digital Signature") ); $pgp_sign->setContents($msg_sign, array('encoding' => '7bit')); /* Get the algorithim information from the signature. Since we are * analyzing a signature packet, we need to use the special keyword * '_SIGNATURE' - see Horde_Crypt_Pgp. */ $sig_info = $this->pgpPacketSignature($msg_sign, '_SIGNATURE'); /* Setup the multipart MIME Part. */ $part = new Horde_Mime_Part(); $part->setType('multipart/signed'); $part->setContents( "This message is in MIME format and has been PGP signed.\n" ); $part->addPart($mime_part); $part->addPart($pgp_sign); $part->setContentTypeParameter( 'protocol', 'application/pgp-signature' ); $part->setContentTypeParameter('micalg', $sig_info['micalg']); return $part; } /** * Encrypts a MIME part using PGP. * * @param Horde_Mime_Part $mime_part The object to encrypt. * @param array $params The parameters required for * encryption * ({@see _encryptMessage()}). * * @return mixed A Horde_Mime_Part object that is encrypted according to * RFC 3156. * @throws Horde_Crypt_Exception */ public function encryptMIMEPart($mime_part, $params = array()) { $params = array_merge($params, array('type' => 'message')); $signenc_body = $mime_part->toString(array( 'canonical' => true, 'headers' => true )); $message_encrypt = $this->encrypt($signenc_body, $params); /* Set up MIME Structure according to RFC 3156. */ $part = new Horde_Mime_Part(); $part->setType('multipart/encrypted'); $part->setHeaderCharset('UTF-8'); $part->setContentTypeParameter( 'protocol', 'application/pgp-encrypted' ); $part->setDescription( Horde_Crypt_Translation::t("PGP Encrypted Data") ); $part->setContents( "This message is in MIME format and has been PGP encrypted.\n" ); $part1 = new Horde_Mime_Part(); $part1->setType('application/pgp-encrypted'); $part1->setCharset(null); $part1->setContents("Version: 1\n", array('encoding' => '7bit')); $part->addPart($part1); $part2 = new Horde_Mime_Part(); $part2->setType('application/octet-stream'); $part2->setCharset(null); $part2->setContents($message_encrypt, array('encoding' => '7bit')); $part2->setDisposition('inline'); $part->addPart($part2); return $part; } /** * Signs and encrypts a MIME part using PGP. * * @param Horde_Mime_Part $mime_part The object to sign and encrypt. * @param array $sign_params The parameters required for * signing * ({@see _encryptSignature()}). * @param array $encrypt_params The parameters required for * encryption * ({@see _encryptMessage()}). * * @return mixed A Horde_Mime_Part object that is signed and encrypted * according to RFC 3156. * @throws Horde_Crypt_Exception */ public function signAndEncryptMIMEPart($mime_part, $sign_params = array(), $encrypt_params = array()) { /* RFC 3156 requires that the entire signed message be encrypted. We * need to explicitly call using Horde_Crypt_Pgp:: because we don't * know whether a subclass has extended these methods. */ $part = $this->signMIMEPart($mime_part, $sign_params); $part = $this->encryptMIMEPart($part, $encrypt_params); $part->setContents( "This message is in MIME format and has been PGP signed and encrypted.\n" ); $part->setCharset($this->_params['email_charset']); $part->setDescription( Horde_String::convertCharset( Horde_Crypt_Translation::t("PGP Signed/Encrypted Data"), 'UTF-8', $this->_params['email_charset'] ) ); return $part; } /** * Generates a Horde_Mime_Part object, in accordance with RFC 3156, that * contains a public key. * * @param string $key The public key. * * @return Horde_Mime_Part An object that contains the public key. */ public function publicKeyMIMEPart($key) { $part = new Horde_Mime_Part(); $part->setType('application/pgp-keys'); $part->setHeaderCharset('UTF-8'); $part->setDescription(Horde_Crypt_Translation::t("PGP Public Key")); $part->setContents($key, array('encoding' => '7bit')); return $part; } /** * Initialize the backend driver list. */ protected function _initDrivers() { if (empty($this->_backends)) { if (isset($this->_params['backends'])) { $this->_backends = $this->_params['backends']; } else { if (Horde_Crypt_Pgp_Backend_Binary::supported()) { $this->_backends[] = new Horde_Crypt_Pgp_Backend_Binary( $this->_params['program'], isset($this->_params['temp']) ? $this->_params['temp'] : null ); } } } } /* Deprecated components. */ /** * @deprecated Use Horde_Crypt_Pgp_Parse instead. */ const ARMOR_MESSAGE = 1; const ARMOR_SIGNED_MESSAGE = 2; const ARMOR_PUBLIC_KEY = 3; const ARMOR_PRIVATE_KEY = 4; const ARMOR_SIGNATURE = 5; const ARMOR_TEXT = 6; /** * @deprecated Use Horde_Crypt_Pgp_Parse instead. */ protected $_armor = array( 'MESSAGE' => self::ARMOR_MESSAGE, 'SIGNED MESSAGE' => self::ARMOR_SIGNED_MESSAGE, 'PUBLIC KEY BLOCK' => self::ARMOR_PUBLIC_KEY, 'PRIVATE KEY BLOCK' => self::ARMOR_PRIVATE_KEY, 'SIGNATURE' => self::ARMOR_SIGNATURE ); /** * @deprecated Use Horde_Crypt_Pgp_Keyserver instead. */ const KEYSERVER_PUBLIC = 'pool.sks-keyservers.net'; const KEYSERVER_REFUSE = 3; const KEYSERVER_TIMEOUT = 10; /** * @deprecated Use Horde_Crypt_Pgp_Parse instead. */ public function parsePGPData($text) { $parse = new Horde_Crypt_Pgp_Parse(); return $parse->parse($text); } /** * @deprecated Use Horde_Crypt_Pgp_Keyserver instead. */ public function getPublicKeyserver($keyid, $server = self::KEYSERVER_PUBLIC, $timeout = self::KEYSERVER_TIMEOUT, $address = null) { $keyserver = $this->_getKeyserverOb($server); if (empty($keyid) && !empty($address)) { $keyid = $keyserver->getKeyID($address); } return $keyserver->get($keyid); } /** * @deprecated */ public function generateRevocation($key, $email, $passphrase) { throw new Horde_Crypt_Exception('Not supported'); } /** * @deprecated * @internal */ protected function _getKeyserverOb($server) { $params = array( 'keyserver' => $server, 'http' => new Horde_Http_Client() ); if (!empty($this->_params['proxy_host'])) { $params['http']->{'request.proxyServer'} = $this->_params['proxy_host']; if (isset($this->_params['proxy_port'])) { $params['http']->{'request.proxyPort'} = $this->_params['proxy_port']; } } return new Horde_Crypt_Pgp_Keyserver($this, $params); } } Horde_Crypt-2.7.0/lib/Horde/Crypt/Smime.php 0000664 0001750 0001750 00000075331 12653673426 016570 0 ustar jan jan * @author Michael Slusarz
* cert - (string) The certificate of the signer stored in the message (in * PEM format). * email - (string) The email of the signing person. * msg - (string) Status string. * verify - (boolean) True if certificate was verified. ** @throws Horde_Crypt_Exception */ public function verify($text, $certs) { /* Check for availability of OpenSSL PHP extension. */ $this->checkForOpenSSL(); /* Create temp files for input/output. */ $input = $this->_createTempFile('horde-smime'); $output = $this->_createTempFile('horde-smime'); /* Write text to file */ file_put_contents($input, $text); unset($text); $root_certs = array(); if (!is_array($certs)) { $certs = array($certs); } foreach ($certs as $file) { if (file_exists($file)) { $root_certs[] = $file; } } $ob = new stdClass; if (!empty($root_certs) && (openssl_pkcs7_verify($input, 0, $output, $root_certs) === true)) { /* Message verified */ $ob->msg = Horde_Crypt_Translation::t("Message verified successfully."); $ob->verify = true; } else { /* Try again without verfying the signer's cert */ $result = openssl_pkcs7_verify($input, PKCS7_NOVERIFY, $output); if ($result === -1) { throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("Verification failed - an unknown error has occurred.")); } elseif ($result === false) { throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("Verification failed - this message may have been tampered with.")); } $ob->msg = Horde_Crypt_Translation::t("Message verified successfully but the signer's certificate could not be verified."); $ob->verify = false; } $ob->cert = file_get_contents($output); $ob->email = $this->getEmailFromKey($ob->cert); return $ob; } /** * Extract the contents from signed S/MIME data. * * @param string $data The signed S/MIME data. * @param string $sslpath The path to the OpenSSL binary. * * @return string The contents embedded in the signed data. * @throws Horde_Crypt_Exception */ public function extractSignedContents($data, $sslpath) { /* Check for availability of OpenSSL PHP extension. */ $this->checkForOpenSSL(); /* Create temp files for input/output. */ $input = $this->_createTempFile('horde-smime'); $output = $this->_createTempFile('horde-smime'); /* Write text to file. */ file_put_contents($input, $data); unset($data); exec($sslpath . ' smime -verify -noverify -nochain -in ' . $input . ' -out ' . $output); $ret = file_get_contents($output); if ($ret) { return $ret; } throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("OpenSSL error: Could not extract data from signed S/MIME part.")); } /** * Sign a MIME part using S/MIME. This produces S/MIME Version 3.2 * compatible data (see RFC 5751 [3.4]). * * @param Horde_Mime_Part $mime_part The object to sign. * @param array $params The parameters required for signing. * * @return Horde_Mime_Part A signed MIME part object. * @throws Horde_Crypt_Exception */ public function signMIMEPart($mime_part, $params) { /* Sign the part as a message */ $message = $this->encrypt( $mime_part->toString(array( 'headers' => true, 'canonical' => true )), $params ); /* Break the result into its components */ $mime_message = Horde_Mime_Part::parseMessage( $message, array('forcemime' => true) ); $smime_sign = $mime_message->getPart('2'); $smime_sign->setDescription( Horde_Crypt_Translation::t("S/MIME Signature") ); $smime_sign->setTransferEncoding('base64', array('send' => true)); $smime_part = new Horde_Mime_Part(); $smime_part->setType('multipart/signed'); $smime_part->setContents( "This is a cryptographically signed message in MIME format.\n" ); $smime_part->setContentTypeParameter( 'protocol', 'application/pkcs7-signature' ); // Per RFC 5751 [3.4.3.2], 'sha1' has been deprecated for 'sha-1'. $smime_part->setContentTypeParameter('micalg', 'sha-1'); $smime_part->addPart($mime_part); $smime_part->addPart($smime_sign); return $smime_part; } /** * Encrypt a MIME part using S/MIME. This produces S/MIME Version 3.2 * compatible data (see RFC 5751 [3.3]). * * @param Horde_Mime_Part $mime_part The object to encrypt. * @param array $params The parameters required for * encryption. * * @return Horde_Mime_Part An encrypted MIME part object. * @throws Horde_Crypt_Exception */ public function encryptMIMEPart($mime_part, $params = array()) { /* Sign the part as a message */ $message = $this->encrypt( $mime_part->toString(array( 'headers' => true, 'canonical' => true )), $params ); $msg = new Horde_Mime_Part(); $msg->setCharset($this->_params['email_charset']); $msg->setHeaderCharset('UTF-8'); $msg->setDescription( Horde_Crypt_Translation::t("S/MIME Encrypted Message") ); $msg->setDisposition('inline'); $msg->setType('application/pkcs7-mime'); $msg->setContentTypeParameter('smime-type', 'enveloped-data'); $msg->setContents( substr($message, strpos($message, "\n\n") + 2), array('encoding' => 'base64') ); return $msg; } /** * Encrypt a message in S/MIME format using a public key. * * @param string $text The text to be encrypted. * @param array $params The parameters needed for encryption. * - type: (string) [REQUIRED] 'message'. * - pubkey: (mixed) [REQUIRED] Public key/cert or array of public * keys/certs. * * @return string The encrypted message. * @throws Horde_Crypt_Exception */ protected function _encryptMessage($text, $params) { /* Check for required parameters. */ if (!isset($params['pubkey'])) { throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t( "A public S/MIME key is required to encrypt a message." )); } /* Create temp files for input/output. */ $input = $this->_createTempFile('horde-smime'); $output = $this->_createTempFile('horde-smime'); /* Store message in file. */ file_put_contents($input, $text); unset($text); /* Encrypt the document. */ $ciphers = array( // SHOULD- support (RFC 5751 [2.7]) OPENSSL_CIPHER_3DES ); if (defined('OPENSSL_CIPHER_AES_128_CBC')) { // MUST support (RFC 5751 [2.7]) array_unshift($ciphers, OPENSSL_CIPHER_AES_128_CBC); // SHOULD+ support (RFC 5751 [2.7]) array_unshift($ciphers, OPENSSL_CIPHER_AES_192_CBC); array_unshift($ciphers, OPENSSL_CIPHER_AES_256_CBC); } foreach ($ciphers as $val) { $success = openssl_pkcs7_encrypt( $input, $output, $params['pubkey'], array(), 0, $val ); if ($success && ($result = file_get_contents($output))) { return $this->_fixContentType($result, 'message'); } } throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t( "Could not S/MIME encrypt message." )); } /** * Sign a message in S/MIME format using a private key. * * @param string $text The text to be signed. * @param array $params The parameters needed for signing. *
* Parameters: * =========== * 'certs' => Additional signing certs (Optional) * 'passphrase' => Passphrase for key (REQUIRED) * 'privkey' => Private key (REQUIRED) * 'pubkey' => Public key (REQUIRED) * 'sigtype' => Determine the signature type to use. (Optional) * 'cleartext' -- Make a clear text signature * 'detach' -- Make a detached signature (DEFAULT) * 'type' => 'signature' (REQUIRED) ** * @return string The signed message. * @throws Horde_Crypt_Exception */ protected function _encryptSignature($text, $params) { /* Check for required parameters. */ if (!isset($params['pubkey']) || !isset($params['privkey']) || !array_key_exists('passphrase', $params)) { throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("A public S/MIME key, private S/MIME key, and passphrase are required to sign a message.")); } /* Create temp files for input/output/certificates. */ $input = $this->_createTempFile('horde-smime'); $output = $this->_createTempFile('horde-smime'); $certs = $this->_createTempFile('horde-smime'); /* Store message in temporary file. */ file_put_contents($input, $text); unset($text); /* Store additional certs in temporary file. */ if (!empty($params['certs'])) { file_put_contents($certs, $params['certs']); } /* Determine the signature type to use. */ $flags = (isset($params['sigtype']) && ($params['sigtype'] == 'cleartext')) ? PKCS7_TEXT : PKCS7_DETACHED; $privkey = (is_null($params['passphrase'])) ? $params['privkey'] : array($params['privkey'], $params['passphrase']); if (empty($params['certs'])) { $res = openssl_pkcs7_sign($input, $output, $params['pubkey'], $privkey, array(), $flags); } else { $res = openssl_pkcs7_sign($input, $output, $params['pubkey'], $privkey, array(), $flags, $certs); } if (!$res) { throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("Could not S/MIME sign message.")); } /* Output from openssl_pkcs7_sign may contain both \n and \r\n EOLs. * Canonicalize to \r\n. */ $fp = fopen($output, 'r'); stream_filter_register('horde_eol', 'Horde_Stream_Filter_Eol'); stream_filter_append($fp, 'horde_eol'); $data = stream_get_contents($fp); fclose($fp); return $this->_fixContentType($data, 'signature'); } /** * Decrypt an S/MIME encrypted message using a private/public keypair * and a passhprase. * * @param string $text The text to be decrypted. * @param array $params The parameters needed for decryption. *
* Parameters: * =========== * 'type' => 'message' (REQUIRED) * 'pubkey' => public key. (REQUIRED) * 'privkey' => private key. (REQUIRED) * 'passphrase' => Passphrase for Key. (REQUIRED) ** * @return string The decrypted message. * @throws Horde_Crypt_Exception */ protected function _decryptMessage($text, $params) { /* Check for required parameters. */ if (!isset($params['pubkey']) || !isset($params['privkey']) || !array_key_exists('passphrase', $params)) { throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("A public S/MIME key, private S/MIME key, and passphrase are required to decrypt a message.")); } /* Create temp files for input/output. */ $input = $this->_createTempFile('horde-smime'); $output = $this->_createTempFile('horde-smime'); /* Store message in file. */ file_put_contents($input, $text); unset($text); $privkey = is_null($params['passphrase']) ? $params['privkey'] : array($params['privkey'], $params['passphrase']); if (openssl_pkcs7_decrypt($input, $output, $params['pubkey'], $privkey)) { return file_get_contents($output); } throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("Could not decrypt S/MIME data.")); } /** * Sign and Encrypt a MIME part using S/MIME. * * @param Horde_Mime_Part $mime_part The object to sign and encrypt. * @param array $sign_params The parameters required for * signing. @see _encryptSignature(). * @param array $encrypt_params The parameters required for * encryption. * @see _encryptMessage(). * * @return mixed A Horde_Mime_Part object that is signed and encrypted. * @throws Horde_Crypt_Exception */ public function signAndEncryptMIMEPart($mime_part, $sign_params = array(), $encrypt_params = array()) { $part = $this->signMIMEPart($mime_part, $sign_params); return $this->encryptMIMEPart($part, $encrypt_params); } /** * Convert a PEM format certificate to readable HTML version. * * @param string $cert PEM format certificate. * * @return string HTML detailing the certificate. */ public function certToHTML($cert) { $fieldnames = array( /* Common Fields */ 'description' => Horde_Crypt_Translation::t("Description"), 'emailAddress' => Horde_Crypt_Translation::t("Email Address"), 'commonName' => Horde_Crypt_Translation::t("Common Name"), 'organizationName' => Horde_Crypt_Translation::t("Organisation"), 'organizationalUnitName' => Horde_Crypt_Translation::t("Organisational Unit"), 'countryName' => Horde_Crypt_Translation::t("Country"), 'stateOrProvinceName' => Horde_Crypt_Translation::t("State or Province"), 'localityName' => Horde_Crypt_Translation::t("Location"), 'streetAddress' => Horde_Crypt_Translation::t("Street Address"), 'telephoneNumber' => Horde_Crypt_Translation::t("Telephone Number"), 'surname' => Horde_Crypt_Translation::t("Surname"), 'givenName' => Horde_Crypt_Translation::t("Given Name"), /* X590v3 Extensions */ 'exendedtKeyUsage' => Horde_Crypt_Translation::t("X509v3 Extended Key Usage"), 'basicConstraints' => Horde_Crypt_Translation::t("X509v3 Basic Constraints"), 'subjectAltName' => Horde_Crypt_Translation::t("X509v3 Subject Alternative Name"), 'subjectKeyIdentifier' => Horde_Crypt_Translation::t("X509v3 Subject Key Identifier"), 'certificatePolicies' => Horde_Crypt_Translation::t("Certificate Policies"), 'crlDistributionPoints' => Horde_Crypt_Translation::t("CRL Distribution Points"), 'keyUsage' => Horde_Crypt_Translation::t("Key Usage") ); $details = $this->parseCert($cert); $text = '
'; /* Subject (a/k/a Certificate Owner) */ $text .= "" . Horde_Crypt_Translation::t("Certificate Owner") . ":\n"; foreach ($details['subject'] as $key => $value) { $value = htmlspecialchars($this->_implodeValues($value)); $text .= isset($fieldnames[$key]) ? sprintf(" %s: %s\n", htmlspecialchars($fieldnames[$key]), $value) : sprintf(" *%s: %s\n", htmlspecialchars($key), $value); } $text .= "\n"; /* Issuer */ $text .= "" . Horde_Crypt_Translation::t("Issuer") . ":\n"; foreach ($details['issuer'] as $key => $value) { $value = htmlspecialchars($this->_implodeValues($value)); $text .= isset($fieldnames[$key]) ? sprintf(" %s: %s\n", htmlspecialchars($fieldnames[$key]), $value) : sprintf(" *%s: %s\n", htmlspecialchars($key), $value); } $text .= "\n"; /* Dates */ $text .= "" . Horde_Crypt_Translation::t("Validity") . ":\n" . sprintf(" %s: %s\n", Horde_Crypt_Translation::t("Not Before"), strftime("%x %X", $details['validity']['notbefore']->getTimestamp())) . sprintf(" %s: %s\n", Horde_Crypt_Translation::t("Not After"), strftime("%x %X", $details['validity']['notafter']->getTimestamp())) . "\n"; /* X509v3 extensions */ if (!empty($details['extensions'])) { $text .= "" . Horde_Crypt_Translation::t("X509v3 extensions") . ":\n"; foreach ($details['extensions'] as $key => $value) { $value = htmlspecialchars(trim($this->_implodeValues($value, 6))); $text .= isset($fieldnames[$key]) ? sprintf(" %s:\n %s\n", htmlspecialchars($fieldnames[$key]), $value) : sprintf(" *%s:\n %s\n", htmlspecialchars($key), $value); } $text .= "\n"; } /* Certificate Details */ $text .= "" . Horde_Crypt_Translation::t("Certificate Details") . ":\n" . sprintf(" %s: %d\n", Horde_Crypt_Translation::t("Version"), $details['version']) . sprintf(" %s: %d\n", Horde_Crypt_Translation::t("Serial Number"), $details['serialNumber']); return $text . "\n"; } /** * Formats a multi-value cert field. * * @param array|string $value A cert field value. * @param integer $indent The indention level. * * @return string The formatted cert field value(s). */ protected function _implodeValues($value, $indent = 4) { if (is_array($value)) { $value = "\n" . str_repeat(' ', $indent) . implode("\n" . str_repeat(' ', $indent), $value); } return $value; } /** * Extract the contents of a PEM format certificate to an array. * * @param string $cert PEM format certificate. * * @return array All extractable information about the certificate. */ public function parseCert($cert) { $data = openssl_x509_parse($cert, false); if (!$data) { throw new Horde_Crypt_Exception(sprintf(Horde_Crypt_Translation::t("Error parsing S/MIME certficate: %s"), openssl_error_string())); } $details = array( 'extensions' => $data['extensions'], 'issuer' => $data['issuer'], 'serialNumber' => $data['serialNumber'], 'subject' => $data['subject'], 'validity' => array( 'notafter' => new DateTime('@' . $data['validTo_time_t']), 'notbefore' => new DateTime('@' . $data['validFrom_time_t']) ), 'version' => $data['version'] ); // Add additional fields for BC purposes. $details['certificate'] = $details; $bc_changes = array( 'emailAddress' => 'Email', 'commonName' => 'CommonName', 'organizationName' => 'Organisation', 'organizationalUnitName' => 'OrganisationalUnit', 'countryName' => 'Country', 'stateOrProvinceName' => 'StateOrProvince', 'localityName' => 'Location', 'streetAddress' => 'StreetAddress', 'telephoneNumber' => 'TelephoneNumber', 'surname' => 'Surname', 'givenName' => 'GivenName' ); foreach (array('issuer', 'subject') as $val) { foreach (array_keys($details[$val]) as $key) { if (isset($bc_changes[$key])) { $details['certificate'][$val][$bc_changes[$key]] = $details[$val][$key]; unset($details['certificate'][$val][$key]); } } } return $details; } /** * Decrypt an S/MIME signed message using a public key. * * @param string $text The text to be verified. * @param array $params The parameters needed for verification. * * @return string The verification message. * @throws Horde_Crypt_Exception */ protected function _decryptSignature($text, $params) { throw new Horde_Crypt_Exception('_decryptSignature() ' . Horde_Crypt_Translation::t("not yet implemented")); } /** * Check for the presence of the OpenSSL extension to PHP. * * @throws Horde_Crypt_Exception */ public function checkForOpenSSL() { if (!Horde_Util::extensionExists('openssl')) { throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("The openssl module is required for the Horde_Crypt_Smime:: class.")); } } /** * Extract the email address from a public key. * * @param string $key The public key. * * @return mixed Returns the first email address found, or null if * there are none. */ public function getEmailFromKey($key) { $key_info = openssl_x509_parse($key); if (!is_array($key_info)) { return null; } if (isset($key_info['subject'])) { if (isset($key_info['subject']['Email'])) { return $key_info['subject']['Email']; } elseif (isset($key_info['subject']['emailAddress'])) { return $key_info['subject']['emailAddress']; } } // Check subjectAltName per http://www.ietf.org/rfc/rfc3850.txt if (isset($key_info['extensions']['subjectAltName'])) { $names = preg_split('/\s*,\s*/', $key_info['extensions']['subjectAltName'], -1, PREG_SPLIT_NO_EMPTY); foreach ($names as $name) { if (strpos($name, ':') === false) { continue; } list($kind, $value) = explode(':', $name, 2); if (Horde_String::lower($kind) == 'email') { return $value; } } } return null; } /** * Convert a PKCS 12 encrypted certificate package into a private key, * public key, and any additional keys. * * @param string $pkcs12 The PKCS 12 data. * @param array $params The parameters needed for parsing. *
* Parameters: * =========== * 'sslpath' => The path to the OpenSSL binary. (REQUIRED) * 'password' => The password to use to decrypt the data. (Optional) * 'newpassword' => The password to use to encrypt the private key. * (Optional) ** * @return stdClass An object. * 'private' - The private key in PEM format. * 'public' - The public key in PEM format. * 'certs' - An array of additional certs. * @throws Horde_Crypt_Exception */ public function parsePKCS12Data($pkcs12, $params) { /* Check for availability of OpenSSL PHP extension. */ $this->checkForOpenSSL(); if (!isset($params['sslpath'])) { throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("No path to the OpenSSL binary provided. The OpenSSL binary is necessary to work with PKCS 12 data.")); } $sslpath = escapeshellcmd($params['sslpath']); /* Create temp files for input/output. */ $input = $this->_createTempFile('horde-smime'); $output = $this->_createTempFile('horde-smime'); $ob = new stdClass; /* Write text to file */ file_put_contents($input, $pkcs12); unset($pkcs12); /* Extract the private key from the file first. */ $cmdline = $sslpath . ' pkcs12 -in ' . $input . ' -out ' . $output . ' -nocerts'; if (isset($params['password'])) { $cmdline .= ' -passin stdin'; if (!empty($params['newpassword'])) { $cmdline .= ' -passout stdin'; } else { $cmdline .= ' -nodes'; } } else { $cmdline .= ' -nodes'; } if ($fd = popen($cmdline, 'w')) { fwrite($fd, $params['password'] . "\n"); if (!empty($params['newpassword'])) { fwrite($fd, $params['newpassword'] . "\n"); } pclose($fd); } else { throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("Error while talking to smime binary.")); } $ob->private = trim(file_get_contents($output)); if (empty($ob->private)) { throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("Password incorrect")); } /* Extract the client public key next. */ $cmdline = $sslpath . ' pkcs12 -in ' . $input . ' -out ' . $output . ' -nokeys -clcerts'; if (isset($params['password'])) { $cmdline .= ' -passin stdin'; } if ($fd = popen($cmdline, 'w')) { fwrite($fd, $params['password'] . "\n"); pclose($fd); } else { throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("Error while talking to smime binary.")); } $ob->public = trim(file_get_contents($output)); /* Extract the CA public key next. */ $cmdline = $sslpath . ' pkcs12 -in ' . $input . ' -out ' . $output . ' -nokeys -cacerts'; if (isset($params['password'])) { $cmdline .= ' -passin stdin'; } if ($fd = popen($cmdline, 'w')) { fwrite($fd, $params['password'] . "\n"); pclose($fd); } else { throw new Horde_Crypt_Exception(Horde_Crypt_Translation::t("Error while talking to smime binary.")); } $ob->certs = trim(file_get_contents($output)); return $ob; } /** * The Content-Type parameters PHP's openssl_pkcs7_* functions return are * deprecated. Fix these headers to the correct ones (see RFC 2311). * * @param string $text The PKCS7 data. * @param string $type Is this 'message' or 'signature' data? * * @return string The PKCS7 data with the correct Content-Type parameter. */ protected function _fixContentType($text, $type) { if ($type == 'message') { $from = 'application/x-pkcs7-mime'; $to = 'application/pkcs7-mime'; } else { $from = 'application/x-pkcs7-signature'; $to = 'application/pkcs7-signature'; } return str_replace('Content-Type: ' . $from, 'Content-Type: ' . $to, $text); } /** * Create a temporary file that will be deleted at the end of this * process. * * @param string $descrip Description string to use in filename. * @param boolean $delete Delete the file automatically? * * @return string Filename of a temporary file. */ protected function _createTempFile($descrip = 'horde-crypt', $delete = true) { return Horde_Util::getTempFile($descrip, $delete, $this->_params['temp'], true); } } Horde_Crypt-2.7.0/lib/Horde/Crypt/Translation.php 0000664 0001750 0001750 00000001531 12653673426 020003 0 ustar jan jan * @category Horde * @package Crypt */ class Horde_Crypt_Translation extends Horde_Translation_Autodetect { /** * The translation domain * * @var string */ protected static $_domain = 'Horde_Crypt'; /** * The absolute PEAR path to the translations for the default gettext handler. * * @var string */ protected static $_pearDirectory = '@data_dir@'; } Horde_Crypt-2.7.0/lib/Horde/Crypt.php 0000664 0001750 0001750 00000006172 12653673426 015513 0 ustar jan jan * @category Horde * @copyright 2002-2016 Horde LLC * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1 * @package Crypt */ class Horde_Crypt { /** * Configuration parameters. * * @var array */ protected $_params = array(); /** * Attempts to return a concrete Horde_Crypt instance based on $driver. * * @param string $driver Either a driver name, or the full class name to * use (class must extend Horde_Crypt). * @param array $params A hash containing any additional configuration * or parameters a subclass might need. * * @return Horde_Crypt The newly created concrete instance. * @throws Horde_Crypt_Exception */ public static function factory($driver, $params = array()) { /* Return a base Horde_Crypt object if no driver is specified. */ if (empty($driver) || (strcasecmp($driver, 'none') == 0)) { return new Horde_Crypt(); } /* Base drivers (in Crypt/ directory). */ $class = __CLASS__ . '_' . Horde_String::ucfirst(basename($driver)); if (class_exists($class)) { return new $class($params); } /* Explicit class name, */ $class = $driver; if (class_exists($class)) { return new $class($params); } throw new Horde_Crypt_Exception( __CLASS__ . ': Class definition of ' . $driver . ' not found.' ); } /** * Constructor. * * @param array $params Configuration parameters: * - email_charset: (string) The default email charset. */ public function __construct(array $params = array()) { $this->_params = array_merge(array( 'email_charset' => null, ), $params); } /** * Encrypt the requested data. * This method should be provided by all classes that extend Horde_Crypt. * * @param string $data The data to encrypt. * @param array $params An array of arguments needed to encrypt the data. * * @return array The encrypted data. */ public function encrypt($data, $params = array()) { return $data; } /** * Decrypt the requested data. * This method should be provided by all classes that extend Horde_Crypt. * * @param string $data The data to decrypt. * @param array $params An array of arguments needed to decrypt the data. * * @return array The decrypted data. * @throws Horde_Crypt_Exception */ public function decrypt($data, $params = array()) { return $data; } } Horde_Crypt-2.7.0/locale/ar/LC_MESSAGES/Horde_Crypt.mo 0000664 0001750 0001750 00000000705 12653673426 020273 0 ustar jan jan 4 L ` a f B l Name Never Project-Id-Version: Horde_Crypt Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit الاسم أبداً Horde_Crypt-2.7.0/locale/ar/LC_MESSAGES/Horde_Crypt.po 0000664 0001750 0001750 00000021375 12653673426 020304 0 ustar jan jan # Arabic translations for Horde_Crypt module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_Crypt module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_Crypt\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: lib/Horde/Crypt/Smime.php:614 #, php-format msgid "%s Fingerprint" msgstr "" #: lib/Horde/Crypt/Pgp.php:1240 msgid "A passphrase is required to decrypt a message." msgstr "" #: lib/Horde/Crypt/Pgp.php:1307 msgid "A public PGP key is required to verify a signed message." msgstr "" #: lib/Horde/Crypt/Pgp.php:1164 msgid "" "A public PGP key, private PGP key, and passphrase are required to sign a " "message." msgstr "" #: lib/Horde/Crypt/Smime.php:311 msgid "A public S/MIME key is required to encrypt a message." msgstr "" #: lib/Horde/Crypt/Smime.php:422 msgid "" "A public S/MIME key, private S/MIME key, and passphrase are required to " "decrypt a message." msgstr "" #: lib/Horde/Crypt/Smime.php:360 msgid "" "A public S/MIME key, private S/MIME key, and passphrase are required to sign " "a message." msgstr "" #: lib/Horde/Crypt/Smime.php:506 msgid "CRL Distribution Points" msgstr "" #: lib/Horde/Crypt/Smime.php:609 msgid "Certificate Details" msgstr "" #: lib/Horde/Crypt/Smime.php:520 msgid "Certificate Owner" msgstr "" #: lib/Horde/Crypt/Smime.php:505 msgid "Certificate Policies" msgstr "" #: lib/Horde/Crypt/Pgp.php:426 #, fuzzy msgid "Comment" msgstr "الأوامر:" #: lib/Horde/Crypt/Smime.php:475 msgid "Common Name" msgstr "" #: lib/Horde/Crypt/Pgp.php:939 #, fuzzy msgid "Connection refused to the public keyserver." msgstr "حصل خطأ خلال الإتصال بمخدم الـ FTP." #: lib/Horde/Crypt/Pgp.php:950 #, php-format msgid "Connection refused to the public keyserver. Reason: %s (%s)" msgstr "" #: lib/Horde/Crypt/Pgp.php:1132 msgid "Could not PGP encrypt message: " msgstr "" #: lib/Horde/Crypt/Pgp.php:1201 msgid "Could not PGP sign message: " msgstr "" #: lib/Horde/Crypt/Smime.php:330 msgid "Could not S/MIME encrypt message." msgstr "" #: lib/Horde/Crypt/Smime.php:391 msgid "Could not S/MIME sign message." msgstr "" #: lib/Horde/Crypt/Pgp.php:1276 #, fuzzy msgid "Could not decrypt PGP data: " msgstr "لا إمكانية لنسخ %s إلى %s" #: lib/Horde/Crypt/Smime.php:440 msgid "Could not decrypt S/MIME data." msgstr "" #: lib/Horde/Crypt/Pgp.php:659 msgid "Could not determine the recipient's e-mail address." msgstr "" #: lib/Horde/Crypt/Pgp.php:759 lib/Horde/Crypt/Pgp.php:848 msgid "Could not obtain public key from the keyserver." msgstr "" #: lib/Horde/Crypt/Smime.php:478 msgid "Country" msgstr "" #: lib/Horde/Crypt/Pgp.php:426 #, fuzzy msgid "E-Mail" msgstr "البريد" #: lib/Horde/Crypt/Smime.php:474 #, fuzzy msgid "Email Address" msgstr "عنوان بريدك الإلكتروني:" #: lib/Horde/Crypt/Pgp.php:1584 lib/Horde/Crypt/Pgp.php:1592 msgid "Error while talking to pgp binary." msgstr "" #: lib/Horde/Crypt/Smime.php:1251 lib/Horde/Crypt/Smime.php:1269 #: lib/Horde/Crypt/Smime.php:1284 msgid "Error while talking to smime binary." msgstr "" #: lib/Horde/Crypt/Pgp.php:425 msgid "Expiration Date" msgstr "" #: lib/Horde/Crypt/Smime.php:586 msgid "Exponent" msgstr "" #: lib/Horde/Crypt/Smime.php:484 msgid "Given Name" msgstr "" #: lib/Horde/Crypt/Pgp.php:426 msgid "Hash-Algorithm" msgstr "" #: lib/Horde/Crypt/Smime.php:534 msgid "Issuer" msgstr "" #: lib/Horde/Crypt/Pgp.php:424 msgid "Key Creation" msgstr "" #: lib/Horde/Crypt/Pgp.php:427 msgid "Key Fingerprint" msgstr "" #: lib/Horde/Crypt/Pgp.php:427 msgid "Key ID" msgstr "" #: lib/Horde/Crypt/Pgp.php:425 msgid "Key Length" msgstr "" #: lib/Horde/Crypt/Pgp.php:424 msgid "Key Type" msgstr "" #: lib/Horde/Crypt/Smime.php:507 #, fuzzy msgid "Key Usage" msgstr "حجم الاستخدام:" #: lib/Horde/Crypt/Pgp.php:782 msgid "Key already exists on the public keyserver." msgstr "" #: lib/Horde/Crypt/Smime.php:480 msgid "Location" msgstr "" #: lib/Horde/Crypt/Smime.php:189 msgid "" "Message Verified Successfully but the signer's certificate could not be " "verified." msgstr "" #: lib/Horde/Crypt/Smime.php:583 msgid "Modulus" msgstr "" #: lib/Horde/Crypt/Pgp.php:424 msgid "Name" msgstr "الاسم" #: lib/Horde/Crypt/Smime.php:490 msgid "Netscape Base URL" msgstr "" #: lib/Horde/Crypt/Smime.php:492 msgid "Netscape CA Revocation URL" msgstr "" #: lib/Horde/Crypt/Smime.php:494 msgid "Netscape CA policy URL" msgstr "" #: lib/Horde/Crypt/Smime.php:493 msgid "Netscape Renewal URL" msgstr "" #: lib/Horde/Crypt/Smime.php:491 msgid "Netscape Revocation URL" msgstr "" #: lib/Horde/Crypt/Smime.php:495 msgid "Netscape SSL server name" msgstr "" #: lib/Horde/Crypt/Smime.php:496 msgid "Netscape certificate comment" msgstr "" #: lib/Horde/Crypt/Smime.php:489 msgid "Netscape certificate type" msgstr "" #: lib/Horde/Crypt/Pgp.php:449 msgid "Never" msgstr "أبداً" #: lib/Horde/Crypt/Smime.php:1217 msgid "" "No path to the OpenSSL binary provided. The OpenSSL binary is necessary to " "work with PKCS 12 data." msgstr "" #: lib/Horde/Crypt/Pgp.php:451 lib/Horde/Crypt/Pgp.php:452 msgid "None" msgstr "" #: lib/Horde/Crypt/Smime.php:549 msgid "Not After" msgstr "" #: lib/Horde/Crypt/Smime.php:548 msgid "Not Before" msgstr "" #: lib/Horde/Crypt/Smime.php:231 msgid "OpenSSL error: Could not extract data from signed S/MIME part." msgstr "" #: lib/Horde/Crypt/Smime.php:476 msgid "Organisation" msgstr "" #: lib/Horde/Crypt/Smime.php:477 msgid "Organisational Unit" msgstr "" #: lib/Horde/Crypt/Pgp.php:1406 msgid "PGP Digital Signature" msgstr "" #: lib/Horde/Crypt/Pgp.php:1450 msgid "PGP Encrypted Data" msgstr "" #: lib/Horde/Crypt/Pgp.php:1511 msgid "PGP Public Key" msgstr "" #: lib/Horde/Crypt/Pgp.php:1493 msgid "PGP Signed/Encrypted Data" msgstr "" #: lib/Horde/Crypt/Smime.php:1256 #, fuzzy msgid "Password incorrect" msgstr "كلمة المرور" #: lib/Horde/Crypt/Pgp.php:447 msgid "Private Key" msgstr "" #: lib/Horde/Crypt/Pgp.php:447 msgid "Public Key" msgstr "" #: lib/Horde/Crypt/Smime.php:554 msgid "Public Key Algorithm" msgstr "" #: lib/Horde/Crypt/Smime.php:553 msgid "Public Key Info" msgstr "" #: lib/Horde/Crypt/Pgp.php:225 msgid "Public/Private keypair not generated successfully." msgstr "" #: lib/Horde/Crypt/Smime.php:572 #, php-format msgid "RSA Public Key (%d bit)" msgstr "" #: lib/Horde/Crypt/Pgp.php:227 msgid "Returned error message:" msgstr "" #: lib/Horde/Crypt/Pgp.php:1644 msgid "Revocation key not generated successfully." msgstr "" #: lib/Horde/Crypt/Smime.php:252 msgid "S/MIME Cryptographic Signature" msgstr "" #: lib/Horde/Crypt/Smime.php:283 msgid "S/MIME Encrypted Message" msgstr "" #: lib/Horde/Crypt/Smime.php:611 msgid "Serial Number" msgstr "" #: lib/Horde/Crypt/Smime.php:622 msgid "Signature" msgstr "" #: lib/Horde/Crypt/Smime.php:621 msgid "Signature Algorithm" msgstr "" #: lib/Horde/Crypt/Smime.php:479 msgid "State or Province" msgstr "" #: lib/Horde/Crypt/Smime.php:481 #, fuzzy msgid "Street Address" msgstr "عنوان المنزل" #: lib/Horde/Crypt/Smime.php:483 #, fuzzy msgid "Surname" msgstr "الاسم" #: lib/Horde/Crypt/Smime.php:482 msgid "Telephone Number" msgstr "" #: lib/Horde/Crypt/Pgp.php:1311 msgid "" "The detached PGP signature block is required to verify the signed message." msgstr "" #: lib/Horde/Crypt/Smime.php:1146 msgid "The openssl module is required for the Horde_Crypt_Smime:: class." msgstr "" #: lib/Horde/Crypt/Smime.php:512 msgid "Unable to extract certificate details" msgstr "" #: lib/Horde/Crypt/Pgp.php:453 lib/Horde/Crypt/Pgp.php:454 #: lib/Horde/Crypt/Pgp.php:455 msgid "Unknown" msgstr "" #: lib/Horde/Crypt/Smime.php:596 lib/Horde/Crypt/Smime.php:844 #: lib/Horde/Crypt/Smime.php:850 msgid "Unsupported Extension" msgstr "" #: lib/Horde/Crypt/Smime.php:547 msgid "Validity" msgstr "" #: lib/Horde/Crypt/Smime.php:191 msgid "Verification failed - an unknown error has occurred." msgstr "" #: lib/Horde/Crypt/Smime.php:193 msgid "Verification failed - this message may have been tampered with." msgstr "" #: lib/Horde/Crypt/Smime.php:610 msgid "Version" msgstr "" #: lib/Horde/Crypt/Smime.php:502 msgid "X509v3 Basic Constraints" msgstr "" #: lib/Horde/Crypt/Smime.php:501 msgid "X509v3 Extended Key Usage" msgstr "" #: lib/Horde/Crypt/Smime.php:503 msgid "X509v3 Subject Alternative Name" msgstr "" #: lib/Horde/Crypt/Smime.php:504 msgid "X509v3 Subject Key Identifier" msgstr "" #: lib/Horde/Crypt/Smime.php:592 msgid "X509v3 extensions" msgstr "" #: lib/Horde/Crypt/Smime.php:1135 msgid "not yet implemented" msgstr "" Horde_Crypt-2.7.0/locale/bg/LC_MESSAGES/Horde_Crypt.mo 0000664 0001750 0001750 00000004115 12653673426 020260 0 ustar jan jan 0 8 1 Q j + 3 / L + Z 2 J ? B O ^ L @ k { T f ] n A public PGP key is required to verify a signed message. A public PGP key, private PGP key, and passphrase are required to sign a message. Connection refused to the public keyserver. Could not determine the recipient's e-mail address. Could not obtain public key from the keyserver. Email Address Key already exists on the public keyserver. Name Never Public/Private keypair not generated successfully. The detached PGP signature block is required to verify the signed message. Verification failed - this message may have been tampered with. Project-Id-Version: Horde_Crypt Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit За да проверите подписано писмо е необходим PGP ключ. За да подпишете писмо са необходими: публичен ключ, личен ключ и ключова фраза. Достъпа до публичния сървър беше отказан. Некоректен email адрес на получателя. Грешка при получаването на публичния ключ от ключ-сървъра. Еmail адрес Ключа вече съществува в публичния ключсървър. Име Никога Ключова двойка публичен/частен ключ не беше генерирана. Прикрепеният PGP подпис е необходим за да се провери подписаното писмо. Грешка при проверката - това писмо може да е било подправено. Horde_Crypt-2.7.0/locale/bg/LC_MESSAGES/Horde_Crypt.po 0000664 0001750 0001750 00000026101 12653673426 020262 0 ustar jan jan # Bulgarian translations for Horde_Crypt module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_Crypt module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_Crypt\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: lib/Horde/Crypt/Smime.php:614 #, php-format msgid "%s Fingerprint" msgstr "" #: lib/Horde/Crypt/Pgp.php:1240 #, fuzzy msgid "A passphrase is required to decrypt a message." msgstr "За да криптирате писмо е необходим публичен PGP ключ." #: lib/Horde/Crypt/Pgp.php:1307 msgid "A public PGP key is required to verify a signed message." msgstr "За да проверите подписано писмо е необходим PGP ключ." #: lib/Horde/Crypt/Pgp.php:1164 msgid "" "A public PGP key, private PGP key, and passphrase are required to sign a " "message." msgstr "" "За да подпишете писмо са необходими: публичен ключ, личен ключ и ключова " "фраза." #: lib/Horde/Crypt/Smime.php:311 #, fuzzy msgid "A public S/MIME key is required to encrypt a message." msgstr "За да криптирате писмо е необходим публичен SMIME ключ." #: lib/Horde/Crypt/Smime.php:422 #, fuzzy msgid "" "A public S/MIME key, private S/MIME key, and passphrase are required to " "decrypt a message." msgstr "" "За да декриптирате писмо са необходими: публичен SMIME ключ, личен SMIME " "ключ и ключова фраза." #: lib/Horde/Crypt/Smime.php:360 #, fuzzy msgid "" "A public S/MIME key, private S/MIME key, and passphrase are required to sign " "a message." msgstr "" "За да подпишете писмо са необходими: публичен SMIME ключ, личен SMIME ключ и " "ключова фраза." #: lib/Horde/Crypt/Smime.php:506 msgid "CRL Distribution Points" msgstr "" #: lib/Horde/Crypt/Smime.php:609 msgid "Certificate Details" msgstr "" #: lib/Horde/Crypt/Smime.php:520 msgid "Certificate Owner" msgstr "" #: lib/Horde/Crypt/Smime.php:505 msgid "Certificate Policies" msgstr "" #: lib/Horde/Crypt/Pgp.php:426 #, fuzzy msgid "Comment" msgstr "Команди:" #: lib/Horde/Crypt/Smime.php:475 msgid "Common Name" msgstr "" #: lib/Horde/Crypt/Pgp.php:939 msgid "Connection refused to the public keyserver." msgstr "Достъпа до публичния сървър беше отказан." #: lib/Horde/Crypt/Pgp.php:950 #, fuzzy, php-format msgid "Connection refused to the public keyserver. Reason: %s (%s)" msgstr "Достъпа до публичния сървър беше отказан." #: lib/Horde/Crypt/Pgp.php:1132 #, fuzzy msgid "Could not PGP encrypt message: " msgstr "Грешка при PGP криптирането на писмо." #: lib/Horde/Crypt/Pgp.php:1201 #, fuzzy msgid "Could not PGP sign message: " msgstr "Грешка при PGP подписването на писмо." #: lib/Horde/Crypt/Smime.php:330 #, fuzzy msgid "Could not S/MIME encrypt message." msgstr "Грешка при SMIME криптирането на писмо." #: lib/Horde/Crypt/Smime.php:391 #, fuzzy msgid "Could not S/MIME sign message." msgstr "Грешка при SMIME подписването на писмо." #: lib/Horde/Crypt/Pgp.php:1276 #, fuzzy msgid "Could not decrypt PGP data: " msgstr "Грешка при декриптирането на PGP данни." #: lib/Horde/Crypt/Smime.php:440 #, fuzzy msgid "Could not decrypt S/MIME data." msgstr "Грешка при декриптирането на SMIME данни." #: lib/Horde/Crypt/Pgp.php:659 msgid "Could not determine the recipient's e-mail address." msgstr "Некоректен email адрес на получателя." #: lib/Horde/Crypt/Pgp.php:759 lib/Horde/Crypt/Pgp.php:848 msgid "Could not obtain public key from the keyserver." msgstr "Грешка при получаването на публичния ключ от ключ-сървъра." #: lib/Horde/Crypt/Smime.php:478 msgid "Country" msgstr "" #: lib/Horde/Crypt/Pgp.php:426 #, fuzzy msgid "E-Mail" msgstr "Поща" #: lib/Horde/Crypt/Smime.php:474 msgid "Email Address" msgstr "Еmail адрес" #: lib/Horde/Crypt/Pgp.php:1584 lib/Horde/Crypt/Pgp.php:1592 msgid "Error while talking to pgp binary." msgstr "" #: lib/Horde/Crypt/Smime.php:1251 lib/Horde/Crypt/Smime.php:1269 #: lib/Horde/Crypt/Smime.php:1284 msgid "Error while talking to smime binary." msgstr "" #: lib/Horde/Crypt/Pgp.php:425 msgid "Expiration Date" msgstr "" #: lib/Horde/Crypt/Smime.php:586 msgid "Exponent" msgstr "" #: lib/Horde/Crypt/Smime.php:484 #, fuzzy msgid "Given Name" msgstr "Име на файл" #: lib/Horde/Crypt/Pgp.php:426 msgid "Hash-Algorithm" msgstr "" #: lib/Horde/Crypt/Smime.php:534 msgid "Issuer" msgstr "" #: lib/Horde/Crypt/Pgp.php:424 msgid "Key Creation" msgstr "" #: lib/Horde/Crypt/Pgp.php:427 msgid "Key Fingerprint" msgstr "" #: lib/Horde/Crypt/Pgp.php:427 msgid "Key ID" msgstr "" #: lib/Horde/Crypt/Pgp.php:425 msgid "Key Length" msgstr "" #: lib/Horde/Crypt/Pgp.php:424 #, fuzzy msgid "Key Type" msgstr "Mime тип" #: lib/Horde/Crypt/Smime.php:507 #, fuzzy msgid "Key Usage" msgstr "Използване::" #: lib/Horde/Crypt/Pgp.php:782 msgid "Key already exists on the public keyserver." msgstr "Ключа вече съществува в публичния ключсървър." #: lib/Horde/Crypt/Smime.php:480 msgid "Location" msgstr "" #: lib/Horde/Crypt/Smime.php:189 #, fuzzy msgid "" "Message Verified Successfully but the signer's certificate could not be " "verified." msgstr "" "Писмото беше проверено успешно, но сертификата на подписа не беше потвърден." #: lib/Horde/Crypt/Smime.php:583 msgid "Modulus" msgstr "" #: lib/Horde/Crypt/Pgp.php:424 msgid "Name" msgstr "Име" #: lib/Horde/Crypt/Smime.php:490 msgid "Netscape Base URL" msgstr "" #: lib/Horde/Crypt/Smime.php:492 msgid "Netscape CA Revocation URL" msgstr "" #: lib/Horde/Crypt/Smime.php:494 msgid "Netscape CA policy URL" msgstr "" #: lib/Horde/Crypt/Smime.php:493 msgid "Netscape Renewal URL" msgstr "" #: lib/Horde/Crypt/Smime.php:491 msgid "Netscape Revocation URL" msgstr "" #: lib/Horde/Crypt/Smime.php:495 msgid "Netscape SSL server name" msgstr "" #: lib/Horde/Crypt/Smime.php:496 msgid "Netscape certificate comment" msgstr "" #: lib/Horde/Crypt/Smime.php:489 msgid "Netscape certificate type" msgstr "" #: lib/Horde/Crypt/Pgp.php:449 msgid "Never" msgstr "Никога" #: lib/Horde/Crypt/Smime.php:1217 msgid "" "No path to the OpenSSL binary provided. The OpenSSL binary is necessary to " "work with PKCS 12 data." msgstr "" #: lib/Horde/Crypt/Pgp.php:451 lib/Horde/Crypt/Pgp.php:452 msgid "None" msgstr "" #: lib/Horde/Crypt/Smime.php:549 msgid "Not After" msgstr "" #: lib/Horde/Crypt/Smime.php:548 msgid "Not Before" msgstr "" #: lib/Horde/Crypt/Smime.php:231 msgid "OpenSSL error: Could not extract data from signed S/MIME part." msgstr "" #: lib/Horde/Crypt/Smime.php:476 #, fuzzy msgid "Organisation" msgstr "Администриране" #: lib/Horde/Crypt/Smime.php:477 msgid "Organisational Unit" msgstr "" #: lib/Horde/Crypt/Pgp.php:1406 msgid "PGP Digital Signature" msgstr "" #: lib/Horde/Crypt/Pgp.php:1450 msgid "PGP Encrypted Data" msgstr "" #: lib/Horde/Crypt/Pgp.php:1511 msgid "PGP Public Key" msgstr "" #: lib/Horde/Crypt/Pgp.php:1493 msgid "PGP Signed/Encrypted Data" msgstr "" #: lib/Horde/Crypt/Smime.php:1256 #, fuzzy msgid "Password incorrect" msgstr "Парола: " #: lib/Horde/Crypt/Pgp.php:447 msgid "Private Key" msgstr "" #: lib/Horde/Crypt/Pgp.php:447 msgid "Public Key" msgstr "" #: lib/Horde/Crypt/Smime.php:554 msgid "Public Key Algorithm" msgstr "" #: lib/Horde/Crypt/Smime.php:553 msgid "Public Key Info" msgstr "" #: lib/Horde/Crypt/Pgp.php:225 msgid "Public/Private keypair not generated successfully." msgstr "Ключова двойка публичен/частен ключ не беше генерирана." #: lib/Horde/Crypt/Smime.php:572 #, php-format msgid "RSA Public Key (%d bit)" msgstr "" #: lib/Horde/Crypt/Pgp.php:227 msgid "Returned error message:" msgstr "" #: lib/Horde/Crypt/Pgp.php:1644 #, fuzzy msgid "Revocation key not generated successfully." msgstr "Ключова двойка публичен/частен ключ не беше генерирана." #: lib/Horde/Crypt/Smime.php:252 msgid "S/MIME Cryptographic Signature" msgstr "" #: lib/Horde/Crypt/Smime.php:283 #, fuzzy msgid "S/MIME Encrypted Message" msgstr "Грешка при SMIME криптирането на писмо." #: lib/Horde/Crypt/Smime.php:611 msgid "Serial Number" msgstr "" #: lib/Horde/Crypt/Smime.php:622 msgid "Signature" msgstr "" #: lib/Horde/Crypt/Smime.php:621 msgid "Signature Algorithm" msgstr "" #: lib/Horde/Crypt/Smime.php:479 msgid "State or Province" msgstr "" #: lib/Horde/Crypt/Smime.php:481 #, fuzzy msgid "Street Address" msgstr "Домашен адрес" #: lib/Horde/Crypt/Smime.php:483 #, fuzzy msgid "Surname" msgstr "без име" #: lib/Horde/Crypt/Smime.php:482 msgid "Telephone Number" msgstr "" #: lib/Horde/Crypt/Pgp.php:1311 msgid "" "The detached PGP signature block is required to verify the signed message." msgstr "" "Прикрепеният PGP подпис е необходим за да се провери подписаното писмо." #: lib/Horde/Crypt/Smime.php:1146 #, fuzzy msgid "The openssl module is required for the Horde_Crypt_Smime:: class." msgstr "Модулът OpenSSL е необходим за Crypt_smime:: class." #: lib/Horde/Crypt/Smime.php:512 msgid "Unable to extract certificate details" msgstr "" #: lib/Horde/Crypt/Pgp.php:453 lib/Horde/Crypt/Pgp.php:454 #: lib/Horde/Crypt/Pgp.php:455 msgid "Unknown" msgstr "" #: lib/Horde/Crypt/Smime.php:596 lib/Horde/Crypt/Smime.php:844 #: lib/Horde/Crypt/Smime.php:850 msgid "Unsupported Extension" msgstr "" #: lib/Horde/Crypt/Smime.php:547 msgid "Validity" msgstr "" #: lib/Horde/Crypt/Smime.php:191 msgid "Verification failed - an unknown error has occurred." msgstr "" #: lib/Horde/Crypt/Smime.php:193 msgid "Verification failed - this message may have been tampered with." msgstr "Грешка при проверката - това писмо може да е било подправено." #: lib/Horde/Crypt/Smime.php:610 #, fuzzy msgid "Version" msgstr "Права" #: lib/Horde/Crypt/Smime.php:502 msgid "X509v3 Basic Constraints" msgstr "" #: lib/Horde/Crypt/Smime.php:501 msgid "X509v3 Extended Key Usage" msgstr "" #: lib/Horde/Crypt/Smime.php:503 msgid "X509v3 Subject Alternative Name" msgstr "" #: lib/Horde/Crypt/Smime.php:504 msgid "X509v3 Subject Key Identifier" msgstr "" #: lib/Horde/Crypt/Smime.php:592 msgid "X509v3 extensions" msgstr "" #: lib/Horde/Crypt/Smime.php:1135 msgid "not yet implemented" msgstr "" Horde_Crypt-2.7.0/locale/bs/LC_MESSAGES/Horde_Crypt.mo 0000664 0001750 0001750 00000001150 12653673426 020270 0 ustar jan jan T B 1 > G K R Z Email Address Location Name Never None Serial Number Project-Id-Version: Horde_Crypt Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Email adresa Lokacija Ime Nikada Nijedan Serijski broj Horde_Crypt-2.7.0/locale/bs/LC_MESSAGES/Horde_Crypt.po 0000664 0001750 0001750 00000021705 12653673426 020303 0 ustar jan jan # Bosnian translations for Horde_Crypt module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_Crypt module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_Crypt\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: lib/Horde/Crypt/Smime.php:614 #, php-format msgid "%s Fingerprint" msgstr "" #: lib/Horde/Crypt/Pgp.php:1240 msgid "A passphrase is required to decrypt a message." msgstr "" #: lib/Horde/Crypt/Pgp.php:1307 msgid "A public PGP key is required to verify a signed message." msgstr "" #: lib/Horde/Crypt/Pgp.php:1164 msgid "" "A public PGP key, private PGP key, and passphrase are required to sign a " "message." msgstr "" #: lib/Horde/Crypt/Smime.php:311 msgid "A public S/MIME key is required to encrypt a message." msgstr "" #: lib/Horde/Crypt/Smime.php:422 msgid "" "A public S/MIME key, private S/MIME key, and passphrase are required to " "decrypt a message." msgstr "" #: lib/Horde/Crypt/Smime.php:360 msgid "" "A public S/MIME key, private S/MIME key, and passphrase are required to sign " "a message." msgstr "" #: lib/Horde/Crypt/Smime.php:506 msgid "CRL Distribution Points" msgstr "" #: lib/Horde/Crypt/Smime.php:609 msgid "Certificate Details" msgstr "" #: lib/Horde/Crypt/Smime.php:520 msgid "Certificate Owner" msgstr "" #: lib/Horde/Crypt/Smime.php:505 msgid "Certificate Policies" msgstr "" #: lib/Horde/Crypt/Pgp.php:426 msgid "Comment" msgstr "" #: lib/Horde/Crypt/Smime.php:475 #, fuzzy msgid "Common Name" msgstr "Vaše ime" #: lib/Horde/Crypt/Pgp.php:939 msgid "Connection refused to the public keyserver." msgstr "" #: lib/Horde/Crypt/Pgp.php:950 #, php-format msgid "Connection refused to the public keyserver. Reason: %s (%s)" msgstr "" #: lib/Horde/Crypt/Pgp.php:1132 msgid "Could not PGP encrypt message: " msgstr "" #: lib/Horde/Crypt/Pgp.php:1201 msgid "Could not PGP sign message: " msgstr "" #: lib/Horde/Crypt/Smime.php:330 msgid "Could not S/MIME encrypt message." msgstr "" #: lib/Horde/Crypt/Smime.php:391 msgid "Could not S/MIME sign message." msgstr "" #: lib/Horde/Crypt/Pgp.php:1276 #, fuzzy msgid "Could not decrypt PGP data: " msgstr "Nije bilo moguce obrisati poruke od %s: %s" #: lib/Horde/Crypt/Smime.php:440 msgid "Could not decrypt S/MIME data." msgstr "" #: lib/Horde/Crypt/Pgp.php:659 #, fuzzy msgid "Could not determine the recipient's e-mail address." msgstr "Nedozvoljena slova u email adresi." #: lib/Horde/Crypt/Pgp.php:759 lib/Horde/Crypt/Pgp.php:848 msgid "Could not obtain public key from the keyserver." msgstr "" #: lib/Horde/Crypt/Smime.php:478 msgid "Country" msgstr "" #: lib/Horde/Crypt/Pgp.php:426 #, fuzzy msgid "E-Mail" msgstr "Sanduce" #: lib/Horde/Crypt/Smime.php:474 msgid "Email Address" msgstr "Email adresa" #: lib/Horde/Crypt/Pgp.php:1584 lib/Horde/Crypt/Pgp.php:1592 msgid "Error while talking to pgp binary." msgstr "" #: lib/Horde/Crypt/Smime.php:1251 lib/Horde/Crypt/Smime.php:1269 #: lib/Horde/Crypt/Smime.php:1284 msgid "Error while talking to smime binary." msgstr "" #: lib/Horde/Crypt/Pgp.php:425 msgid "Expiration Date" msgstr "" #: lib/Horde/Crypt/Smime.php:586 msgid "Exponent" msgstr "" #: lib/Horde/Crypt/Smime.php:484 #, fuzzy msgid "Given Name" msgstr "Ime datoteke" #: lib/Horde/Crypt/Pgp.php:426 msgid "Hash-Algorithm" msgstr "" #: lib/Horde/Crypt/Smime.php:534 msgid "Issuer" msgstr "" #: lib/Horde/Crypt/Pgp.php:424 msgid "Key Creation" msgstr "" #: lib/Horde/Crypt/Pgp.php:427 msgid "Key Fingerprint" msgstr "" #: lib/Horde/Crypt/Pgp.php:427 msgid "Key ID" msgstr "" #: lib/Horde/Crypt/Pgp.php:425 msgid "Key Length" msgstr "" #: lib/Horde/Crypt/Pgp.php:424 #, fuzzy msgid "Key Type" msgstr "Mime tip" #: lib/Horde/Crypt/Smime.php:507 #, fuzzy msgid "Key Usage" msgstr "Poruka" #: lib/Horde/Crypt/Pgp.php:782 msgid "Key already exists on the public keyserver." msgstr "" #: lib/Horde/Crypt/Smime.php:480 msgid "Location" msgstr "Lokacija" #: lib/Horde/Crypt/Smime.php:189 msgid "" "Message Verified Successfully but the signer's certificate could not be " "verified." msgstr "" #: lib/Horde/Crypt/Smime.php:583 #, fuzzy msgid "Modulus" msgstr "Prebaci" #: lib/Horde/Crypt/Pgp.php:424 msgid "Name" msgstr "Ime" #: lib/Horde/Crypt/Smime.php:490 msgid "Netscape Base URL" msgstr "" #: lib/Horde/Crypt/Smime.php:492 msgid "Netscape CA Revocation URL" msgstr "" #: lib/Horde/Crypt/Smime.php:494 msgid "Netscape CA policy URL" msgstr "" #: lib/Horde/Crypt/Smime.php:493 msgid "Netscape Renewal URL" msgstr "" #: lib/Horde/Crypt/Smime.php:491 msgid "Netscape Revocation URL" msgstr "" #: lib/Horde/Crypt/Smime.php:495 msgid "Netscape SSL server name" msgstr "" #: lib/Horde/Crypt/Smime.php:496 msgid "Netscape certificate comment" msgstr "" #: lib/Horde/Crypt/Smime.php:489 msgid "Netscape certificate type" msgstr "" #: lib/Horde/Crypt/Pgp.php:449 msgid "Never" msgstr "Nikada" #: lib/Horde/Crypt/Smime.php:1217 msgid "" "No path to the OpenSSL binary provided. The OpenSSL binary is necessary to " "work with PKCS 12 data." msgstr "" #: lib/Horde/Crypt/Pgp.php:451 lib/Horde/Crypt/Pgp.php:452 msgid "None" msgstr "Nijedan" #: lib/Horde/Crypt/Smime.php:549 #, fuzzy msgid "Not After" msgstr "Not Draft" #: lib/Horde/Crypt/Smime.php:548 #, fuzzy msgid "Not Before" msgstr "Not Draft" #: lib/Horde/Crypt/Smime.php:231 msgid "OpenSSL error: Could not extract data from signed S/MIME part." msgstr "" #: lib/Horde/Crypt/Smime.php:476 #, fuzzy msgid "Organisation" msgstr "Registracija korisnika" #: lib/Horde/Crypt/Smime.php:477 msgid "Organisational Unit" msgstr "" #: lib/Horde/Crypt/Pgp.php:1406 #, fuzzy msgid "PGP Digital Signature" msgstr "Zatamni potpise?" #: lib/Horde/Crypt/Pgp.php:1450 msgid "PGP Encrypted Data" msgstr "" #: lib/Horde/Crypt/Pgp.php:1511 msgid "PGP Public Key" msgstr "" #: lib/Horde/Crypt/Pgp.php:1493 msgid "PGP Signed/Encrypted Data" msgstr "" #: lib/Horde/Crypt/Smime.php:1256 #, fuzzy msgid "Password incorrect" msgstr "Password" #: lib/Horde/Crypt/Pgp.php:447 msgid "Private Key" msgstr "" #: lib/Horde/Crypt/Pgp.php:447 msgid "Public Key" msgstr "" #: lib/Horde/Crypt/Smime.php:554 msgid "Public Key Algorithm" msgstr "" #: lib/Horde/Crypt/Smime.php:553 msgid "Public Key Info" msgstr "" #: lib/Horde/Crypt/Pgp.php:225 msgid "Public/Private keypair not generated successfully." msgstr "" #: lib/Horde/Crypt/Smime.php:572 #, php-format msgid "RSA Public Key (%d bit)" msgstr "" #: lib/Horde/Crypt/Pgp.php:227 #, fuzzy msgid "Returned error message:" msgstr "Čitanje poruka" #: lib/Horde/Crypt/Pgp.php:1644 msgid "Revocation key not generated successfully." msgstr "" #: lib/Horde/Crypt/Smime.php:252 msgid "S/MIME Cryptographic Signature" msgstr "" #: lib/Horde/Crypt/Smime.php:283 msgid "S/MIME Encrypted Message" msgstr "" #: lib/Horde/Crypt/Smime.php:611 msgid "Serial Number" msgstr "Serijski broj" #: lib/Horde/Crypt/Smime.php:622 #, fuzzy msgid "Signature" msgstr "Vaš potpis:" #: lib/Horde/Crypt/Smime.php:621 #, fuzzy msgid "Signature Algorithm" msgstr "Vaš potpis:" #: lib/Horde/Crypt/Smime.php:479 msgid "State or Province" msgstr "" #: lib/Horde/Crypt/Smime.php:481 #, fuzzy msgid "Street Address" msgstr "Od adrese" #: lib/Horde/Crypt/Smime.php:483 #, fuzzy msgid "Surname" msgstr "Username" #: lib/Horde/Crypt/Smime.php:482 #, fuzzy msgid "Telephone Number" msgstr "Serijski broj" #: lib/Horde/Crypt/Pgp.php:1311 msgid "" "The detached PGP signature block is required to verify the signed message." msgstr "" #: lib/Horde/Crypt/Smime.php:1146 msgid "The openssl module is required for the Horde_Crypt_Smime:: class." msgstr "" #: lib/Horde/Crypt/Smime.php:512 msgid "Unable to extract certificate details" msgstr "" #: lib/Horde/Crypt/Pgp.php:453 lib/Horde/Crypt/Pgp.php:454 #: lib/Horde/Crypt/Pgp.php:455 msgid "Unknown" msgstr "" #: lib/Horde/Crypt/Smime.php:596 lib/Horde/Crypt/Smime.php:844 #: lib/Horde/Crypt/Smime.php:850 msgid "Unsupported Extension" msgstr "" #: lib/Horde/Crypt/Smime.php:547 msgid "Validity" msgstr "" #: lib/Horde/Crypt/Smime.php:191 #, fuzzy msgid "Verification failed - an unknown error has occurred." msgstr "Došlo je do fatalne greške" #: lib/Horde/Crypt/Smime.php:193 msgid "Verification failed - this message may have been tampered with." msgstr "" #: lib/Horde/Crypt/Smime.php:610 #, fuzzy msgid "Version" msgstr "Lično" #: lib/Horde/Crypt/Smime.php:502 msgid "X509v3 Basic Constraints" msgstr "" #: lib/Horde/Crypt/Smime.php:501 msgid "X509v3 Extended Key Usage" msgstr "" #: lib/Horde/Crypt/Smime.php:503 msgid "X509v3 Subject Alternative Name" msgstr "" #: lib/Horde/Crypt/Smime.php:504 msgid "X509v3 Subject Key Identifier" msgstr "" #: lib/Horde/Crypt/Smime.php:592 msgid "X509v3 extensions" msgstr "" #: lib/Horde/Crypt/Smime.php:1135 #, fuzzy msgid "not yet implemented" msgstr "Ne izbrisana" Horde_Crypt-2.7.0/locale/ca/LC_MESSAGES/Horde_Crypt.mo 0000664 0001750 0001750 00000016000 12653673426 020247 0 ustar jan jan V | x y 8 Q Z W n ! + - ; Y ! 3 / ) Y a h v + Q r z & @ b F > # 9 L [ u 2 . G U _ s J % & < ? E B $ g D | c l % i 0 G d n ; x I ( ( ' ) P @ z > ( : C O a i { 8 d p w { # $ $ 6 [ { m K R ` u ! A > # 3 : P N 2 G H P m ' U L ) 0 O 1 > 3 K : I R D 5 ' $ 2 7 4 + A <