CoaXPress 协议的CRC及其具体实现

Posted Hello-FPGA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CoaXPress 协议的CRC及其具体实现相关的知识,希望对你有一定的参考价值。

CoaXPress CRC

在CXP协议中,CRC用在stream packet和control packet中,用于指示数据是否错误,如果是control packet, device发现CRC错误后应该给出CRC错误的回应。
下表是回应的packet格式,在高速数据链路downconnection中。

其中CXP使用的CRC定义如下:

CRC多项式: x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
初始值: 0xFFFFFFFF
REFIN: true
REFOUT: true
XorOut: 0x00000000

进行CRC校验时,LSB FIRST,P0 FIRST

CRC校验哪些数据呢?

以Control packet为例说明:
下表是没有tag标签的control command 包,其中明确说明了,参与CRC校验的数据是从0到N+1,不包含K27.7和0x02,且如果是read command packet,实际就只有word 0,1 参与校验;

同样,协议给出了一个示例:
下面是一个完整的read control packet,其中0x56 0x86 0x5D 0x6F 是CRC校验结果,对应的word 为0x6F5D8656

K27.7 K27.7 K27.7 K27.7 0x02 0x02 0x02 0x02 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x00 0x56 0x86 0x5D 0x6F K29.7 K29.7 K29.7 K29.7

CRC校验HDL代码

有了协议给出的示例,我们可以选择正确的CRC32 代码,CRC一般分为串行和并行2种,我们的应用选择串行计算即可。

代码参考: http://outputlogic.com/?page_id=321

//-----------------------------------------------------------------------------
// Copyright (C) 2009 OutputLogic.com
// This source file may be used and distributed without restriction
// provided that this copyright statement is not removed from the file
// and that any derivative work contains the original copyright notice
// and the associated disclaimer.
//
// THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS
// OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
// WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//-----------------------------------------------------------------------------
// CRC module for data[0:0] ,   crc[31:0]=1+x^1+x^2+x^4+x^5+x^7+x^8+x^10+x^11+x^12+x^16+x^22+x^23+x^26+x^32;
//-----------------------------------------------------------------------------
module crc(
  input [0:0] data_in,
  input crc_en,
  output [31:0] crc_out,
  input rst,
  input clk);

  reg [31:0] lfsr_q,lfsr_c;

  assign crc_out = lfsr_q;

  always @(*) begin
    lfsr_c[0] = lfsr_q[31] ^ data_in[0];
    lfsr_c[1] = lfsr_q[0] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[2] = lfsr_q[1] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[3] = lfsr_q[2];
    lfsr_c[4] = lfsr_q[3] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[5] = lfsr_q[4] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[6] = lfsr_q[5];
    lfsr_c[7] = lfsr_q[6] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[8] = lfsr_q[7] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[9] = lfsr_q[8];
    lfsr_c[10] = lfsr_q[9] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[11] = lfsr_q[10] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[12] = lfsr_q[11] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[13] = lfsr_q[12];
    lfsr_c[14] = lfsr_q[13];
    lfsr_c[15] = lfsr_q[14];
    lfsr_c[16] = lfsr_q[15] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[17] = lfsr_q[16];
    lfsr_c[18] = lfsr_q[17];
    lfsr_c[19] = lfsr_q[18];
    lfsr_c[20] = lfsr_q[19];
    lfsr_c[21] = lfsr_q[20];
    lfsr_c[22] = lfsr_q[21] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[23] = lfsr_q[22] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[24] = lfsr_q[23];
    lfsr_c[25] = lfsr_q[24];
    lfsr_c[26] = lfsr_q[25] ^ lfsr_q[31] ^ data_in[0];
    lfsr_c[27] = lfsr_q[26];
    lfsr_c[28] = lfsr_q[27];
    lfsr_c[29] = lfsr_q[28];
    lfsr_c[30] = lfsr_q[29];
    lfsr_c[31] = lfsr_q[30];

  end // always

  always @(posedge clk, posedge rst) begin
    if(rst) begin
      lfsr_q <= 321\'b1;
    end
    else begin
      lfsr_q <= crc_en ? lfsr_c : lfsr_q;
    end
  end // always
endmodule // crc

Copyright © 2009-2013 OutputLogic.com | 

SSH服务:

SSH服务:

ssh: secure shell, protocol, 22/tcp, 安全的远程登录

具体的软件实现:

OpenSSH: ssh协议的开源实现,CentOS默认安装

dropbear:另一个开源实现

SSH协议版本

v1: 基于CRC-32做MAC,不安全;man-in-middle

v2:双方主机协议选择安全的MAC方式

基于DH算法做密钥交换,基于RSA或DSA实现身份认证

两种方式的用户登录认证:

基于password

基于key

 

 

-1:强制使用ssh协议版本1;
-2:强制使用ssh协议版本2;
-4:强制使用IPv4地址;
-6:强制使用IPv6地址;
-A:开启认证代理连接转发功能;
-a:关闭认证代理连接转发功能;
-b:使用本机指定地址作为对应连接的源ip地址;
-C:请求压缩所有数据;
-F:指定ssh指令的配置文件;
-f:后台执行ssh指令;
-g:允许远程主机连接主机的转发端口;
-i:指定身份文件;
-l:指定连接远程服务器登录用户名;
-N:不执行远程指令;
-o:指定配置选项;
-p:指定远程服务器上的端口;
-q:静默模式;
-X:开启X11转发功能;
-x:关闭X11转发功能;
-y:开启信任X11转发功能。

 

ssh加密通讯

技术图片

 

 

 

 

 

基于用户和口令登录验证
1 客户端发起ssh请求,服务器会把自己的公钥发送给用户
2 用户会根据服务器发来的公钥对密码进行加密
3 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则
用户登录成功

 

 

 ssh服务登录验证

