Как отформатировать заголовок и тело DKIM? - PullRequest
0 голосов
/ 01 декабря 2019

Я уже задавал вопрос об этом раньше, но все еще не понимаю, что делать.

Мне нужно сделать канонизированный заголовок и текст для письма. Я прочитал эту часть документации много раз. Может ли кто-нибудь привести пример, потому что я не могу обернуть голову вокруг этого:

3.4.1. «Простой» алгоритм канонизации заголовка

«Простой» алгоритм канонизации заголовка никак не меняет поля заголовка. Поля заголовка ДОЛЖНЫ быть представлены алгоритму подписи или проверки в точности так, как они есть в сообщении, которое подписывается или проверяется. В частности, имена полей заголовка НЕ ​​ДОЛЖНЫ быть сложены в регистр, а пробел НЕ ДОЛЖЕН изменяться.

3.4.2. Алгоритм канонизации "расслабленного" заголовка

Алгоритм канонизации "расслабленного" заголовка ДОЛЖЕН применять следующие шаги по порядку:

  • Преобразование всех имен полей заголовка (не поля заголовка)значения) в нижнем регистре. Например, преобразуйте «SUBJect: AbC» в «subject: AbC».

  • Разверните все строки продолжения поля заголовка, как описано в [RFC5322];в частности, строки с терминаторами, встроенными в продолженные значения полей заголовка (то есть последовательности CRLF, за которыми следует WSP), ДОЛЖНЫ интерпретироваться без CRLF. Реализации НЕ ДОЛЖНЫ удалять CRLF в конце значения поля заголовка.

  • Преобразовать все последовательности одного или нескольких символов WSP в один символ SP. Символы WSP здесь включают символы до и после границы сгиба строки.

  • Удалите все символы WSP в конце каждого развернутого поля заголовка.

  • Удалите все символы WSP, оставшиеся до и после двоеточия, отделяющего имя поля заголовка от значения поля заголовка. НЕОБХОДИМО, чтобы разделитель двоеточия был сохранен.

3.4.3. «Простой» алгоритм канонизации тела

«Простой» алгоритм канонизации тела игнорирует все пустые строки в конце тела сообщения. Пустая строка - это строка нулевой длины после удаления ограничителя строки. Если в теле сообщения отсутствует тело или нет завершающего CRLF, то добавляется CRLF. Он не вносит никаких других изменений в тело сообщения. В более формальных терминах «простой» алгоритм канонизации тела преобразует «* CRLF» в конце тела в один «CRLF».

Обратите внимание, что полностью пустое или отсутствующее тело канонизируется как одно »CRLF ";то есть канонизированная длина будет 2 октета.

Значение SHA-1 (в base64) для пустого тела (канонизированное для "CRLF"):

uoq1oCgLlTqpdDX/iUbLy7J1Wic=

Значение SHA-256:

frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN/XKdLCPjaYaY=

3.4.4. Алгоритм канонизации "расслабленного" тела

Алгоритм канонизации "расслабленного" тела ДОЛЖЕН применять следующие шаги (1) и (2) по порядку:

  1. Сокращение пробелов:

    • Игнорировать все пробелы в конце строк. Реализации НЕ ДОЛЖНЫ удалять CRLF в конце строки.

    • Сократить все последовательности WSP в строке до одного символа SP.

  2. Игнорировать все пустые строки в конце тела сообщения. «Пустая строка» определена в разделе 3.4.3. Если тело не пустое, но не заканчивается CRLF, добавляется CRLF. (Для электронной почты это возможно только при использовании расширений для механизмов транспорта SMTP или не-SMTP.)

Значение SHA-1 (в base64) для пустого тела (канонизировано длянулевой ввод):

2jmj7l5rSw0yVb/vlWAYkK/YBwk=

Значение SHA-256:

47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

3.4.5. Примеры канонизации (INFORMATIVE)

