ГОСТ 34.11-2012 Стрибог на flat assembler (x86)

    image

    В продолжение темы OS Systemicus (т.к. там используется этот алгоритм) привожу полный код реализации ГОСТ 34.11-2012 на ассемблере. Эта же «библиотека» используется и в данной программе — http://omegicus.com/gost_34.11-2012_stribog



    UPD1: не в курсе, может выкладывать такое на хабре не по правилам — скажите, удалю…
    UPD2: перенес на pastebin…

    Не буду ничего описывать — написано уже достаточно, просто выложу код. Кого интересует не код, а подробности алгоритма — просьба не читать и не минусовать…

    Сразу предупреждаю, код не оптимизирован. Отдаю код целиком в добрые руки оптимизаторов) Если у кого получится ускорить ее — выкладывайте тоже.

    Как использовать:
            mov     ebx, 512                         ; 512 bit version
            mov     esi, buff
            mov     edi, MH
            mov     ecx, dword[m_sz]
            call    GOST_3411_2012
            ;
            mov     ebx, 256                         ; 256 bit version
            mov     esi, buff
            mov     edi, MH
            mov     ecx, dword[m_sz]
            call    GOST_3411_2012
    


    В первом случае используется 512-битная версия, исходник в ^buff, результат в ^MH, длина исходных данных в m_sz.
    Во втором случае всё аналогично, но используется 256-битная версия алгоритма.

    Итак, секция кода: http://pastebin.com/zzL8TXtb

    И данные для кода: http://pastebin.com/DAqUZ9dM
    Share post

    Similar posts

    Comments 28

      +24
      Круто! В благодарность за работу дарю инвайт на github.com. Это специальная площадка, где можно размещать такие штуки, которые похожи на исходные тексты программ.
        +3
        Или на pastebin.com
          +7
          А на bitbucket.org есть бесплатные приватные репозитории, где будет удобно хранить тексты программ, которые стыдно показать всем.
            +3
            Такие исходники отлично хранятся на devnull-as-a-service.com/
            P.S.
            у вас в предпоследнем байте hash_X_v512 нет ли опечатки?
              +3
              Закладку спалили…
                +1
                не, это не опечатка, так и должно быть…
            +1
            rep     movsb

            memcpy работающий побайтно?

                  mov        ebx, G12_Sbox                   ; S-Box
                  xor        edx, edx
                  align 4                                    ; for(i=0;i<64;i++)  state[i] = Sbox[state[i]]
              @@: mov        dl,  byte[esi  + ecx]           ; edx = state[i]
                  mov        al,  byte[G12_Sbox + edx]       ; al = Sbox[state[i]]


            align 4 среди линейного кода??

                  dec       ecx
                  or        ecx, ecx
                  jnz       @b


            кое-кто не знает, какие флаги выставляются после dec ecx???

            pxor     mm0, mm0

            MMX????

            
                  jmp     .next_ji
                  ; }
                  jmp     .next_ki
                  ; }
            


            как, вы говорите, работает эта конструкция?????

            Общее впечатление: x____O.
              0
              jecxz ) — но это если 0, а если нет? ну может и не знаю) хотя почти уверен, что or работает быстрее, т.к. jecx скорее аналог cmp в процессоре внутри…

              mmx, да, без него тут не смог реализовать, нужны были 64-битные операции

              rep movsb — ну видимо там нечетное количество копируется

              align 4 среди линейного кода?? — не среди кода, а перед циклом, небольшая всё-же оптимизация…
              align 4
              @:
              jmp @b

              ну а вообще — «Отдаю код целиком в добрые руки оптимизаторов) Если у кого получится ускорить ее — выкладывайте тоже.»
                0
                не среди кода, а перед циклом

                скажите, как по-вашему, что будет вставлено в сгенерированный код, туда, где нужны дополнительные байты для выравнивания?
                  0
                  nop естественно…
                  +1
                  нужны были 64-битные операции

                  Может стоило сразу под x86_64 писать? А если цель была — совместимость (с pentium MMX? тоже странный выбор), то и на 32-битных регистрах достаточно просто 64-битная арифметика делается.
                    0
                          dec       ecx
                          or        ecx, ecx
                          jnz       @b

                    кое-кто не знает, какие флаги выставляются после dec ecx???

                    jecxz ) — но это если 0, а если нет? ну может и не знаю) хотя почти уверен, что or работает быстрее, т.к. jecx скорее аналог cmp в процессоре внутри…


                    Ну точно — не знает. Правильный ответ: dec обновляет флаг z по результату операции, т.е. можно было написать
                          dec       ecx
                          jnz       @b

                      0
                      согласен))
                        +1
                        Так говорите:
                        Kolibri мне напоминает линукс — слишком мусорное ядро, в которое много лишнего натолкали

                        Не слишком ли поспешное заявление было, на фоне последующего?
                        Отдаю код целиком в добрые руки оптимизаторов) Если у кого получится ускорить ее — выкладывайте тоже.
                          0
                          ну это же не ядро…
                          тут и не было необходимости в оптимизации…
                            0
                            тут и не было необходимости в оптимизации…

                            Спорное утверждение, но видимо у каждого свои приоритеты.
                            +1
                            кстати, добрый день))) вы легендарная личность в колибри, много вашего кода видел, а тут Вы живой)
                              +2
                              Здравствуйте. Ничего легендарного — обычный человек и обычный программист.
                                +1
                                ну да, конечно)
                                0
                                тут Вы живой)
                                Это можно легко исправить image
                        0
                        jmp .next_ji
                        ; }
                        jmp .next_ki
                        ; }

                        никак)) вторая команда осталась лишней, делал всё быстро, код не почистил. на тот момент мне было главное, чтоб код работал…
                        я ж не назвал пост «самая быстрая реализация», но если кому надо именно на asm — то дооптимизируйте, исправляйте, пишите…
                          +2
                          дооптимизируйте, исправляйте, пишите

                          Не буду ничего описывать — написано уже достаточно

                          Вы, похоже, не понимаете, что с таким посылом ваш код посмотрит 2,5 человека, из них один — чтобы хакнуть вашу систему при следующей встрече.
                            0
                            ну ради Бога, пусть хакают) вот когда я искал исходники этой функции на асме — я был бы рад и такому коду, а так приходилось писать всё почти с нуля…
                              +2
                              Ключевое слово в моём сообщении — 2,5 человека. Возможно я даже завысил оценку.
                                0
                                ну если даже одному человеку это пригодится — уже будет не зря), т.к. я понимаю цену такого человека, которому нужны сорцы на асме подобной функции…
                        –1
                        Я не понимаю ассемблер… Поэтому хотелось бы услышать перечень оптимизаций примененных при реализации промежуточных вычислений, чтобы оценить качество реализации.
                        Например, таких как табулирование умножения многочленов и тд.
                          0
                          в этой версии никаких — просто перевод с С на ASM, оптимизированную версию пока выкладывать не буду — как раз работаю над ней.

                          Only users with full accounts can post comments. Log in, please.