1. Си / Говнокод #22090

    −47

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    static void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
    	sha2_word32	a, b, c, d, e, f, g, h, s0, s1;
    	sha2_word32	T1, T2, *W256;
    	int		j;
    
    	W256 = (sha2_word32*)context->buffer;
    
    	/* Initialize registers with the prev. intermediate value */
    	// а с какого такого хуя вы решили, что компилятор непременно сунет это в регистры? Массивы для кого сделали?
    	// хотя это еще можно понять, есть вероятность, что компилятор так лучше соптимизирует (но далеко не факт)
    	a = context->state[0];
    	b = context->state[1];
    	c = context->state[2];
    	d = context->state[3];
    	e = context->state[4];
    	f = context->state[5];
    	g = context->state[6];
    	h = context->state[7];
    
    	j = 0;
    	do {
    #if BYTE_ORDER == LITTLE_ENDIAN
    		/* Copy data while converting to host byte order */
    		REVERSE32(*data++,W256[j]);
    		/* Apply the SHA-256 compression function to update a..h */
    		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
    #else /* BYTE_ORDER == LITTLE_ENDIAN */
    		/* Apply the SHA-256 compression function to update a..h with copy */
    		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++);
    #endif /* BYTE_ORDER == LITTLE_ENDIAN */
    		T2 = Sigma0_256(a) + Maj(a, b, c);
    		h = g;
    		g = f;
    		f = e;
    		e = d + T1;
    		d = c;
    		c = b;
    		b = a;
    		a = T1 + T2;
    
    		j++;
    	} while (j < 16);
    
    	do {
    		/* Part of the message block expansion: */
    		s0 = W256[(j+1)&0x0f];
    		s0 = sigma0_256(s0);
    		s1 = W256[(j+14)&0x0f];	
    		s1 = sigma1_256(s1);
    
    		/* Apply the SHA-256 compression function to update a..h */
    		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + 
    		     (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
    		T2 = Sigma0_256(a) + Maj(a, b, c);
    		h = g;
    		g = f;
    		f = e;
    		e = d + T1;
    		d = c;
    		c = b;
    		b = a;
    		a = T1 + T2;
    
    		j++;
    	} while (j < 64);
    
    	/* Compute the current intermediate hash value */
    	context->state[0] += a;
    	context->state[1] += b;
    	context->state[2] += c;
    	context->state[3] += d;
    	context->state[4] += e;
    	context->state[5] += f;
    	context->state[6] += g;
    	context->state[7] += h;
    
    	/* Clean up */
    	a = b = c = d = e = f = g = h = T1 = T2 = 0; //  А вот это уже полная хуйня
    	//вы правда думаете, что компилятор не выкинет это нахуй?
    }

    SHA2 питушня, скачать можно например тут http://sources.freebsd.org/RELENG_8/src/sys/crypto/sha2/sha2.c

    В общем если вам важно, чтобы некая хуйня была непременно в регистрах, и чтобы потом эта хуйня непременно была почищена, единственный надежный способ - херачить код на ассемблере (или вообще в машинных кодах)

    Запостил: j123123, 30 Января 2017

    Комментарии (54) RSS

    • для регистров да, но разве volatile не поможет при очистке?
      Ответить
      • Если бы там было volatile(но там его нет), то тогда не было бы вообще никакого смысла что-то говорить про какие-то регистры и оптимизацию
        Ответить
    • У того же x86 столько регистров нету ;)

      > в машинных кодах
      Ага, и молиться, что тред не приостановят и не сохранят контекст в своп/хиберфайл...
      Ответить
      • EnterCriticalSection() же.
        Ответить
        • Да ну. Это же обычный семафор... Разве эта критическая секция защищает поток от приостановки шедулером? Можно пруф?
          Ответить
          • Трахнул тебя в очко своим шедулером, проверь.
            Ответить
          • Тогда _asm cli
            Ответить
            • CLI не блокирует немаскируемые прерывания (NMI). Но их тоже можно заблокировать, послав специальную команду в порт контроллера прерываний.

              Но всё это легко провернуть в реальном режиме. А в защищённом из прикладного уровня (ring 3) могут не позволить. Придётся писать драйвер нулевого кольца, чтобы им блокировать шедулер.
              Ответить
              • А кроме того cli нельзя из юзерспейса, ибо IOPL выставлен в ноль почти везде

                А кроме того оно работает для одного проца, а их может быть несколько, и шедулер в теории может тебя запустить на другом проце если не установить афинити

                В общем совет Стива хорош для 1992го года, наверное
                Ответить
              • > немаскируемые прерывания
                > но их тоже можно заблокировать
                Может ли всемогущий бог создать камень, который он не сможет поднять?
                Ответить
                • > Может ли всемогущий бог создать камень, который он не сможет поднять?

                  это любой камень, на который всемогущий бог положил. без внешних стимулов не поднять.
                  Ответить
                  • > любой камень, на который всемогущий бог болт положил. без внешних стимулов не поднять.
                    Ответить
          • В было бы круто запретить перывания, отключить шедулер и повесить ос из юзерспейса

            Кроме шуток есть невыгружаемый пул, но только в ядре
            Ответить
            • > В было бы круто запретить перывания, отключить шедулер и повесить ос из юзерспейса

              на виндах это делается очень просто: запусти update виндов
              Ответить
              • Анек времен Win9x

                --папа, а правда что Windows многозадачный?
                --Да, сынок
                --А как это, покажи?
                --Сейчас, дискету доформатирую
                Ответить
                • Вот кстати 95/98 форматировали дискету быстрее, чем 2к. Вот, вот эта ваша хвалёная многозадачность!
                  Ответить
                  • А программа FDA для DOS форматировала ещё быстрее, причём дискету 1,44 МБ могла отформатировать на 1,6 МБ, на 1,7 МБ и даже на 1,8 МБ, причём драйвер NT-based Windows такие «большие» дискеты спокойно подхватывал.

                    Была проблема только в голом DOS и в Windows 95/98 на компьютерах с Award BIOS, требовалось загрузить досовский драйвер для больших дискет (на машинах с AMI BIOS дополнительный драйвер загружать не требовалось).

                    Кстати, для DOS ещё была малоизвестная программа «фонового» форматирования дискет: она по таймеру переключала задачи между отправкой команд на форматирование и пользовательской задачей. Пока форматируется дискета, можно было заниматься чем-то несложным вроде редактирования текстов.
                    Ответить
                  • > Вот кстати 95/98 форматировали дискету быстрее, чем 2к. Вот, вот эта ваша хвалёная многозадачность!

                    зато на 2К компом можно было пользоватся. поэтому проблемой это никогда не было.

                    да и по сравнению с про-софтом для размножения данных, это все тормозило. у нас была какая-то софтинка в те времена: даешь ей сорс дискетку в рам зачитать, а потом только дест дискетки менять надо было. писала+форматировала одновременно, делала это 10 или 20 секунд быстрее чем все остальное. и самое интересное - делала это тихо.
                    Ответить
                • У меня есть подозрение, что неудачи многозадачности в те времена были обусловлены не столько имеющимися операционными системами, сколько тормознутостью процессоров тех времён, шины памяти и шин ввода-вывода. Задача просто не успевала выполнить полезное количество тактов за заданный интервал времени.
                  Ответить
    • З.Ы. Есть свопоустойчивый приём с расщеплением ключа на джве половинки, ксор которых даёт исходный ключ (rnd и rnd ^ key). Тогда и тереть особо не надо, один хер в собранном виде ключ нигде не встречается (ну разве что кусочками в регистрах)...
      Ответить
    • Тема MIDDLE_ENDIAN не раскрыта.

      https://en.wikipedia.org/wiki/Endianness#Middle-endian
      Ответить
      • MIDDLE_ENDIAN не нужен.
        Ответить
      • И семибитных байтов.
        Ответить
        • И PDP-10 с 36-битным словом, которое принято делить на девятибитные байты, ради которых ввели первоапрельские RFC UTF-9 и UTF-18.

          И БЭСМ-6 с 48-битным словом...
          Ответить
          • А еще есть Сетунь, где вообще нет никаких битов
            Ответить
            • Мне страшно представить язык программирования с тритовыми операциями. Существуют такие?
              Ответить
            • аналоговые компьютеры?
              Ответить
              • Цифровые, но с тритами вместо битов. Т. е. с троичной системой счисления.
                Ответить
                • MLC, практически
                  Ответить
                  • На вики попадалось про (мифический?) аудиофлеш с тёплыми аналоговыми семплами в холодных кристаллах кремния.
                    Ответить
                • А еще есть квантовые компутеры. Там вообще в каждом кубите хуй пойми что (вещественное число вроде).
                  Ответить
                  • а правда что они сильно упростят разложение на множители больших чисел и накроют песдой всю криптографию?
                    Ответить
                    • Я не разбираюсь в этом. Но вот тебе подборка того, что я слышал:
                      * Да, уже есть алгоритмы для квантовых компьютеров, позволяющие нагибать криптографию, завязанную на сложность факторизации чисел (рса).
                      * Но нет квантовых компьютеров с количеством кубитов, позволяющим нагнуть рса с нормальной длиной ключа.
                      * Как с помощью квантовых компьютеров нагибать криптографию на элиптических кривых, пока не придумали.
                      * Сейчас вроде пилят ненастоящие квантовые компьютеры с большим количеством кубитов. Они не умеют нагибать криптографию, а используются для каких-то других задач. Вроде гугл эксперементирует с ними для задачи оптимизации в машинном обучении.
                      Ответить
                      • > Сейчас вроде пилят ненастоящие квантовые компьютеры с большим количеством кубитов.

                        (не физик, может где путаюсь) я тоже думал что это какой-то прогресс. но на текущий момент времени, квантовые компы с дюжиной другой кубитов это большие шкафы, которые работают не намного быстрее чем обычные компы тех же размеров. и они не настоящие потому что танглмент (или как оно там) там только симулируется.

                        из того что я слышал большая часть этих компов идет в научную область для разработки квантовых алгоритмов. потому что теоретически они круты - но практически на них еще никто ничего интересного делать не умеет.

                        https://en.wikipedia.org/wiki/Quantum_computing
                        Ответить
                        • Физик в треде. Квантовые компы в текущий момент - это практически боль и отчаяние. Дюжина-другая кубитов - это огромный прогресс в свете того, что время декогеренции растёт с числом запутанных кубит экспоненциально. А для хорошего поведения нужно много кубитов и сильная запутанность между всеми.

                          D-Wave - вообще аналоговый оптимизатор, а не компьютер общего назначения, его в контексте криптографии вообще можно почти не бояться.
                          Ответить
                          • ранее, у меня сложилось впечатление что из квантовых компьютеров ничего не получится. но да хез. альтернативных моделей счислений/исполнений не так много, и развиваются они слабо и медленно.

                            ЗЫ или проще говоря: если разработку нельзя в индию зааутсорсить, то это бесполезно.
                            Ответить
                          • > время декогеренции растёт с числом запутанных кубит экспоненциально
                            Так вот где собака зарыта! А что такое время декогеренции?
                            Ответить
                            • Пардон, ошибся в знаке. Время декогеренции не растёт, а спадает как раз. Амплитуда растёт.

                              Короче, кубит живёт не в идеальном физическом вакууме, а в сраной реальной среде. И взаимодействует с любым говном. Со временем любая записанная в нём информация расплывается как тред под вайпом. И экспоненциальный спад означает, что через время t мы сможем извлечь из кубита правильный ответ только с вероятностью p (p < 1). Через время 2t - с вероятностью p^2. И так далее.

                              Вот это t и называется временем декогеренции. А суть эффекта в том, что если у тебя один кубит нормально жил микросекунду, а два кубита - 100 нс, то три будут жить уже 10 нс, а минимально осмысленные 16 - зептосекунду. За зептосекунду свет пролетает примерно ширину атомного ядра.
                              Ответить
                              • зато человеческий мозг запоминает с точно такой же эффективностью, только временные интервалы другие
                                Ответить
                              • > Короче, кубит живёт не в идеальном физическом вакууме, а в сраной реальной среде. И взаимодействует с любым говном.
                                Решение: надо просто всерьёз подсадить кубиты на мморпг. Время декогеренции вырастет до периода покупки доширака и выноса мусора. Последним можно вообще пренебречь.
                                Ответить
                                • Проблему одного кубита это не решит. Появление второго такого индивида, тесно запутанного с первым, сильно понижает время декогеренции. А с третьим вообще пизда.
                                  Ответить
                              • Похоже на вореции
                                Ответить
                                • Декогереции.
                                  Ответить
                                  • Технически, вореции являются примером нарушения когерентности дальнего порядка в тексте. Правда, квантовые модели текстов - это ёбаный ад, не имеющий практической полезности.
                                    Ответить
    • > // а с какого такого хуя вы решили, что компилятор непременно сунет это в регистры?

      лол. это просто виртуальные регистры для реализации этого алгоритма хэширования. или вы там в теле цикла сдвига по этим регистрам не заметили?

      или вы думаете что регистром может называтся только то что буквально мапится на регистры проца? - и regedit.exe предназначен для редактирования оных?

      > // А вот это уже полная хуйня

      да. но секурити типы любят стэк чистить. что бы нехуй.
      Ответить
      • > лол. это просто виртуальные регистры для реализации этого алгоритма хэширования.
        А зачем это тогда делать, чем МАССИВЫ не устраивают?
        Ответить
        • Да это ж копипаста прямо из стандарта на sha. Даже буквы те же самые, проверь.
          Ответить
          • Если обязательно надо чтоб там какие-то буквы были, выкрутиться можно например так
            #define A 0
            #define B 1
            ...
            
            arr[A] = context->state[0];
            arr[b] = context->state[1];
            ...
            // хотя тут можно и через memcpy()
            Ответить
            • Зачем выкручиваться, пусть компилятор этим занимается.
              Ответить
    • >. а с какого такого хуя вы решили, что компилятор непременно сунет это в регистры?

      А с какого хуя ты решил что автор с какого-то хуя подумал что компилятор засунет хуйэто в регистры?
      Ответить
      • А на кой хуй автор решил распидорить массив context->state[] на отдельные a b c d e f g переменные вместо того, чтобы скопировать этот массив в новый массив на стеке, и там уже его ебать аналогичным образом?
        Ответить
        • bormand: "Да это ж копипаста прямо из стандарта на sha. Даже буквы те же самые, проверь."
          Ответить
          • Вообще я вижу одно оправдание тяге j123123 к массиву в этой функции - присвоение "a=b=c=..." в конце компилятор точно выкинет, правда простой memset тоже, но какой-нибудь __crypto_secure_memzero прокатил бы.
            Ответить
    • На краю кровати безжизненным телом лежала Настя ее всю в сенниках, ссадинах и кровоподтеках трахал какай-то пидар.
      Ответить

    Добавить комментарий