ssh服务登录验证方式:

用户/口令

基于密钥

ssh服务登录验证

基于密钥的登录方式

1 首先在客户端生成一对密钥(ssh-keygen)

2 并将客户端的公钥ssh-copy-id 拷贝到服务端

3 当客户端再次发送一个连接请求,包括ip、用户名

4 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP

和用户,就会随机生成一个字符串。

5 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端

6 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的

字符串发送给服务端

7 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,

就允许免密码登录

基于密钥的登录方式

 

 

Linux 两台主机之间建立信任(ssh免密登录-即基于Key验证)

背景: 有时候我们在两个主机之间复制文件的时候,提示输入密码,很不方便,那如何免密码复制呢?,就是使用通过linux公钥和秘钥,建立双机信任关系。

在整理之前,我先说下ssh免密码的要点 : 

你想免密码登陆到哪个主机哪个用户, 就把你自己的公钥文件内容追加到远程主机对应用户下的authorized_keys文件中即可,对面如果没有,远程复制过去就会自动创建此authorized_keys文件,并将公钥信息存在里边。

第一种方法:

第一步:ssh-keygen  -t  rsa  -P "" -f /root/.ssh/id_rsa 先创建秘钥对。

[root@centos7.ssh]#ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):   需要输入对称秘钥
Enter same passphrase again:  确定秘钥
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:4mYhhq/jjhz8I1QWudKRODsR6R1FnxLFFeh1YJ1+YiM root@centos7.localdomain
The key‘s randomart image is:
+---[RSA 2048]----+
| .+ =+o.o=+ . |
| = * ooo. + |
|. * =..o. o |
| = B .. E = . |
| * o o S o + |
|.. o o o |
|.o . + |
|.o+o o |
|.+=o. |
+----[SHA256]-----+

生成的公私钥对在/root/.ssh目录下:文件名分别为id_rsa.pub(公钥)id_rsa(私钥)

第二步:

1、ssh-copy-id -i /root/.ssh/id_rsa.pub   192.168.34.101    将客户端的IP公钥传送到服务器端(192.168.34.101) 其中-i是指定自己当前的路径文件

 2、或者ssh-copy-id  192.168.34.101   (centos6/7默认会将本地的公钥文件直接复制过去,也不需要指定当前的路径和-i)

第三步:

就进行测试连接服务器端的IP地址,就不需要密码登陆:ssh 192.168.34.101

同理将对方的的公钥复制到本机上,对方连本机也不需要输入密码,只需要输入本机私钥的密码即可。

完成免密登录直接可以在对方机器做操作:

如: ssh 192.168.34.100 useradd wang  在对方机器上创建wang账号

 

重要:如果远程机器有本机的私钥文件,且本机已对私钥加密,本地想远程多个主机每次都需要输入私钥密码。

我们可以将其进行托管至代理服务即可,两条命令可以解决,但是退出代理之后,下次需要再连接时还需要输入私钥口令。

将私钥加密之后再连接需要输入私钥加密口令,比较麻烦:

ssh  192.168.34.100

技术图片

输入托管代理命令之后,就不需要再输入私钥加密口令,具体操作如下:

ssh-agent bash

ssh-add

 

[root@R1 .ssh]# ssh-agent bash
[root@R1 .ssh]# ssh-add
Enter passphrase for /root/.ssh/id_rsa:
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
[root@R1 .ssh]# ssh 192.168.34.100
Last login: Tue Oct 22 21:47:24 2019 from 192.168.34.200
[root@centos6~]#

注意:

  •   如果远程主机的端口非22端口,需要指定-p port选项。
  •   ssh-copy-id是由openssh-clients包提供,没有这个命令可以安装这个包。

第二种方法: 

1)每个客户端都生成公私钥文件:

ssh-keygen -t rsa -P ‘‘ -f /root/.ssh/id_rsa(注:有几个主机,就在每个主机上执行几次)

2)将所有远程机器的公钥都复制到当前自己的文件下authorized_keys:

机器一进行公钥复制:ssh-copy-id  -i /root/.ssh/id_rsa_pub  192.168.34.100(注:该ip为本地地址)

机器二进行公钥复制:ssh-copy-id  -i /root/.ssh/id_rsa_pub   192.168.34.100

最后本机将自己的公钥文件也放入到authorized_keys中

ssh-copy-id  192.168.34.100

3)然后将本地的IP地址复制到远程机器上,实现所有的机器都有对方的公钥,也可以进行登录不需要秘钥登录:

ssh-copy-id  -i /root/.ssh/authorized   机器一的IP地址

ssh-copy-id  -i /root/.ssh/authorized   机器二的IP地址

最终结果:本地机器与其他主机连接一起就会免密,远程主机与本地主机连接也会免密。

 

实现一个循环创建秘钥对并将公钥传送到对方的脚本:

cat iplist.txt

192.168.34.100

192.168.34.101

192.168.34.102

 

 #!/bin/bash

user=lisi
password=zhangsan
ssh-keygen -t rsa -p ""  -f /root/.ssh/id_rsa

while read ip ;do
expect  <<EOF
set timeout 10
spawn  ssh-copy-id -i /root/.ssh/id_rsa.pub  $user@$ip
expect {
"yes/no"   {send  "yes ";exp_continue }
"password"  { send  "$password " }
}
expect  eof
EOF
done  < iplist.txt 

 

 

 

以上是关于CoaXPress 协议的CRC及其具体实现的主要内容,如果未能解决你的问题,请参考以下文章

BISS-C 8通道采集renishaw传感器及其CRC校验

CRC校验的概念及具体实现

SSH服务:

SSH原理与运用

SSH用法

SSH服务