LINUX.ORG.RU

Сообщения stD

 

Вопрос про шифрование AES

Форум — General

Здравствуйте.

У меня есть программа (для микроконтроллера), которая должна посылать пакет данных по UART'у. Эти данные я зашифровываю с помощью этой библиотеки https://github.com/kokke/tiny-AES-c

Принимающее устройство расшифровывает этот пакет.

Собственно вот функция шифрования...


void encrypt_cbc(uint8_t *in_buf, uint16_t count_byte)
{
    uint8_t key[] = {0x62, 0x4d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
                      0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4};

    uint8_t iv[]  = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};

    struct AES_ctx ctx;
    AES_init_ctx_iv(&ctx, key, iv);
    AES_CBC_encrypt_buffer(&ctx, in_buf, count_byte);
}

Вот так я подаю свой (не зашифрованный) массив (небольшой байт 10) в эту функцию...

encrypt_cbc(crypt_buff, SIZE_PACKET);

И на выходе получаю зашифрованный массив.

Функция в свою очередь передаёт всё хозяйство в библиотечный файл aes.c https://github.com/kokke/tiny-AES-c/blob/master/aes.c#L76

Вопрос вот в чём. Скажите пожалуйста, можно ли сделать так, чтоб в зашифрованном пакете НЕ встречался символ 0x7E ?

Этот символ служит у меня маркером конца передачи. Других вариантов маркеров нет и сделать их не возможно.

 

stD
()

Удалить определённые строки из нескольких файлов

Форум — General

Здравствуйте.

Собственно вопрос в заголовке - мне нужно «пройтись» по нескольким вложенным каталогам с файлами, найти в этих файлах определённые строки, и удалить эти строки.

Делаю так…

grep -r 'assert' /home/dima/dir/ | sed -i '/assert/d'

…пытаясь удалить строки, в которых есть словосочетание «assert».

Однако это не работает, пишет - "sed: отсутствуют входные файлы ". Суть ошибки я понимаю, но не знаю как сделать правильно.

Подскажите решение?

 

stD
()

Поддержка Debian

Форум — General

Здравствуйте.

Скажите, вот у Ubuntu есть долгосрочные релизы с поддержкой в течении пяти лет, а какова ситуация с Debian в этом плане. То есть я хочу отказаться от Ubuntu и поставить Debian 11 (сервер), сколько лет у него будет поддержка (обновления) ?

Спасибо.

 

stD
()

Pthread в своей библиотеке

Форум — General

Здравствуйте.

ОС Ubuntu, язык СИ.

У меня сделана своя библиотека (файл.so), функции которой вызываются из Питоновского скрипта. Скажите, могу ли я создавать в этой своей библиотеке (файл.so) потоки (pthread)?

То есть, я запустил питовский скрипт, а он в свою очередь вызвал функции запускающие несколько pthread находящихся в файл.so.

Если так можно делать, то нужно ли мне эти потоки как-то останавливать перед остановкой питоновского скрипта?

И заодно попутный вопрос: как можно в данной ситуации отлаживать файл.so в valgrind, и можно ли вообще?

Спасибо.

 

stD
()

Как очистить терминал

Форум — General

Здравствуйте.

Программа на СИ. Linux.

Скажите как очистить терминал из своей программы?

Я в терминал вывожу строку с разными значениями и хочу чтоб было не куча бегущих строк, а одна.

