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 <