В следующих примерах фактические пробелы используются только для ясности. Фактический входной и выходной текст обозначается дескрипторами в квадратных скобках: "<SP>" для пробела, "<HTAB>" для символа табуляции и "<CRLF>" для последовательности возврата каретки / перевода строки. Например, "X <SP> Y" и "X<SP>Y" представляют три одинаковых символа.

Пример 1: чтение сообщения:

A: <SP> X <CRLF>
B <SP> : <SP> Y <HTAB><CRLF>
                <HTAB> Z <SP><SP><CRLF>
<CRLF>
<SP> C <SP><CRLF>
D <SP><HTAB><SP> E <CRLF>
<CRLF>
<CRLF>

при канонизации с использованием упрощенной канонизации для заголовка и тела приводит к чтению заголовка:

a:X <CRLF>
b:Y <SP> Z <CRLF>

и чтению тела:

<SP> C <CRLF>
D <SP> E <CRLF>

Пример 2. Одно и то же сообщение, канонизированное с использованием простой канонизации заголовка и основного текста, приводит к чтению заголовка:

A: <SP> X <CRLF>
B <SP> : <SP> Y <HTAB><CRLF>
       <HTAB> Z <SP><SP><CRLF>

и чтению основного текста:

<SP> C <SP><CRLF>
D <SP><HTAB><SP> E <CRLF>

Пример 3: при обработке с использованием канонизации расслабленного заголовка и простой канонизации тела, канонизированная версия имеет заголовок:

a:X <CRLF>
b:Y <SP> Z <CRLF>

и чтение тела:

<SP> C <SP><CRLF>
D <SP><HTAB><SP> E <CRLF>

1 Ответ

0 голосов
/ 03 декабря 2019

Хорошо, давайте попробуем перевести эти примеры в строки C:

3.4.5. Примеры канонизации (INFORMATIVE)

В следующих примерах фактические пробелы используются только для ясности. Фактический текст ввода и вывода обозначается с помощью дескрипторов в квадратных скобках: "<SP>" для пробела, "<HTAB>" для символа табуляции и "<CRLF>" для последовательности возврата каретки / перевода строки. Например, "X <SP> Y" и "X<SP>Y" представляют три одинаковых символа.

Пример 1: чтение сообщения:

A: <SP> X <CRLF>
B <SP> : <SP> Y <HTAB><CRLF>
                <HTAB> Z <SP><SP><CRLF>
<CRLF>
<SP> C <SP><CRLF>
D <SP><HTAB><SP> E <CRLF>
<CRLF>
<CRLF>

Перевод:

char *message = "A: X\r\nB : Y\t\r\n\tZ  \r\n\r\n C \r\nD \t E\r\n\r\n\r\n";

, когдаканонизированный с использованием смягченной канонизации для заголовка и тела приводит к чтению заголовка:

a:X <CRLF>
b:Y <SP> Z <CRLF>

перевод:

char *headers = "a:X\r\nb:Y Z\r\n";

и чтению тела:

<SP> C <CRLF>
D <SP> E <CRLF>

перевод:

char *body = " C\r\nD E\r\n";

Пример 2. Одно и то же сообщение, канонизированное с помощью простой канонизации как для заголовка, так и для тела, приводит к чтению заголовка:

A: <SP> X <CRLF>
B <SP> : <SP> Y <HTAB><CRLF>
       <HTAB> Z <SP><SP><CRLF>

Перевод:

char *headers = "A: X\r\nB : Y\t\r\n\tZ  \r\n";

и текст тела:

<SP> C <SP><CRLF>
D <SP><HTAB><SP> E <CRLF>

Перевод:

char *body = " C \r\nD \t E\r\n";

Пример 3: При обработке с использованием канонизации упрощенного заголовка и простой канонизации тела канонизированная версия имеет заголовок:

a:X <CRLF>
b:Y <SP> Z <CRLF>

Перевод:

char *headers = "a:X\r\nb:Y Z\r\n";

и чтение тела:

<SP> C <SP><CRLF>
D <SP><HTAB><SP> E <CRLF>

Перевод:

char *body = " C \r\nD \t E\r\n";
...