Пробовал «clear», «reset», «printf(»\033c");", но строчка дёргается. Может есть какой способ сделать чтоб было без дерганий-морганий.

Ещё можно очистить с помощью «Ctrl + L», но я не знаю как послать такую команду.

Или может я вообще неправильно мыслю и надо как-то по другому делать, чтоб в терминал выводилась только одна строка?

Спасибо.

 

stD
()

Как уменьшать увеличивающееся значение?

Форум — General

Здравствуйте.

Есть переменная «А», значение которой меняется от 0 до 5000, мне нужно уменьшать переменную «В» относительно переменной «А». То есть, когда переменная «А» увеличивается, переменная «В» должна уменьшаться, и наоборот.

Например, если переменная «А» равна 2435, тогда в переменную «В» должно записываться 2433.

Подскажите, как это сделать? Может какие-то битовые операции подойдут для этого, или ещё что-то?

 

stD
()

Как запустить Java-приложение с конкретной версией

Форум — General

Здравствуйте.

У меня на компьютере (Ubuntu) установлены две версии Java, 8 и 11.

Версия 11 стоит по умолчанию, и все программы работают с ней, но есть программа, которая требует версию 8. Скажите, как мне запускать эту программу, чтоб она использовала версию 8, а не 11.

Может скрипт какой-то нужен? Раньше никогда с этим не сталкивался, поэтому даже не знаю с какой стороны к этому подходить.

 

stD
()

Как посчитать кол-во байт в массиве

Форум — General

Здравствуйте.

Предположим есть массив…

uint8_t buf[] = {0x01,0x06,0x00,0x07,0x00,0x08};

Как посчитать количество байт в этом массиве. strlen() не подходит так как есть нули.

Может вопрос простой, но что-то я не соображу как это сделать?

 

stD
()

Про сервер

Форум — General

Здравствуйте.

Есть сервер на WIZnet W5500, и вроде бы работает. Но, ситуация вот в чём: когда я открываю страничку в браузере, то она открывается, но при этом «кружочек» у браузера продолжает крутится, как будто что-то не догрузилось. Крутится бесконечно.

Посмотрел в wireshark, там есть запрос от клиента «GET /bla-bla», но нет ответа от сервера (должно прилететь «HTTP/1.1 200 OK»).

Как только я нажимаю на «крестик» в браузере (чтоб он перестал ожидать) то сразу же в wireshark появляется ожидаемая строчка - «HTTP/1.1 200 OK».

Скажите, почему так происходит?

Да, забыл. Сервер после получения запроса посылает клиенту стандартные строчки…

«HTTP/1.1 200 OK\r\n» «Content-Type: text/html; charset=UTF-8\r\nConnection: close\r\n\r\n»

«<meta http-equiv="Content-type" content="text/html;charset=utf-8">CRMBLA_BLA»

 

stD
()

Вопрос про выделение размера буфера для сокетов

Форум — General

Здравствуйте.

Речь идёт о железке W5500 https://www.chipdip.ru/catalog/popular/w5500 подключаемой к различным МК для работы с сетью. Имеет tcp стек и т.д.

У неё можно инициализировать до восьми сокетов (они там у неё внутри), так вот, для этих сокет есть внутренняя память - 32Кб.

Эту память можно распределять между сокетами самостоятельно, на свое усмотрение. Память эта делится условно на два (для входящих и исходящих буферов), то есть по 16Кб.

Я хочу создать три сокета - один для DNS, второй только для отправки, третий для сервера. Понятно что для сервера хочется выделить побольше этой самой внутренней памяти.

Отсюда вопрос:

Сколько памяти нужно выделить для сокета работающего с DNS (DNS-клиент). Этот сокет открывается один раз при старте, узнаёт ip для доменного имени и зарывается. Дальше он будет использоваться редко, напрмер раз в сутки.

В документации нет никаких рекомендаций потому что это видемо должен знать тот кто делает устройство и разбирается в сети.

В общем, какой размер входящего буфера порекомендуете установить для DNS сокета?

 

stD
()

Вопрос про правильность оформления/написания кода

Форум — General

Здравствуйте.

Вот есть буфер...

char str[20] = {0,}; 

И мне нужно записать в этот буфер что-то, но не в начало, в допустим в середину. Можно сделать так...

memcpy(str + 10, source, 5);

А можно так...

memcpy(&str[10], source, 5);

Как будет правильней с точки зрения оформления кода, удобочитаемости и т.п.?

 

stD
()

Конечный автомат

Форум — Development

Здравствуйте.

Есть задача - распарсить строку «s x1 y1\nm x2 y2\n» разложив x1, y1, x2, y2 по отдельным массивам...

  #define VARBUF 8
  char mystr[] = "s x1 y1\nm x2 y2\n";
  char *str = mystr;
  char var1[VARBUF] = {0,};
  char var2[VARBUF] = {0,};
  char var3[VARBUF] = {0,};
  char var4[VARBUF] = {0,};
  int flag = 1, i = 0, i2 = 0;
  int str_len = (int)strlen(mystr);
  
  for(; i < str_len; i++)
  {
	  if(flag == 1 && *str == ' ')
	  {                               
		  flag = 2;
		  str++;
		  i++;
		  i2 = 0;
		  for(; i < str_len && i2 < VARBUF - 1; i++, i2++, str++)
		  {
			  var1[i2] = *str;
			  if(*str == ' ') 
			  {
				  var1[i2] = 0;
				  break;
			  }
		  }
	  }
	  
	  if(flag == 2 && *str == ' ')
	  {                               
		  flag = 3;
		  str++;
		  i++;
		  i2 = 0;
		  for(; i < str_len && i2 < VARBUF - 1; i++, i2++, str++)
		  {
			  var2[i2] = *str;
			  if(*str == '\n') 
			  {
				  var2[i2] = 0;
				  break;
			  }
		  }
	  }	  
 
	  if(flag == 3 && *str == ' ')
	  {                              
		  flag = 4;
		  str++;
		  i++;
		  i2 = 0;
		  for(; i < str_len && i2 < VARBUF - 1; i++, i2++, str++)
		  {
			  var3[i2] = *str;
			  if(*str == ' ') 
			  {
				  var3[i2] = 0;
				  break;
			  }
		  }
	  }		  
	  
	  if(flag == 4 && *str == ' ')
	  {                              
		  flag = 0;
		  str++;
		  i++;
		  i2 = 0;
		  for(; i < str_len && i2 < VARBUF - 1; i++, i2++, str++)
		  {
			  var4[i2] = *str;
			  if(*str == '\n') 
			  {
				  var4[i2] = 0;
				  break;
			  }
		  }
	  }	
	  
	  str++;  
}

Можно ли назвать представленный выше код конечным автоматом?

 

stD
()

Помогите понять странную работу программы

Форум — Development

Здравствуйте.

Есть программа на СИ (линукс).

Вот часть функционала в функции маин...

...
  for(;;)
  {
    rat_rub = fopen("/tmp/file.txt", "r"); 
    if(rat_rub == NULL) error_log("rat_rub!");
    while(fgets(buff, 255, rat_rub) != NULL)
    {
      time_creat = strtoul(buff, NULL, 0);
      printf("buff: %lu %s\n", time_creat, buff);

      if(time_creat > time_res)
      {
        printf("SEND: %s\n", buff);
        SendMessage(namechatid, buff, 1);
        //sleep(2); 
      }
    }

    if(fclose(rat_rub) == -1) error_log("close rat_rub_func.");
    time_res = time_creat;
  }
...

Функция SendMessage(namechatid, buff, 1); вызавет функцию, в которой происходит форк, выполняется действие и выход из этой функции - exit(0);

По условиям, функция должна вызваться три раза (из файла читается построчно три строки и каждая строка поочерёдно отправляется в SendMessage).

Вопрос вот в чём: если sleep(2) закомментировано (как в примере), то всё работает нормально. А вот если sleep(2) раскомментировать, то функция SendMessage начинает вызывать большее количество раз, в частности 10 раз.

Как такое может происходить? Как sleep(2) на это влияет?

 

stD
()

Снова про указатель

Форум — General

Здравствуйте.

Помогите понять. Я хочу объявить массив указателей и потом присвоить этим указателям ареса других массивов...


uint8_t *globalptr[2]; // глобальный

int main()  
{ 
    uint8_t array_1[16];
    uint8_t array_2[16];
    
    globalptr[0] = array_1;
    globalptr[1] = array_2;
    ...

Всё это работает.

globalptr - хранит адреса массивов. Но ведь он объявлен как uint8_t, как туда влезают ареса.

Или всё это просто не правильно и у меня вылезает за границы? Однако valgrind ничего не говорит.

Помогите, а то запутался что-то.

 

stD
()

nginx - папка без https

Форум — Admin

Здравствуйте.

Собственно вопрос в названии топика. Мне нужно скачивать wget'ом кое-что из папки /блабла без ssl. То есть разрешить доступ к папке - /блабла без https.

Если не затруднит, покажите пример. Спасибо.

 

stD
()

Проверить наличие файла на удалённом компе

Форум — General

Здравствуйте.

Есть программа на СИ, работает на одном компьютере, нужно чтоб она проверяла наличие какого-либо файла на другом компе. Способ связи только SSH.

Как бы Вы это сделали?

 

stD
()

Nginx статика обновление

Форум — Web-development

Здравствуйте.

Не знал как правильно озаглавить пост, поэтому прошу прощения.

Вопрос вот в чём: обновил внешний вид сайта (css и т.д.), как заставить браузеры пользователей очистить свою историю и кеш?

Можно ли это сделать средствами nginx?

 

stD
()

Что это в логе сервера?

Форум — Admin

Здравствуйте.

Обнаружил в логе самописного сервера (телеграмбот) следующие записи:

Sun Mar 25 21:50:48 2018
GET / HTTP/1.0

Sun Mar 25 21:50:49 2018
OPTIONS / HTTP/1.0

Sun Mar 25 21:50:49 2018
GET /nice%20ports%2C/Tri%6Eity.txt%2ebak HTTP/1.0

Sun Mar 25 21:50:50 2018
Ђћ

Sun Mar 25 21:50:50 2018
\#ST

Sun Mar 25 21:50:51 2018
OPTIONS / RTSP/1.0

Sun Mar 25 21:50:51 2018
Ђ

Sun Mar 25 21:50:52 2018
HELP

Sun Mar 25 21:50:53 2018
l

Sun Mar 25 21:50:53 2018
default

Sun Mar 25 21:50:53 2018
0„

Sun Mar 25 21:50:53 2018
0

Sun Mar 25 21:50:53 2018
OPTIONS sip:nm SIP/2.0
Via: SIP/2.0/TCP nm;branch=foo
From: <sip:nm@nm>;tag=root
To: <sip:nm2@nm2>
Call-ID: 50000
CSeq: 42 OPTIONS
Max-Forwards: 70
Content-Length: 0
Contact: <sip:nm@nm>
Accept: application/sdp

Sun Mar 25 21:50:54 2018
TNMP

Sun Mar 25 21:50:54 2018
DmdT

Sun Mar 25 21:50:54 2018
:

Sun Mar 25 21:50:55 2018
JRMI

Sun Mar 25 21:50:56 2018
GIOP

Это access-лог, то есть записи должны быть типа...

GET / HTTP/1.1
Host: 125.129.251.134
User-Agent: Firefox/59.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1

В файле /var/log/syslog нашлись вот такие строки:

Mar 25 21:50:49 debian kernel: [68103.603605] myserver[4171]: segfault at 1 ip b746a32b sp bfc136d0 error 4 in libc-2.19.so[b73ee000+1a7000]

Таких записей 16 штук с разницей в одну секунду, все одинаковые.

myserver - это мой сервер))).

