STM32/STM8技术论坛
直播中

donatello1996

8年用户 687经验值
擅长:处理器/DSP 控制/MCU RF/无线
私信 关注

【STM32MP157A-DK1开发板试用连载】方便开发的Samba服务器远程登录&浅尝crypto库

` 本帖最后由 donatello1996 于 2020-4-30 09:48 编辑

这两天在弄HDMI图形输出驱动,没搞出啥东西出来,官方的weston图形界面例程太高端了,还得求助一下哪位用过的大佬,先放下这个之后再弄,先弄好能弄的地方。
现在板子装好了Debian文件系统,可以随时apt下软件,首先得下方便开发的三大软件:
  1. apt install samba gcc make

三个软件功能三位一体,若要方便开发,相互之间环环相扣不能缺少一个,首先说下Samba是桑巴服务器,用于在发行版Linux系统上搭建Windows家族可直接以ftp协议访问的软件,这个不是简单的SFTP/TFTP协议应用,而是Windows系统只需要在资源管理器上输入(IP地址)(自定义路径)格式的路径,就可以像访问自己硬盘文件那样很方便地访问Linux系统的文件,看看效果就知道:
47.jpg


安装samba的过程很简单,只需要添加用户,新增密码文件,然后输入两次密码即可:
  1. touch /etc/samba/smbpasswd
  2. smbpasswd -a root

45.jpg

然后在/etc/samba/smb.conf文件的后面添加关键字:
  1. [share]
  2. path = /home
  3. available = yes
  4. browseable = yes
  5. public = yes
  6. writable = yes
  7. guest ok = yes


-路径字段为share,即刚刚的自定义路径,比如开发板的IP地址为192.168.1.5,则在资源管理器输入192.168.1.5share
-如果把路径字段改为别的,比如我可以改成[donatello],那么我就在资源管理器输入192.168.1.5donatello,可以访问相应的内容
-path = /home即Samba登录成功之后的路径
-available = yes即可访问路径
-browseable = yes可从外部浏览
-public = yes 用法跟available差不多
将smb.conf文件保存,可以在/etc下看到改变(这只是为了确保文件的修改是生效的而已),使用
  1. cat /etc/samba/smb.conf
命令就可以了:
48.jpg

要测试smb.conf的设置在Linux系统上面是否生效,还需使用
  1. testparm
命令去测试,在输入回车进行dump导出之后,能看到类似这样的设置字段就说明Samba服务初始化设置正确了:
49.jpg



板子Linux部分的搭建完毕了,就轮到Windows系统的设置了,一般情况下Windows系统默认是允许Samba远程访问的,默认访问端口也是开的,但有时候会因为一些安全性设置而导致访问失败,这里需要检查Windows功能选项是否打开Samba1.0应用层协议的开关,我刚弄好Samba的时候访问不了,就是这个原因:
50.jpg

现在板子有了Samba访问的便利,又安装了GCC和make功能,我就可以直接在板子上面搭建我自己的代码工程了。由于我使用openssl库开发一些应用,所以如果开发板要支持openssl驱动头文件的话,需要安装libcrypto库,装好这个库之后,就可以直接使用系统的API函数去做AES加密,AES-CMAC完整性保护验证等应用了:
  1. apt install openssl
  2. apt install libssl-dev

-一般而言后面带-dev后缀的库都是在代码里面直接包含模块化头文件的库,如#include #include
-并在系统lib目录中搜索libssl.soxxx等驱动库文件,i2c-dev之类的库同理
直接在开发板的文件路径下创建一个Source Insight的工程文件:
51.jpg

写一段简单的代码验证一下AES加密库:
#include
#include
#include
#include
#include
#include
#include "my_gpio.h"
#include
#include
int encrypt(unsigned char* plaintext, int plaintext_len, unsigned char *key,
            unsigned char *iv, unsigned char *ciphertext)
{
    EVP_CIPHER_CTX *ctx;
    int len;
    int ciphertext_len;
    ctx = EVP_CIPHER_CTX_new();
    EVP_Encryptinit_ex(ctx, EVP_aes_128_ctr(), NULL, key, iv);
    EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len);
    ciphertext_len = len;

    EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);
    ciphertext_len += len;

    EVP_CIPHER_CTX_free(ctx);

    return ciphertext_len;
}

int decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,
            unsigned char *iv, unsigned char *plaintext)
{
    EVP_CIPHER_CTX *ctx;

    int len;

    int plaintext_len;

    if (!(ctx = EVP_CIPHER_CTX_new()));

    if (1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_ctr(), NULL, key, iv));

    if (1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len));
    plaintext_len = len;

    if (1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len));
    plaintext_len += len;

    /* Clean up */
    EVP_CIPHER_CTX_free(ctx);

    return plaintext_len;
}

int main(int argc, char const *argv[])
{
    unsigned char *key = (unsigned char *)"01234567890123456789012345678901";
    unsigned char *iv = (unsigned char *)"0123456789012345";
    unsigned char * plaintext =(unsigned char *)"电子发烧友论坛 donatello1996";

    unsigned char ciphertext[128];
    unsigned char decryptedtext[128];

    int decryptedtext_len, ciphertext_len;

    printf("Plaintext is:%s

", plaintext);

    ciphertext_len = encrypt(plaintext, strlen((char *)plaintext), key, iv,
                             ciphertext);

    printf("Ciphertext is %d:%s

", ciphertext_len,ciphertext);

    decryptedtext_len = decrypt(ciphertext, ciphertext_len, key, iv,
                                decryptedtext);

    decryptedtext[decryptedtext_len] = '';

    printf("Decrypted text is:%s

", decryptedtext);

    return 0;
}

在makefile文件里面添加-lcrypto库:
  1. PROG = main
  2. SRCS = main.cc my_gpio.cc
CLEANFILES = $(PROG)
CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0) -lcrypto
  • LDFLAGS += $(shell pkg-config --libs gtk+-3.0)
  • all: $(PROG)
    $(PROG): $(SRCS)
  • $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
  • clean:
  • rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))


  • 直接在板子上面make:
    53.jpg

    运行结果:
    52.jpg
    到这里我就先放下这个加密库,去弄一下别的功能了,既然板子上有HDMI接口的,官方的出厂镜像又是能直接输出桌面,按道理来说驱动HDMI图像的输出应该很简单,遗憾的是我到现在也没调通HDMI,甚至没法驱动HDMI输出简单的纯色图,更别说搭建QT应用之类的玩意了...好在板子装的是Debian系统,虽然物理HDMI接口没调通,但这并不妨碍我搭建板子的虚拟桌面啊,其实很简单,只需要安装两个软件即可:
    1. apt install tightvncserver mate-desktop-environment-extras


    tightvncserver是轻量化vncserver即vnc服务器,Windows系统可通过vnc应用软件去访问板子的vnc桌面,非常简单,只需要在板子的命令行输入
    1. vncserver
    54.jpg

    就可以,第一次启动需要设置密码,之后就只需要运行vncserver指令即可:

    后面的:1表示VNC虚拟端口号1,即5901,所以需要一个Windows的VNC远程登陆软件登录5901端口号:
    55.jpg

    而mate-desktop-environment-extras是完整版带额外功能的Debian MATE桌面,安装需要花很长时间,直接跳过看看VNC的登录效果:
    56.jpg

    ` 46.jpg

    更多回帖

    相关帖子

    STM32MP157
    发帖
    登录/注册
    ×
    20
    完善资料,
    赚取积分