Exemple #1
0
//Begin ClientCode
int main(int argc, char ** argv)
{

#ifdef CSEC_VERIFY
  assume_string("clientID");
  assume_string("serverID");
  assume_string("port_ascii");

  // Assumption that the corresponding argv fields indeed contains the correct ids:
  readenvL(argv[1], strlen(argv[1]), "clientID");
  readenvL(argv[2], strlen(argv[2]), "serverID");
  readenvL(argv[3], strlen(argv[3]), "port_ascii");
#endif

  RPCstate clState;

  clState.end = CLIENT;

  if (parseargs(argc,argv,&clState))
  {
#ifdef VERBOSE
    fprintf(stdout, "Usage: client clientAddress serverAddress [port] request\n");
#endif
    exit(-1);
  }

#ifdef VERBOSE
  printf("Client: Now connecting to ");
  print_text_buffer(clState.other,clState.other_len);
  printf(", port %d.\n", clState.port);
  fflush(stdout);
#endif
  // Getting arguments
  if (socket_connect(&(clState.conn_fd),(char*) clState.other, clState.other_len, clState.port))
    return -1;
  clState.k_ab = get_shared_key(clState.self, clState.self_len, clState.other, clState.other_len, &(clState.k_ab_len));
  clState.k = mk_session_key(&(clState.k_len));
  clState.response = NULL;

#ifdef CSEC_VERIFY
  event3("client_begin", clState.self, clState.self_len, clState.other, clState.other_len, clState.request, clState.request_len);
#endif

  /* Send request */
  if (send_request(&clState) < 0) return -1;

  /* Receive response */
  if (recv_response(&clState) < 0) return -1;

#ifdef CSEC_VERIFY
  event4("client_accept", clState.self, clState.self_len, clState.other, clState.other_len,
                          clState.request, clState.request_len, clState.response, clState.response_len);
#endif

  return 0;
}
Exemple #2
0
int recv_response(RPCstate * ctx)
{
  unsigned char * m2_e;
  uint32_t m2_e_len;

  recv(&(ctx->conn_fd), (unsigned char*) &m2_e_len, sizeof(m2_e_len));
  // Check if the read length is within bounds
  if (m2_e_len < MIN_MSG2_LENGTH || m2_e_len > MAX_MSG2_LENGTH)
    fail("client: msg2 has wrong length: %d", m2_e_len);

  m2_e = malloc(m2_e_len);
  if (m2_e == NULL)
    return -1;
  recv(&(ctx->conn_fd), m2_e, m2_e_len);

#ifdef VERBOSE
  printf("Client: Received encrypted message: ");
  print_buffer(m2_e,m2_e_len);
  fflush(stdout);
#endif

  ctx->response_len = decrypt_len(ctx->k, ctx->k_len, m2_e, m2_e_len);
  if (ctx->response_len > MAX_PAYLOAD_LENGTH)
  {
    free(m2_e);
    return -1;
  }

  ctx->response = malloc(ctx->response_len);
  if (ctx->response == NULL)
  {
    free(m2_e);
    return -1;
  }
  // this call returns 0 if not encrypted with the right key
  ctx->response_len = decrypt(ctx->k, ctx->k_len, m2_e, m2_e_len, ctx->response);
  if (ctx->response_len == 0)
  {
    free(m2_e);
    return -1;
  }

  if(ctx->response_len < MIN_PAYLOAD_LENGTH || ctx->response_len > MAX_PAYLOAD_LENGTH)
    fail("Client: response too long: %d", ctx->response_len);

#ifdef VERBOSE
  printf("Client: Received and authenticated response: ");
  print_text_buffer(ctx->response,ctx->response_len);
  printf("\n");
  fflush(stdout);
#endif

  return 0;
}
Exemple #3
0
void show_inv_field(SaHpiIdrFieldT *Field, int del, hpi_ui_print_cb_t proc)
{
    char    buf[SHOW_BUF_SZ], *str;
    int     len;

    del <<= 1;
    len = SHOW_BUF_SZ - del;
    str = buf + del;
    memset(buf, ' ', SHOW_BUF_SZ);
    snprintf(str, len, "Field Id: %d\n", Field->FieldId);
    if (proc(buf) != 0) return;
    snprintf(str, len, "Field Type: %s\n", oh_lookup_idrfieldtype(Field->Type));
    if (proc(buf) != 0) return;
    snprintf(str, len, "ReadOnly: %s\n", HPIBOOL2STR( Field->ReadOnly ));
    if (proc(buf) != 0) return;
    *str = 0;
    proc(buf);
    print_text_buffer("Content: ", &(Field->Field), "\n", proc);
}
Exemple #4
0
SaErrorT show_inventory(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid,
			SaHpiIdrIdT IdrId, hpi_ui_print_cb_t proc)
{
	SaHpiIdrInfoT		info;
	SaErrorT		rv;
	SaHpiEntryIdT		entryid, nextentryid;
	SaHpiEntryIdT		fentryid, nextfentryid;
	SaHpiIdrAreaHeaderT	hdr;
	SaHpiIdrFieldT		field;
	char			buf[SHOW_BUF_SZ];
	char			*str;
	int			num;

	rv = saHpiIdrInfoGet(sessionid, resourceid, IdrId, &info);
	if (rv != SA_OK) {
		snprintf(buf, SHOW_BUF_SZ, "ERROR!!! saHpiIdrInfoGet: %s\n",
			oh_lookup_error(rv));
		proc(buf);
		return(-1);
	};
	num = info.NumAreas;
	snprintf(buf, SHOW_BUF_SZ,
		"Inventory: %d   Update count: %d   Read only: %d   Areas: %d\n",
		info.IdrId, info.UpdateCount, info.ReadOnly, num);
	if (proc(buf) != 0) return(SA_OK);
	entryid = SAHPI_FIRST_ENTRY;
	while ((entryid != SAHPI_LAST_ENTRY) && (num > 0)) {
		rv = saHpiIdrAreaHeaderGet(sessionid, resourceid, IdrId,
			SAHPI_IDR_AREATYPE_UNSPECIFIED, entryid,
			&nextentryid, &hdr);
		if (rv != SA_OK) {
			proc("ERROR!!! saHpiIdrAreaHeaderGet\n");
			return(-1);
		};
		str = oh_lookup_idrareatype(hdr.Type);
		if (str == NULL) str = "Unknown";
		snprintf(buf, SHOW_BUF_SZ,
			"    Area: %d   Type: %s   Read Only: %d   Fields: %d\n",
			hdr.AreaId, str, hdr.ReadOnly, hdr.NumFields);
		if (proc(buf) != 0) return(SA_OK);
		fentryid = SAHPI_FIRST_ENTRY;
		entryid = nextentryid;
		while ((fentryid != SAHPI_LAST_ENTRY) && (hdr.NumFields > 0)) {
			rv = saHpiIdrFieldGet(sessionid, resourceid, IdrId, hdr.AreaId,
				SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fentryid,
				&nextfentryid, &field);
			if (rv != SA_OK) {
				proc("ERROR!!! saHpiIdrFieldGet\n");
				return(-1);
			};
			str = oh_lookup_idrfieldtype(field.Type);
			if (str == NULL) str = "Unknown";
			snprintf(buf, SHOW_BUF_SZ,
				"        Field: %d  Type: %s Read Only: %d (",
				field.FieldId, str, field.ReadOnly);
			if (proc(buf) != 0) return(SA_OK);
			if (print_text_buffer(NULL, &(field.Field), NULL, proc) != 0)
				return(SA_OK);
			if (proc(")\n") != 0) return(SA_OK);
			fentryid = nextfentryid;
		}
	};
	return(SA_OK);
}
Exemple #5
0
static Pr_ret_t show_attrs(Attributes_t *Attrs, int delta, hpi_ui_print_cb_t proc)
{
	int		i, type, len, del;
	char		tmp[256], *name;
	char		buf[SHOW_BUF_SZ];
	union_type_t	val;
	SaErrorT	rv;
	Pr_ret_t	ret;

	memset(buf, ' ', SHOW_BUF_SZ);
	del = delta << 1;
	len = SHOW_BUF_SZ - del;
	for (i = 0; i < Attrs->n_attrs; i++) {
		name = get_attr_name(Attrs, i);
		if (name == (char *)NULL)
			break;
		rv = get_value(Attrs, i, &val);
		if (rv != SA_OK) continue;
		type = get_attr_type(Attrs, i);
		switch (type) {
			case NO_TYPE:	continue;
			case STRUCT_TYPE:
				snprintf(buf + del, len, "%s:\n", name);
				if (proc(buf) != 0) return(-1);
				rv = get_value(Attrs, i, &val);
				if (rv != SA_OK) continue;
				ret = show_attrs((Attributes_t *)(val.a),
					delta + 1, proc);
				if (ret != HPI_UI_OK) return(HPI_UI_END);
				continue;
			case LOOKUP_TYPE:
				strncpy(tmp, lookup_proc(Attrs->Attrs[i].lunum,
					val.i), 256);
				break;
			case DECODE_TYPE:
				rv = decode_proc(Attrs->Attrs[i].lunum, val.a,
					tmp, 256);
				if (rv != SA_OK) continue;
				break;
			case DECODE1_TYPE:
				rv = decode1_proc(Attrs->Attrs[i].lunum, val.i,
					tmp, 256);
				if (rv != SA_OK) continue;
				break;
			case READING_TYPE:
				if (thres_value(val.a, tmp, 256) != SA_OK)
					continue;
				break;
			case TEXT_BUFF_TYPE:
				snprintf(buf + del, len, "%s: ", name);
				if (proc(buf) != HPI_UI_OK) return(HPI_UI_END);
				ret = print_text_buffer(NULL, val.a, "\n", proc);
				if (ret != HPI_UI_OK) return(HPI_UI_END);
				continue;
			default:
				rv = get_value_as_string(Attrs, i, tmp, 256);
				if (rv != SA_OK) continue;
		};
		snprintf(buf + del, len, "%s: %s\n", name, tmp);
		if (proc(buf) != HPI_UI_OK) return(HPI_UI_END);
	};
	return(0);
}
Exemple #6
0
int send_request(RPCstate * ctx)
{
  uint32_t m1_len, m1_e_len, full_len;
  unsigned char * m1, * p, * m1_e;

#ifdef VERBOSE
  printf("Client: Preparing to send request: ");
  print_text_buffer(ctx->request,ctx->request_len);
  printf("\nand session key: ");
  print_buffer(ctx->k,ctx->k_len);
  fflush(stdout);
#endif

  m1_len = 1 + ctx->k_len + sizeof(ctx->request_len) + ctx->request_len;
  p = m1 = malloc(m1_len);
  if (m1 == NULL) return -1;

  memcpy(p, "p", 1);
  p += 1;
  *((uint32_t *) p) = ctx->request_len;
  p += sizeof(ctx->request_len);
  memcpy(p, ctx->request, ctx->request_len);
  p += ctx->request_len;
  memcpy(p, ctx->k, ctx->k_len);

  full_len = 1 + sizeof(ctx->self_len) + ctx->self_len + encrypt_len(ctx->k_ab, ctx->k_ab_len, m1, m1_len);
  p = m1_e = malloc(full_len);
  if (m1_e == NULL)
  {
    free(m1);
    return -1;
  }
  memcpy(p, "p", 1);
  p += 1;
  *((uint32_t *) p) = ctx->self_len;
  p += sizeof(ctx->self_len);
  memcpy(p, ctx->self, ctx->self_len);
  p += ctx->self_len;
  m1_e_len = encrypt(ctx->k_ab, ctx->k_ab_len, m1, m1_len, p);
  if (m1_e_len == 0)
  {
    free(m1);
    return -1;
  }
  full_len = 1 + sizeof(ctx->self_len) + ctx->self_len + m1_e_len;

#ifdef VERBOSE
  printf("Client: Sending message: %.1s | %u | ", m1_e, *((uint32_t*) (m1_e + 1)));
  print_text_buffer(m1_e + 1 + sizeof(uint32_t),ctx->self_len);
  printf(" | ");
  print_buffer(p,m1_e_len);
  fflush(stdout);
#endif

  send(&(ctx->conn_fd), (unsigned char *) &full_len, sizeof(full_len));
  send(&(ctx->conn_fd), m1_e, full_len);

  free(m1);
  free(m1_e);

  return 0;
}