buttplug 2.1.5

Buttplug Intimate Hardware Control Library
Documentation
syntax = "proto3";
package protocomm;

/* Allowed values for the status
 * of a protocomm instance */
 enum Status {
  Success = 0;
  InvalidSecScheme = 1;
  InvalidProto = 2;
  TooManySessions = 3;
  InvalidArgument = 4;
  InternalError = 5;
  CryptoError = 6;
  InvalidSession = 7;
}

/* Data structure of Session command/request packet */
message S0SessionCmd {

}

/* Data structure of Session response packet */
message S0SessionResp {
    Status status = 1;
}

/* A message must be of type Cmd or Resp */
enum Sec0MsgType {
    S0_Session_Command = 0;
    S0_Session_Response = 1;
}

/* Payload structure of session data */
message Sec0Payload {
    Sec0MsgType msg = 1;        /*!< Type of message */
    oneof payload {
        S0SessionCmd sc = 20;   /*!< Payload data interpreted as Cmd */
        S0SessionResp sr = 21;  /*!< Payload data interpreted as Resp */
    }
}

/* Data structure of Session command1 packet */
message SessionCmd1 {
  bytes client_verify_data = 2;
}

/* Data structure of Session response1 packet */
message SessionResp1 {
  Status status = 1;
  bytes device_verify_data = 3;
}

/* Data structure of Session command0 packet */
message SessionCmd0 {
  bytes client_pubkey = 1;
}

/* Data structure of Session response0 packet */
message SessionResp0 {
  Status status = 1;
  bytes device_pubkey = 2;
  bytes device_random = 3;
}

/* A message must be of type Cmd0 / Cmd1 / Resp0 / Resp1 */
enum Sec1MsgType {
  Session_Command0 = 0;
  Session_Response0 = 1;
  Session_Command1 = 2;
  Session_Response1 = 3;
}

/* Payload structure of session data */
message Sec1Payload {
  Sec1MsgType msg = 1;        /*!< Type of message */
  oneof payload {
      SessionCmd0 sc0 = 20;   /*!< Payload data interpreted as Cmd0 */
      SessionResp0 sr0 = 21;  /*!< Payload data interpreted as Resp0 */
      SessionCmd1 sc1 = 22;   /*!< Payload data interpreted as Cmd1 */
      SessionResp1 sr1 = 23;  /*!< Payload data interpreted as Resp1 */
  }
}


/* Allowed values for the type of security
 * being used in a protocomm session */
enum SecSchemeVersion {
    SecScheme0 = 0; /*!< Unsecured - plaintext communication */
    SecScheme1 = 1; /*!< Security scheme 1 - Curve25519 + AES-256-CTR*/
}

/* Data structure exchanged when establishing
 * secure session between Host and Client */
message SessionData {
    SecSchemeVersion sec_ver = 2;   /*!< Type of security */
    oneof proto {
        Sec0Payload sec0 = 10;      /*!< Payload data in case of security 0 */
        Sec1Payload sec1 = 11;      /*!< Payload data in case of security 1 */
    }
}