C语言指针操作字符数组demo,本意是使用指针操作source,函数调用一次取16个字节,调用两次获取到整个数据。
char source[32] = {0};
int *header = (int *)source;
int *pos = (int *)source;
void print_value(int *arg0, int *arg1, int *arg2, int *arg3)
{
if ( 4 * (pos - header) >= 32)
pos = header;
*arg0 = *pos;
pos++;
*arg1 = *pos;
pos++;
*arg2 = *pos;
pos++;
*arg3 = *pos;
pos++;
printf("arg0:%x, arg1:%x, arg2:%x, arg3:%x\n", *arg0, *arg1, *arg2, *arg3);
}
int main(void) {
memcpy(source, "11223344112233445566778855667788", 32);
printf("sourceData is:\n");
for (int i = 0; i < 32; i++)
{
printf("%x", source[i]);
}
printf("\n");
printf("Result:\n");
int arg0;
int arg1;
int arg2;
int arg3;
char data[32] = {0};
for (int j = 0; j < 2; j++)
{
print_value(&arg0, &arg1, &arg2, &arg3);
}
printf("print again.\n");
for (int j = 0; j < 2; j++)
{
print_value(&arg0, &arg1, &arg2, &arg3);
}
}
运行结果:
$ ./test
sourceData is:
3131323233333434313132323333343435353636373738383535363637373838
Result:
arg0:32323131, arg1:34343333, arg2:32323131, arg3:34343333
arg0:36363535, arg1:38383737, arg2:36363535, arg3:38383737
print again.
arg0:32323131, arg1:34343333, arg2:32323131, arg3:34343333
arg0:36363535, arg1:38383737, arg2:36363535, arg3:38383737
$
===================================================
下面是稍微变化点的操作,
需求是这样的:操作RPMB的data_frame长度是512字节,写入数据时需要计算数据的hmac,但是计算hmac是从data_frame结构体去掉stuff和keymac后数据。
RPMB data_frame的结构体定义如下:
#define RPMB_SZ_STUFF 196
#define RPMB_SZ_MAC 32
#define RPMB_SZ_DATA 256
#define RPMB_SZ_NONCE 16
#define RPMB_SZ_COUNTER 4
#define RPMB_SZ_ADDRESS 2
#define RPMB_SZ_BLK_COUNT 2
#define RPMB_SZ_RESULT 2
#define RPMB_SZ_REQ_RESP 2
#define RPMB_SZ_RESERVED 4
#define HMAC_DATALEN
#define HMAC_COUNT(x) (x + 1)
typedef struct {
char Stuff[RPMB_SZ_STUFF];
char KeyMac[RPMB_SZ_MAC];
char Data[RPMB_SZ_DATA];
char Nonce[RPMB_SZ_NONCE]; //16bytes
char WriteCounter[RPMB_SZ_COUNTER]; //4bytes
char Address[RPMB_SZ_ADDRESS]; //2bytes
char BlockCount[RPMB_SZ_BLK_COUNT]; //2bytes
char Result[RPMB_SZ_RESULT]; //2bytes
char RequestResponse[RPMB_SZ_REQ_RESP]; //2bytes
} RpmbDataFrame;
为了便于跨模块调用,这里重新定义了一个新的结构体,去掉了Stuff和KeyMac字段,如下:
typedef struct { //total 288byte = 16 * 18
char Hmac_Data[RPMB_SZ_DATA]; //256 bytes
char Hmac_Nonce[RPMB_SZ_NONCE]; //16 bytes
char Hmac_WriteCounter[RPMB_SZ_COUNTER]; //4 bytes
char Hmac_Address[RPMB_SZ_ADDRESS]; //2 bytes
char Hmac_BlockCount[RPMB_SZ_BLK_COUNT]; //2 bytes
char Hmac_Result[RPMB_SZ_RESULT]; //2 bytes
char Hmac_RequestResponse[RPMB_SZ_REQ_RESP]; //2 bytes
char Hmac_Reserved[RPMB_SZ_RESERVED]; //4 bytes
} HmacRpmbDataFrame;
下面开始构建测试的数据,传输时可能会用到这些字段
RpmbDataFrame dataFrame;
memset(&dataFrame, 0, sizeof(RpmbDataFrame));
//init data
memcpy(dataFrame.Stuff, "aaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaa", 196);
memcpy(dataFrame.KeyMac, "hhiijjkkhhiijjkkhhiijjkkhhiijjkk", 32);
memcpy(dataFrame.Data, "1111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444", 256);
memcpy(dataFrame.WriteCounter, "1234", RPMB_SZ_COUNTER); //4 bytes
memcpy(dataFrame.Address, "12", RPMB_SZ_COUNTER); //2 byte
memcpy(dataFrame.BlockCount, "34", RPMB_SZ_BLK_COUNT); //2 bytes
memcpy(dataFrame.RequestResponse, "56", RPMB_SZ_REQ_RESP); //2 bytes
然后我们把这些初始的数据,拷贝到另一个待运算的结构体中
//copy data to HmacRpmbDataFrame struct
HmacRpmbDataFrame hmacRpmbData;
memset(&hmacRpmbData, 0, sizeof(HmacRpmbDataFrame));
memcpy(hmacRpmbData.Hmac_Data, dataFrame.Data, RPMB_SZ_DATA);
memcpy(hmacRpmbData.Hmac_Nonce, dataFrame.Nonce, RPMB_SZ_NONCE);
memcpy(hmacRpmbData.Hmac_WriteCounter, dataFrame.WriteCounter, RPMB_SZ_COUNTER);
memcpy(hmacRpmbData.Hmac_Address, dataFrame.Address, RPMB_SZ_ADDRESS);
memcpy(hmacRpmbData.Hmac_BlockCount, dataFrame.BlockCount, RPMB_SZ_BLK_COUNT);
memcpy(hmacRpmbData.Hmac_Result, dataFrame.Result, RPMB_SZ_RESULT);
memcpy(hmacRpmbData.Hmac_RequestResponse, dataFrame.RequestResponse, RPMB_SZ_REQ_RESP);
接下来的跨模块传输需求是一次只能发送16个字节,函数有四个参数,每个参数4个字节。
int *RotInfoPoint = (int *)&hmacRpmbData;
int *RotInfoPointHeader = (int *)&hmacRpmbData;
int arg0, arg1, arg2, arg3;
for (int i = 0; i < 18; i++) //284 bytes ,18*16 = 288
{
arg0 = *RotInfoPoint;
RotInfoPoint++;
arg1 = *RotInfoPoint;
RotInfoPoint++;
arg2 = *RotInfoPoint;
RotInfoPoint++;
arg3 = *RotInfoPoint;
RotInfoPoint++;
printf("[%d] arg0:0x%x, arg1:0x%x, arg2:0x%x, arg3:0x%x\n",
i+1, arg0,arg1,arg2,arg3);
}
//reset point to header position
RotInfoPoint = RotInfoPointHeader;
完整demo Code:
#define RPMB_SZ_STUFF 196
#define RPMB_SZ_MAC 32
#define RPMB_SZ_DATA 256
#define RPMB_SZ_NONCE 16
#define RPMB_SZ_COUNTER 4
#define RPMB_SZ_ADDRESS 2
#define RPMB_SZ_BLK_COUNT 2
#define RPMB_SZ_RESULT 2
#define RPMB_SZ_REQ_RESP 2
#define RPMB_SZ_RESERVED 4
#define HMAC_DATALEN
#define HMAC_COUNT(x) (x + 1)
typedef struct {
char Stuff[RPMB_SZ_STUFF];
char KeyMac[RPMB_SZ_MAC];
char Data[RPMB_SZ_DATA];
char Nonce[RPMB_SZ_NONCE]; //16bytes
char WriteCounter[RPMB_SZ_COUNTER]; //4bytes
char Address[RPMB_SZ_ADDRESS]; //2bytes
char BlockCount[RPMB_SZ_BLK_COUNT]; //2bytes
char Result[RPMB_SZ_RESULT]; //2bytes
char RequestResponse[RPMB_SZ_REQ_RESP]; //2bytes
} RpmbDataFrame;
typedef struct { //total 288byte = 16 * 18
char Hmac_Data[RPMB_SZ_DATA]; //256 bytes
char Hmac_Nonce[RPMB_SZ_NONCE]; //16 bytes
char Hmac_WriteCounter[RPMB_SZ_COUNTER]; //4 bytes
char Hmac_Address[RPMB_SZ_ADDRESS]; //2 bytes
char Hmac_BlockCount[RPMB_SZ_BLK_COUNT]; //2 bytes
char Hmac_Result[RPMB_SZ_RESULT]; //2 bytes
char Hmac_RequestResponse[RPMB_SZ_REQ_RESP]; //2 bytes
char Hmac_Reserved[RPMB_SZ_RESERVED]; //4 bytes
} HmacRpmbDataFrame;
int main(void) {
printf("test hmac\n");
RpmbDataFrame dataFrame;
memset(&dataFrame, 0, sizeof(RpmbDataFrame));
//init data
memcpy(dataFrame.Stuff, "aaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaa", 196);
memcpy(dataFrame.KeyMac, "hhiijjkkhhiijjkkhhiijjkkhhiijjkk", 32);
memcpy(dataFrame.Data, "1111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444", 256);
memcpy(dataFrame.WriteCounter, "1234", RPMB_SZ_COUNTER); //4 bytes
memcpy(dataFrame.Address, "12", RPMB_SZ_COUNTER); //2 byte
memcpy(dataFrame.BlockCount, "34", RPMB_SZ_BLK_COUNT); //2 bytes
memcpy(dataFrame.RequestResponse, "56", RPMB_SZ_REQ_RESP); //2 bytes
//copy data to HmacRpmbDataFrame struct
HmacRpmbDataFrame hmacRpmbData;
memset(&hmacRpmbData, 0, sizeof(HmacRpmbDataFrame));
memcpy(hmacRpmbData.Hmac_Data, dataFrame.Data, RPMB_SZ_DATA);
memcpy(hmacRpmbData.Hmac_Nonce, dataFrame.Nonce, RPMB_SZ_NONCE);
memcpy(hmacRpmbData.Hmac_WriteCounter, dataFrame.WriteCounter, RPMB_SZ_COUNTER);
memcpy(hmacRpmbData.Hmac_Address, dataFrame.Address, RPMB_SZ_ADDRESS);
memcpy(hmacRpmbData.Hmac_BlockCount, dataFrame.BlockCount, RPMB_SZ_BLK_COUNT);
memcpy(hmacRpmbData.Hmac_Result, dataFrame.Result, RPMB_SZ_RESULT);
memcpy(hmacRpmbData.Hmac_RequestResponse, dataFrame.RequestResponse, RPMB_SZ_REQ_RESP);
int *RotInfoPoint = (int *)&hmacRpmbData;
int *RotInfoPointHeader = (int *)&hmacRpmbData;
int arg0, arg1, arg2, arg3;
for (int i = 0; i < 18; i++) //284 bytes ,18*16 = 288
{
arg0 = *RotInfoPoint;
RotInfoPoint++;
arg1 = *RotInfoPoint;
RotInfoPoint++;
arg2 = *RotInfoPoint;
RotInfoPoint++;
arg3 = *RotInfoPoint;
RotInfoPoint++;
printf("[%d] arg0:0x%x, arg1:0x%x, arg2:0x%x, arg3:0x%x\n",
i+1, arg0,arg1,arg2,arg3);
}
//reset point to header position
RotInfoPoint = RotInfoPointHeader;
printf("test hmac done.\n");
}
运行结果:
$ ./test
test hmac
[1] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[2] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[3] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[4] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[5] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[6] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[7] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[8] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[9] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[10] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[11] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[12] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[13] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[14] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[15] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[16] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[17] arg0:0x0, arg1:0x0, arg2:0x0, arg3:0x0
[18] arg0:0x34333231, arg1:0x34333231, arg2:0x36350000, arg3:0x0
test hmac done.
$