|  | @@ -50,6 +50,7 @@ trn_cell_introduce1_new(void)
 | 
	
		
			
				|  |  |    trn_cell_introduce1_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce1_t));
 | 
	
		
			
				|  |  |    if (NULL == val)
 | 
	
		
			
				|  |  |      return NULL;
 | 
	
		
			
				|  |  | +  val->auth_key_type = TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_ED25519;
 | 
	
		
			
				|  |  |    return val;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -121,7 +122,7 @@ trn_cell_introduce1_get_auth_key_type(const trn_cell_introduce1_t *inp)
 | 
	
		
			
				|  |  |  int
 | 
	
		
			
				|  |  |  trn_cell_introduce1_set_auth_key_type(trn_cell_introduce1_t *inp, uint8_t val)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -  if (! ((val == 0 || val == 1 || val == 2))) {
 | 
	
		
			
				|  |  | +  if (! ((val == TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_ED25519 || val == TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_LEGACY0 || val == TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_LEGACY1))) {
 | 
	
		
			
				|  |  |       TRUNNEL_SET_ERROR_CODE(inp);
 | 
	
		
			
				|  |  |       return -1;
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -295,7 +296,7 @@ trn_cell_introduce1_check(const trn_cell_introduce1_t *obj)
 | 
	
		
			
				|  |  |      return "Object was NULL";
 | 
	
		
			
				|  |  |    if (obj->trunnel_error_code_)
 | 
	
		
			
				|  |  |      return "A set function failed on this object";
 | 
	
		
			
				|  |  | -  if (! (obj->auth_key_type == 0 || obj->auth_key_type == 1 || obj->auth_key_type == 2))
 | 
	
		
			
				|  |  | +  if (! (obj->auth_key_type == TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_ED25519 || obj->auth_key_type == TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_LEGACY0 || obj->auth_key_type == TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_LEGACY1))
 | 
	
		
			
				|  |  |      return "Integer out of bounds";
 | 
	
		
			
				|  |  |    if (TRUNNEL_DYNARRAY_LEN(&obj->auth_key) != obj->auth_key_len)
 | 
	
		
			
				|  |  |      return "Length mismatch for auth_key";
 | 
	
	
		
			
				|  | @@ -319,7 +320,7 @@ trn_cell_introduce1_encoded_len(const trn_cell_introduce1_t *obj)
 | 
	
		
			
				|  |  |    /* Length of u8 legacy_key_id[TRUNNEL_SHA1_LEN] */
 | 
	
		
			
				|  |  |    result += TRUNNEL_SHA1_LEN;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Length of u8 auth_key_type IN [0, 1, 2] */
 | 
	
		
			
				|  |  | +  /* Length of u8 auth_key_type IN [TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_ED25519, TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_LEGACY0, TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_LEGACY1] */
 | 
	
		
			
				|  |  |    result += 1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* Length of u16 auth_key_len */
 | 
	
	
		
			
				|  | @@ -367,7 +368,7 @@ trn_cell_introduce1_encode(uint8_t *output, const size_t avail, const trn_cell_i
 | 
	
		
			
				|  |  |    memcpy(ptr, obj->legacy_key_id, TRUNNEL_SHA1_LEN);
 | 
	
		
			
				|  |  |    written += TRUNNEL_SHA1_LEN; ptr += TRUNNEL_SHA1_LEN;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Encode u8 auth_key_type IN [0, 1, 2] */
 | 
	
		
			
				|  |  | +  /* Encode u8 auth_key_type IN [TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_ED25519, TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_LEGACY0, TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_LEGACY1] */
 | 
	
		
			
				|  |  |    trunnel_assert(written <= avail);
 | 
	
		
			
				|  |  |    if (avail - written < 1)
 | 
	
		
			
				|  |  |      goto truncated;
 | 
	
	
		
			
				|  | @@ -451,11 +452,11 @@ trn_cell_introduce1_parse_into(trn_cell_introduce1_t *obj, const uint8_t *input,
 | 
	
		
			
				|  |  |    memcpy(obj->legacy_key_id, ptr, TRUNNEL_SHA1_LEN);
 | 
	
		
			
				|  |  |    remaining -= TRUNNEL_SHA1_LEN; ptr += TRUNNEL_SHA1_LEN;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Parse u8 auth_key_type IN [0, 1, 2] */
 | 
	
		
			
				|  |  | +  /* Parse u8 auth_key_type IN [TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_ED25519, TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_LEGACY0, TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_LEGACY1] */
 | 
	
		
			
				|  |  |    CHECK_REMAINING(1, truncated);
 | 
	
		
			
				|  |  |    obj->auth_key_type = (trunnel_get_uint8(ptr));
 | 
	
		
			
				|  |  |    remaining -= 1; ptr += 1;
 | 
	
		
			
				|  |  | -  if (! (obj->auth_key_type == 0 || obj->auth_key_type == 1 || obj->auth_key_type == 2))
 | 
	
		
			
				|  |  | +  if (! (obj->auth_key_type == TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_ED25519 || obj->auth_key_type == TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_LEGACY0 || obj->auth_key_type == TRUNNEL_HS_INTRO_AUTH_KEY_TYPE_LEGACY1))
 | 
	
		
			
				|  |  |      goto fail;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* Parse u16 auth_key_len */
 | 
	
	
		
			
				|  | @@ -550,10 +551,6 @@ trn_cell_introduce_ack_get_status(const trn_cell_introduce_ack_t *inp)
 | 
	
		
			
				|  |  |  int
 | 
	
		
			
				|  |  |  trn_cell_introduce_ack_set_status(trn_cell_introduce_ack_t *inp, uint16_t val)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -  if (! ((val == 0 || val == 1 || val == 2))) {
 | 
	
		
			
				|  |  | -     TRUNNEL_SET_ERROR_CODE(inp);
 | 
	
		
			
				|  |  | -     return -1;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  |    inp->status = val;
 | 
	
		
			
				|  |  |    return 0;
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -587,8 +584,6 @@ trn_cell_introduce_ack_check(const trn_cell_introduce_ack_t *obj)
 | 
	
		
			
				|  |  |      return "Object was NULL";
 | 
	
		
			
				|  |  |    if (obj->trunnel_error_code_)
 | 
	
		
			
				|  |  |      return "A set function failed on this object";
 | 
	
		
			
				|  |  | -  if (! (obj->status == 0 || obj->status == 1 || obj->status == 2))
 | 
	
		
			
				|  |  | -    return "Integer out of bounds";
 | 
	
		
			
				|  |  |    {
 | 
	
		
			
				|  |  |      const char *msg;
 | 
	
		
			
				|  |  |      if (NULL != (msg = trn_cell_extension_check(obj->extensions)))
 | 
	
	
		
			
				|  | @@ -606,7 +601,7 @@ trn_cell_introduce_ack_encoded_len(const trn_cell_introduce_ack_t *obj)
 | 
	
		
			
				|  |  |       return -1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Length of u16 status IN [0, 1, 2] */
 | 
	
		
			
				|  |  | +  /* Length of u16 status */
 | 
	
		
			
				|  |  |    result += 2;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* Length of struct trn_cell_extension extensions */
 | 
	
	
		
			
				|  | @@ -638,7 +633,7 @@ trn_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const trn_cel
 | 
	
		
			
				|  |  |    trunnel_assert(encoded_len >= 0);
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Encode u16 status IN [0, 1, 2] */
 | 
	
		
			
				|  |  | +  /* Encode u16 status */
 | 
	
		
			
				|  |  |    trunnel_assert(written <= avail);
 | 
	
		
			
				|  |  |    if (avail - written < 2)
 | 
	
		
			
				|  |  |      goto truncated;
 | 
	
	
		
			
				|  | @@ -687,12 +682,10 @@ trn_cell_introduce_ack_parse_into(trn_cell_introduce_ack_t *obj, const uint8_t *
 | 
	
		
			
				|  |  |    ssize_t result = 0;
 | 
	
		
			
				|  |  |    (void)result;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Parse u16 status IN [0, 1, 2] */
 | 
	
		
			
				|  |  | +  /* Parse u16 status */
 | 
	
		
			
				|  |  |    CHECK_REMAINING(2, truncated);
 | 
	
		
			
				|  |  |    obj->status = trunnel_ntohs(trunnel_get_uint16(ptr));
 | 
	
		
			
				|  |  |    remaining -= 2; ptr += 2;
 | 
	
		
			
				|  |  | -  if (! (obj->status == 0 || obj->status == 1 || obj->status == 2))
 | 
	
		
			
				|  |  | -    goto fail;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* Parse struct trn_cell_extension extensions */
 | 
	
		
			
				|  |  |    result = trn_cell_extension_parse(&obj->extensions, ptr, remaining);
 | 
	
	
		
			
				|  | @@ -708,9 +701,6 @@ trn_cell_introduce_ack_parse_into(trn_cell_introduce_ack_t *obj, const uint8_t *
 | 
	
		
			
				|  |  |   relay_fail:
 | 
	
		
			
				|  |  |    trunnel_assert(result < 0);
 | 
	
		
			
				|  |  |    return result;
 | 
	
		
			
				|  |  | - fail:
 | 
	
		
			
				|  |  | -  result = -1;
 | 
	
		
			
				|  |  | -  return result;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ssize_t
 | 
	
	
		
			
				|  | @@ -733,7 +723,7 @@ trn_cell_introduce_encrypted_new(void)
 | 
	
		
			
				|  |  |    trn_cell_introduce_encrypted_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce_encrypted_t));
 | 
	
		
			
				|  |  |    if (NULL == val)
 | 
	
		
			
				|  |  |      return NULL;
 | 
	
		
			
				|  |  | -  val->onion_key_type = 1;
 | 
	
		
			
				|  |  | +  val->onion_key_type = TRUNNEL_HS_INTRO_ONION_KEY_TYPE_NTOR;
 | 
	
		
			
				|  |  |    return val;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -837,7 +827,7 @@ trn_cell_introduce_encrypted_get_onion_key_type(const trn_cell_introduce_encrypt
 | 
	
		
			
				|  |  |  int
 | 
	
		
			
				|  |  |  trn_cell_introduce_encrypted_set_onion_key_type(trn_cell_introduce_encrypted_t *inp, uint8_t val)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -  if (! ((val == 1))) {
 | 
	
		
			
				|  |  | +  if (! ((val == TRUNNEL_HS_INTRO_ONION_KEY_TYPE_NTOR))) {
 | 
	
		
			
				|  |  |       TRUNNEL_SET_ERROR_CODE(inp);
 | 
	
		
			
				|  |  |       return -1;
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -1079,7 +1069,7 @@ trn_cell_introduce_encrypted_check(const trn_cell_introduce_encrypted_t *obj)
 | 
	
		
			
				|  |  |      if (NULL != (msg = trn_cell_extension_check(obj->extensions)))
 | 
	
		
			
				|  |  |        return msg;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  if (! (obj->onion_key_type == 1))
 | 
	
		
			
				|  |  | +  if (! (obj->onion_key_type == TRUNNEL_HS_INTRO_ONION_KEY_TYPE_NTOR))
 | 
	
		
			
				|  |  |      return "Integer out of bounds";
 | 
	
		
			
				|  |  |    if (TRUNNEL_DYNARRAY_LEN(&obj->onion_key) != obj->onion_key_len)
 | 
	
		
			
				|  |  |      return "Length mismatch for onion_key";
 | 
	
	
		
			
				|  | @@ -1112,7 +1102,7 @@ trn_cell_introduce_encrypted_encoded_len(const trn_cell_introduce_encrypted_t *o
 | 
	
		
			
				|  |  |    /* Length of struct trn_cell_extension extensions */
 | 
	
		
			
				|  |  |    result += trn_cell_extension_encoded_len(obj->extensions);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Length of u8 onion_key_type IN [1] */
 | 
	
		
			
				|  |  | +  /* Length of u8 onion_key_type IN [TRUNNEL_HS_INTRO_ONION_KEY_TYPE_NTOR] */
 | 
	
		
			
				|  |  |    result += 1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* Length of u16 onion_key_len */
 | 
	
	
		
			
				|  | @@ -1176,7 +1166,7 @@ trn_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const t
 | 
	
		
			
				|  |  |      goto fail; /* XXXXXXX !*/
 | 
	
		
			
				|  |  |    written += result; ptr += result;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Encode u8 onion_key_type IN [1] */
 | 
	
		
			
				|  |  | +  /* Encode u8 onion_key_type IN [TRUNNEL_HS_INTRO_ONION_KEY_TYPE_NTOR] */
 | 
	
		
			
				|  |  |    trunnel_assert(written <= avail);
 | 
	
		
			
				|  |  |    if (avail - written < 1)
 | 
	
		
			
				|  |  |      goto truncated;
 | 
	
	
		
			
				|  | @@ -1280,11 +1270,11 @@ trn_cell_introduce_encrypted_parse_into(trn_cell_introduce_encrypted_t *obj, con
 | 
	
		
			
				|  |  |    trunnel_assert((size_t)result <= remaining);
 | 
	
		
			
				|  |  |    remaining -= result; ptr += result;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Parse u8 onion_key_type IN [1] */
 | 
	
		
			
				|  |  | +  /* Parse u8 onion_key_type IN [TRUNNEL_HS_INTRO_ONION_KEY_TYPE_NTOR] */
 | 
	
		
			
				|  |  |    CHECK_REMAINING(1, truncated);
 | 
	
		
			
				|  |  |    obj->onion_key_type = (trunnel_get_uint8(ptr));
 | 
	
		
			
				|  |  |    remaining -= 1; ptr += 1;
 | 
	
		
			
				|  |  | -  if (! (obj->onion_key_type == 1))
 | 
	
		
			
				|  |  | +  if (! (obj->onion_key_type == TRUNNEL_HS_INTRO_ONION_KEY_TYPE_NTOR))
 | 
	
		
			
				|  |  |      goto fail;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* Parse u16 onion_key_len */
 |