Remove mb encode mimeheader special code and replace it with default function call

This commit is contained in:
2024-04-17 10:13:32 +09:00
parent e8f4c82f59
commit d54a6cbdf5
3 changed files with 46 additions and 56 deletions

View File

@@ -15,6 +15,7 @@ class MimeEncode
/**
* wrapper function for mb mime convert
* for correct conversion with long strings
* NOTE: This is only a wrapper for mb_encode_mimeheader to stay compatible
*
* @param string $string string to encode
* @param string $encoding target encoding
@@ -29,38 +30,9 @@ class MimeEncode
$current_internal_encoding = mb_internal_encoding();
// set internal encoding, so the mimeheader encode works correctly
mb_internal_encoding($encoding);
// if a subject, make a work around for the broken mb_mimencode
$pos = 0;
// after 36 single bytes characters,
// if then comes MB, it is broken
// has to 2 x 36 < 74 so the mb_encode_mimeheader
// 74 hardcoded split does not get triggered
$split = 36;
$_string = '';
while ($pos < mb_strlen($string, $encoding)) {
$output = mb_strimwidth($string, $pos, $split, "", $encoding);
$pos += mb_strlen($output, $encoding);
// if the strinlen is 0 here, get out of the loop
if (!mb_strlen($output, $encoding)) {
$pos += mb_strlen($string, $encoding);
}
$_string_encoded = mb_encode_mimeheader($output, $encoding);
// only make linebreaks if we have mime encoded code inside
// the space only belongs in the second line
if ($_string && preg_match("/^=\?/", $_string_encoded)) {
$_string .= $line_break . " ";
} elseif (
// hack for plain text with space at the end
mb_strlen($output, $encoding) == $split &&
mb_substr($output, -1, 1, $encoding) == " "
) {
// if output ends with space, add one more
$_string_encoded .= " ";
}
$_string .= $_string_encoded;
}
// strip out any spaces BEFORE a line break
$string = str_replace(" " . $line_break, $line_break, $_string);
// use the internal convert to mime header
// it works from PHP 8.2 on
$string = mb_encode_mimeheader($string, $encoding, 'B', $line_break);
// before we end, reset internal encoding
mb_internal_encoding($current_internal_encoding);
// return mime encoded string

View File

@@ -22,15 +22,12 @@ use SodiumException;
class SymmetricEncryption
{
/**
* Encrypt a message
* create key and check validity
*
* @param string $message Message to encrypt
* @param string $key Encryption key (as hex string)
* @return string
* @throws \Exception
* @throws \RangeException
* @param string $key The key from which the binary key will be created
* @return string Binary key string
*/
public static function encrypt(string $message, string $key): string
public static function createKey(string $key): string
{
try {
$key = CreateKey::hex2bin($key);
@@ -43,6 +40,21 @@ class SymmetricEncryption
. 'SODIUM_CRYPTO_SECRETBOX_KEYBYTES bytes long).'
);
}
return $key;
}
/**
* Encrypt a message
*
* @param string $message Message to encrypt
* @param string $key Encryption key (as hex string)
* @return string
* @throws \Exception
* @throws \RangeException
*/
public static function encrypt(string $message, string $key): string
{
$key = self::createKey($key);
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$cipher = base64_encode(
@@ -68,11 +80,7 @@ class SymmetricEncryption
*/
public static function decrypt(string $encrypted, string $key): string
{
try {
$key = CreateKey::hex2bin($key);
} catch (SodiumException $e) {
throw new \Exception('Invalid hex key');
}
$key = self::createKey($key);
$decoded = base64_decode($encrypted);
$nonce = mb_substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
$ciphertext = mb_substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');