(root)/
strace-6.5/
tests-m32/
netlink_crypto.c
       1  /*
       2   * Copyright (c) 2017 JingPiao Chen <chenjingpiao@gmail.com>
       3   * Copyright (c) 2017-2021 The strace developers.
       4   * All rights reserved.
       5   *
       6   * SPDX-License-Identifier: GPL-2.0-or-later
       7   */
       8  
       9  #include "tests.h"
      10  
      11  #include <stdio.h>
      12  #include <unistd.h>
      13  #include <sys/socket.h>
      14  #include <linux/cryptouser.h>
      15  #include "test_netlink.h"
      16  
      17  #define XLAT_MACROS_ONLY
      18  # include "xlat/netlink_protocols.h"
      19  #undef XLAT_MACROS_ONLY
      20  
      21  static void
      22  test_nlmsg_type(const int fd)
      23  {
      24  	long rc;
      25  	struct nlmsghdr nlh = {
      26  		.nlmsg_len = sizeof(nlh),
      27  		.nlmsg_type = CRYPTO_MSG_NEWALG,
      28  		.nlmsg_flags = NLM_F_REQUEST,
      29  	};
      30  
      31  	rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
      32  	printf("sendto(%d, {nlmsg_len=%u, nlmsg_type=CRYPTO_MSG_NEWALG"
      33  	       ", nlmsg_flags=NLM_F_REQUEST, nlmsg_seq=0, nlmsg_pid=0}"
      34  	       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
      35  	       fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
      36  }
      37  
      38  static void
      39  test_nlmsg_flags(const int fd)
      40  {
      41  	long rc;
      42  	struct nlmsghdr nlh = {
      43  		.nlmsg_len = sizeof(nlh),
      44  	};
      45  
      46  	nlh.nlmsg_type = CRYPTO_MSG_GETALG;
      47  	nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
      48  	rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
      49  	printf("sendto(%d, {nlmsg_len=%u, nlmsg_type=CRYPTO_MSG_GETALG"
      50  	       ", nlmsg_flags=NLM_F_REQUEST|NLM_F_DUMP, nlmsg_seq=0"
      51  	       ", nlmsg_pid=0}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
      52  	       fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
      53  
      54  	nlh.nlmsg_type = CRYPTO_MSG_NEWALG;
      55  	nlh.nlmsg_flags = NLM_F_ECHO | NLM_F_REPLACE;
      56  	rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
      57  	printf("sendto(%d, {nlmsg_len=%u, nlmsg_type=CRYPTO_MSG_NEWALG"
      58  	       ", nlmsg_flags=NLM_F_ECHO|NLM_F_REPLACE, nlmsg_seq=0"
      59  	       ", nlmsg_pid=0}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
      60  	       fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
      61  
      62  	nlh.nlmsg_type = CRYPTO_MSG_DELALG;
      63  	nlh.nlmsg_flags = NLM_F_ECHO | NLM_F_NONREC;
      64  	rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
      65  	printf("sendto(%d, {nlmsg_len=%u, nlmsg_type=CRYPTO_MSG_DELALG"
      66  	       ", nlmsg_flags=NLM_F_ECHO|NLM_F_NONREC, nlmsg_seq=0"
      67  	       ", nlmsg_pid=0}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
      68  	       fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
      69  
      70  	nlh.nlmsg_type = CRYPTO_MSG_UPDATEALG;
      71  	nlh.nlmsg_flags = NLM_F_REPLACE;
      72  	rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
      73  	printf("sendto(%d, {nlmsg_len=%u, nlmsg_type=CRYPTO_MSG_UPDATEALG"
      74  	       ", nlmsg_flags=%#x /* NLM_F_??? */, nlmsg_seq=0, nlmsg_pid=0}"
      75  	       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
      76  	       fd, nlh.nlmsg_len, NLM_F_REPLACE,
      77  	       (unsigned) sizeof(nlh), sprintrc(rc));
      78  }
      79  
      80  static void
      81  test_crypto_msg_newalg(const int fd)
      82  {
      83  	struct crypto_user_alg alg = {
      84  		.cru_name = "abcd",
      85  		.cru_driver_name = "efgh",
      86  		.cru_module_name = "dcba",
      87  		.cru_type = 0xabcdfabc,
      88  		.cru_mask = 0xfedabacd,
      89  		.cru_refcnt = 0xbcacfacd,
      90  		.cru_flags = 0xefacdbad
      91  	};
      92  	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(alg));
      93  
      94  	TEST_NETLINK_OBJECT_EX(fd, nlh0,
      95  			       CRYPTO_MSG_NEWALG, NLM_F_REQUEST,
      96  			       alg, print_quoted_memory,
      97  			       printf("{cru_name=\"abcd\""
      98  				      ", cru_driver_name=\"efgh\""
      99  				      ", cru_module_name=\"dcba\"");
     100  			       printf(", ");
     101  			       PRINT_FIELD_X(alg, cru_type);
     102  			       printf(", ");
     103  			       PRINT_FIELD_X(alg, cru_mask);
     104  			       printf(", ");
     105  			       PRINT_FIELD_U(alg, cru_refcnt);
     106  			       printf(", ");
     107  			       PRINT_FIELD_X(alg, cru_flags);
     108  			       printf("}"));
     109  
     110  	fill_memory_ex(alg.cru_name, sizeof(alg.cru_name), '0', 10);
     111  	fill_memory_ex(alg.cru_driver_name, sizeof(alg.cru_driver_name),
     112  		       'a', 'z' - 'a' + 1);
     113  	fill_memory_ex(alg.cru_module_name, sizeof(alg.cru_module_name),
     114  		       'A', 'Z' - 'A' + 1);
     115  
     116  	TEST_NETLINK_OBJECT_EX(fd, nlh0,
     117  			       CRYPTO_MSG_NEWALG, NLM_F_REQUEST,
     118  			       alg, print_quoted_memory,
     119  			       printf("{cru_name=");
     120  			       print_quoted_memory(alg.cru_name,
     121  				       sizeof(alg.cru_name) - 1);
     122  			       printf("..., cru_driver_name=");
     123  			       print_quoted_memory(alg.cru_driver_name,
     124  				       sizeof(alg.cru_driver_name) - 1);
     125  			       printf("..., cru_module_name=");
     126  			       print_quoted_memory(alg.cru_module_name,
     127  				       sizeof(alg.cru_module_name) - 1);
     128  			       printf("..., ");
     129  			       PRINT_FIELD_X(alg, cru_type);
     130  			       printf(", ");
     131  			       PRINT_FIELD_X(alg, cru_mask);
     132  			       printf(", ");
     133  			       PRINT_FIELD_U(alg, cru_refcnt);
     134  			       printf(", ");
     135  			       PRINT_FIELD_X(alg, cru_flags);
     136  			       printf("}"));
     137  }
     138  
     139  static void
     140  test_crypto_msg_unspec(const int fd)
     141  {
     142  	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, 4);
     143  
     144  	TEST_NETLINK_(fd, nlh0,
     145  		      0xffff, "0xffff /* CRYPTO_MSG_??? */",
     146  		      NLM_F_REQUEST, "NLM_F_REQUEST",
     147  		      4, "abcd", 4, printf("\"\\x61\\x62\\x63\\x64\""));
     148  }
     149  
     150  int
     151  main(void)
     152  {
     153  	skip_if_unavailable("/proc/self/fd/");
     154  
     155  	int fd = create_nl_socket(NETLINK_CRYPTO);
     156  
     157  	test_nlmsg_type(fd);
     158  	test_nlmsg_flags(fd);
     159  	test_crypto_msg_newalg(fd);
     160  	test_crypto_msg_unspec(fd);
     161  
     162  	printf("+++ exited with 0 +++\n");
     163  
     164  	return 0;
     165  }