Implement a secure ICS protocol targeting LoRa Node151 microcontroller for controlling irrigation.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

102 Zeilen
3.3 KiB

  1. /*-
  2. * Copyright 2021 John-Mark Gurney.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. * 1. Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * 2. Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. *
  13. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  14. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  15. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  16. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  17. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  18. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  19. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  20. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  21. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  22. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  23. * SUCH DAMAGE.
  24. *
  25. */
  26. #ifndef __COMMS_H__
  27. #define __COMMS_H__ 1
  28. #include <sys/types.h>
  29. #include <stdint.h>
  30. #include <strobe.h>
  31. #include <x25519.h>
  32. #define COMMS_MAXMSG 64
  33. struct pktbuf {
  34. uint8_t *pkt;
  35. uint16_t pktlen;
  36. };
  37. /* first arg is input buffer, second arg is what will be sent as reply */
  38. typedef void (*process_msgfunc_t)(struct pktbuf, struct pktbuf *);
  39. enum comm_state {
  40. COMMS_WAIT_REQUEST_SHARED = 1,
  41. COMMS_WAIT_REQUEST_ECDHE,
  42. COMMS_WAIT_CONFIRM,
  43. COMMS_PROCESS_MSGS,
  44. };
  45. struct comms_session {
  46. strobe_s cs_crypto;
  47. enum comm_state cs_state;
  48. };
  49. /*
  50. * Each message will be passed to each state.
  51. *
  52. * cs_active can be in any state.
  53. * cs_pending can only be in a _WAIT_* state.
  54. *
  55. * When cs_pending advances to _PROCESS_MSGS, it will
  56. * replace cs_active, and cs_pending w/ be copied from cache
  57. * and set to _WAIT_REQUEST.
  58. *
  59. * If any message was not processed by the first to, a new session
  60. * will be attempted w/ the _start crypto state, and if it progresses
  61. * to _WAIT_CONFIG, it will replace cs_pending.
  62. *
  63. * We don't have to save the reply from a new session, because if the
  64. * reply gets lost, the initiator will send the request again and we'll
  65. * restart the session.
  66. */
  67. struct comms_state {
  68. struct comms_session cs_active; /* current active session */
  69. struct comms_session cs_pending; /* current pending session */
  70. unsigned char cs_respkey[EC_PRIVATE_BYTES]; /* private key for device */
  71. unsigned char cs_resppubkey[EC_PUBLIC_BYTES]; /* public key for device */
  72. unsigned char cs_initpubkey[EC_PUBLIC_BYTES]; /* public key for initiator */
  73. struct comms_session cs_start; /* special starting state cache */
  74. process_msgfunc_t cs_procmsg;
  75. struct pktbuf cs_prevmsg;
  76. struct pktbuf cs_prevmsgresp;
  77. uint8_t cs_prevmsgbuf[COMMS_MAXMSG];
  78. uint8_t cs_prevmsgrespbuf[COMMS_MAXMSG];
  79. };
  80. size_t _strobe_state_size();
  81. size_t _comms_state_size();
  82. int comms_init(struct comms_state *, process_msgfunc_t, struct pktbuf *, struct pktbuf *, struct pktbuf *);
  83. void comms_process(struct comms_state *, struct pktbuf, struct pktbuf *);
  84. #endif /* __COMMS_H__ */