Сервер работает следующим образом: принимает соединение (SSL_accept) и форкается, то есть read уже в форке, далее обрабатываются данные.

Я понимаю что это попытка залезть мне в душу взлома, но хотелось бы узнать подробнее, что это за вид атаки?

Видимо это как-то связано sip-телефонией (вычитал это в сети), но что это за слова - TNMP, DmdT, JRMI? Это что-то осмысленное, или обрывки чего-то? Там ещё присутствуют not a legal XML character (квадратики с шестнадцатеричным кодом).

Что означает ошибка 4?

Сталкиваюсь с подобным впервые, посему прошу отнестись снисходительно. Спасибо.

(линукс, сервер на си)

 

stD
()

Вопрос про recvfrom

Форум — Development

Здравствуйте.

Скажите, как правильно обрабатывать ошибку recvfrom?

То есть, вот кусок udp-сервера, который в цикле принимает соединения...

while(1) 
     {  
        int n;
        if((n = recvfrom(sd, read_buffer, BREADSIZE - 1, 0, NULL, NULL)) < 0)
         {
           close(sd);
           exit(0);
         }

...если возникла ошибка, то нужно закрывать сокет и гасить прогу или можно сделать так...

while(1) 
     {  
        int n;
        if((n = recvfrom(sd, read_buffer, BREADSIZE - 1, 0, NULL, NULL)) < 0)
         {
           printf("error socket\n");
           continue;
         }

Сильно не пинайте ибо не понятно, какие последствия грядут?

То есть ясно, что ошибка EBADF (неверный дескриптор) погубит меня, но вот например ECONNREFUSED (сетевой компьютер с другой стороны отказался устанавливать сетевое соединение (обычно потому, что там не работает запрошенный сервис)), к чему приведёт?

Спасибо.

(язык си, линукс).

 

stD
()

Использование в своих программах других программ

Форум — Development

Здравствуйте.

Скажите, если я в своей программе (СИ, линукс) вызываю другие программы (wget или df или curl или ifconfig и т.д.), это ведь стандартная практика. Или я ошибаюсь?

 ,

stD
()

RSS подписка на новые темы