linux/drivers/staging/greybus/Documentation/firmware/authenticate.c
<<
>>
Prefs
   1// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
   2/*
   3 * Sample code to test CAP protocol
   4 *
   5 * Copyright(c) 2016 Google Inc. All rights reserved.
   6 * Copyright(c) 2016 Linaro Ltd. All rights reserved.
   7 */
   8
   9#include <stdio.h>
  10#include <string.h>
  11#include <unistd.h>
  12#include <sys/ioctl.h>
  13#include <sys/stat.h>
  14#include <fcntl.h>
  15
  16#include "../../greybus_authentication.h"
  17
  18struct cap_ioc_get_endpoint_uid uid;
  19struct cap_ioc_get_ims_certificate cert = {
  20        .certificate_class = 0,
  21        .certificate_id = 0,
  22};
  23
  24struct cap_ioc_authenticate authenticate = {
  25        .auth_type = 0,
  26        .challenge = {0},
  27};
  28
  29int main(int argc, char *argv[])
  30{
  31        unsigned int timeout = 10000;
  32        char *capdev;
  33        int fd, ret;
  34
  35        /* Make sure arguments are correct */
  36        if (argc != 2) {
  37                printf("\nUsage: ./firmware <Path of the gb-cap-X dev>\n");
  38                return 0;
  39        }
  40
  41        capdev = argv[1];
  42
  43        printf("Opening %s authentication device\n", capdev);
  44
  45        fd = open(capdev, O_RDWR);
  46        if (fd < 0) {
  47                printf("Failed to open: %s\n", capdev);
  48                return -1;
  49        }
  50
  51        /* Get UID */
  52        printf("Get UID\n");
  53
  54        ret = ioctl(fd, CAP_IOC_GET_ENDPOINT_UID, &uid);
  55        if (ret < 0) {
  56                printf("Failed to get UID: %s (%d)\n", capdev, ret);
  57                ret = -1;
  58                goto close_fd;
  59        }
  60
  61        printf("UID received: 0x%llx\n", *(unsigned long long int *)(uid.uid));
  62
  63        /* Get certificate */
  64        printf("Get IMS certificate\n");
  65
  66        ret = ioctl(fd, CAP_IOC_GET_IMS_CERTIFICATE, &cert);
  67        if (ret < 0) {
  68                printf("Failed to get IMS certificate: %s (%d)\n", capdev, ret);
  69                ret = -1;
  70                goto close_fd;
  71        }
  72
  73        printf("IMS Certificate size: %d\n", cert.cert_size);
  74
  75        /* Authenticate */
  76        printf("Authenticate module\n");
  77
  78        memcpy(authenticate.uid, uid.uid, 8);
  79
  80        ret = ioctl(fd, CAP_IOC_AUTHENTICATE, &authenticate);
  81        if (ret < 0) {
  82                printf("Failed to authenticate module: %s (%d)\n", capdev, ret);
  83                ret = -1;
  84                goto close_fd;
  85        }
  86
  87        printf("Authenticated, result (%02x), sig-size (%02x)\n",
  88                authenticate.result_code, authenticate.signature_size);
  89
  90close_fd:
  91        close(fd);
  92
  93        return ret;
  94}
  95