 e2475934ac
			
		
	
	e2475934ac
	
	
	
		
			
			git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@302 ec53bebd-3082-4978-b11e-865c3cabbd6b
		
			
				
	
	
		
			248 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <krb5_locl.h>
 | |
| #include <k5_der.h>
 | |
| 
 | |
| static void
 | |
| time2generalizedtime (krb5_data *s, time_t t)
 | |
| {
 | |
|      struct tm *tm;
 | |
| 
 | |
|      s->data = malloc(16);
 | |
|      s->length = 15;
 | |
|      tm = gmtime (&t);
 | |
|      sprintf (s->data, "%04d%02d%02d%02d%02d%02dZ", tm->tm_year + 1900,
 | |
| 	      tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min,
 | |
| 	      tm->tm_sec);
 | |
| }
 | |
| 
 | |
| unsigned
 | |
| der_put_context_etypes (unsigned char *ptr, int tag,
 | |
| 			krb5_enctype *etypes, unsigned num_etypes)
 | |
| {
 | |
|      unsigned char *p = ptr;
 | |
|      int i;
 | |
| 
 | |
|      for (i = num_etypes - 1; i >= 0; --i)
 | |
| 	  p -= der_put_type_and_value (p, UT_Integer, &etypes[i]);
 | |
|      p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
 | |
|      p -= der_put_type (p, CONTEXT, CONS, tag, ptr - p);
 | |
|      return ptr - p;
 | |
| }
 | |
| 
 | |
| unsigned
 | |
| der_put_context_principalname (unsigned char *ptr, int tag,
 | |
| 			       krb5_principal name)
 | |
| {
 | |
|      unsigned char *p = ptr;
 | |
|      int i;
 | |
| 
 | |
|      if (name == NULL)
 | |
| 	  return 0;
 | |
|      for (i = name->ncomp - 1; i >= 0; --i)
 | |
| 	  p -= der_put_type_and_value (p, UT_GeneralString,
 | |
| 				       &name->comp[i]);
 | |
|      p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
 | |
|      p -= der_put_type (p, CONTEXT, CONS, 1, ptr - p);
 | |
|      p -= der_put_context (p, 0, UT_Integer, &name->type);
 | |
|      p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
 | |
|      p -= der_put_type (p, CONTEXT, CONS, tag, ptr - p);
 | |
|      return ptr - p;
 | |
| }
 | |
| 
 | |
| unsigned
 | |
| der_put_context_kdcoptions (unsigned char *ptr, int tag, KdcOptions *k)
 | |
| {
 | |
|      unsigned char *p = ptr;
 | |
|      /* XXX */
 | |
|      
 | |
|      *p-- = '\0';
 | |
|      *p-- = '\0';
 | |
|      *p-- = '\0';
 | |
|      *p-- = '\0';
 | |
|      *p-- = '\0';
 | |
|      *p-- = 5;
 | |
|      *p-- = 3;
 | |
|      p -= der_put_type (p, CONTEXT, CONS, tag, ptr - p);
 | |
|      return ptr - p;
 | |
| }
 | |
| 
 | |
| unsigned
 | |
| der_put_context_hostaddresses (unsigned char *ptr, int tag,
 | |
| 			       krb5_addresses addrs)
 | |
| {
 | |
|      unsigned char *p = ptr;
 | |
|      int i;
 | |
|      
 | |
|      for(i = addrs.number - 1; i >= 0; --i) {
 | |
| 	  p -= der_put_context (p, 1, UT_OctetString,
 | |
| 				&addrs.addrs[i].address);
 | |
| 	  p -= der_put_context (p, 0, UT_Integer,
 | |
| 				&addrs.addrs[i].type);
 | |
|      }
 | |
|      p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
 | |
|      p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
 | |
|      p -= der_put_type (p, CONTEXT, CONS, tag, ptr - p);
 | |
|      return ptr - p;
 | |
| }
 | |
| 
 | |
| unsigned
 | |
| der_put_kdc_req_body (unsigned char *ptr, Kdc_Req *k)
 | |
| {
 | |
|      unsigned char *p = ptr;
 | |
| 
 | |
|      /* additional-tickets[11] SEQUENCE OF Ticket OPTIONAL */
 | |
|      /* enc-authorization-data[10] EncryptedData OPTIONAL */
 | |
|      p -= der_put_context_hostaddresses (p, 9, k->addrs);
 | |
|      /* addresses[9] HostAddresses OPTIONAL */
 | |
|      p -= der_put_context_etypes (p, 8, k->etypes, k->num_etypes);
 | |
|      p -= der_put_context (p, 7, UT_Integer, &k->nonce);
 | |
|      /* rtime[6] KerberosTime OPTIONAL */
 | |
|      {
 | |
| 	  krb5_data t;
 | |
| 
 | |
| 	  time2generalizedtime (&t, k->till);
 | |
| 	  p -= der_put_context (p, 5, UT_GeneralizedTime, &t);
 | |
| 	  string_free (t);
 | |
|      }
 | |
|      /* from[4] KerberosTime OPTIONAL */
 | |
|      p -= der_put_context_principalname (p, 3, k->sname);
 | |
|      p -= der_put_context (p, 2, UT_GeneralString, &k->realm);
 | |
|      p -= der_put_context_principalname (p, 1, k->cname);
 | |
|      p -= der_put_context_kdcoptions (p, 0, &k->kdc_options);
 | |
|      p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
 | |
|      return ptr - p;
 | |
| }
 | |
| 
 | |
| unsigned
 | |
| der_put_kdc_req (unsigned char *ptr, int msg_type, Kdc_Req *k)
 | |
| {
 | |
|      unsigned char *p = ptr;
 | |
| 
 | |
|      p -= der_put_kdc_req_body (p, k);
 | |
|      p -= der_put_type (p, CONTEXT, CONS, 4, ptr - p);
 | |
|      /* padata[3] SEQUENCE OF PA-DATA OPTIONAL */
 | |
|      p -= der_put_context (p, 2, UT_Integer, &k->msg_type);
 | |
|      p -= der_put_context (p, 1, UT_Integer, &k->pvno);
 | |
|      p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
 | |
|      return ptr - p;
 | |
| }
 | |
| 
 | |
| unsigned
 | |
| der_put_as_req (unsigned char *ptr, As_Req *a)
 | |
| {
 | |
|      unsigned char *p = ptr;
 | |
| 
 | |
|      p -= der_put_kdc_req (p, a->msg_type, a);
 | |
|      p -= der_put_type (p, APPL, CONS, a->msg_type, ptr - p);
 | |
|      return ptr - p;
 | |
| }
 | |
| 
 | |
| #if 0
 | |
| 
 | |
| /*
 | |
|  * Get functions
 | |
|  */
 | |
| 
 | |
| int
 | |
| der_get_principalname (unsigned char *ptr, Principalname *name)
 | |
| {
 | |
|      unsigned char *p = ptr;
 | |
|      unsigned char *p0;
 | |
|      int tlen, tlen2;
 | |
| 
 | |
|      len = der_match_type (p, UNIV, CONS, UT_Sequence, &tlen);
 | |
|      if (len < 0)
 | |
| 	  return len;
 | |
|      else
 | |
| 	  p += len;
 | |
|      p0 = p;
 | |
|      len = der_match_context (p, 0, UT_Integer, &name->name_type);
 | |
|      if (len < 0)
 | |
| 	  return len;
 | |
|      else
 | |
| 	  p += len;
 | |
|      len = der_match_type (p, CONTEXT, CONS, 1, &tlen2);
 | |
|      if (len < 0)
 | |
| 	  return len;
 | |
|      else
 | |
| 	  p =+ len;
 | |
|      len = der_match_type ()
 | |
|      while(p < p0 + tlen) {
 | |
|      }
 | |
| 
 | |
| 
 | |
|      return ptr - p;
 | |
| }
 | |
| 
 | |
| int
 | |
| der_get_kdc_rep (unsigned char *ptr, unsigned mylen, int msg_type,
 | |
| 		 krb5_kdc_rep *k)
 | |
| {
 | |
|      unsigned char *p = ptr;
 | |
|      unsigned tlen, slen;
 | |
|      int len;
 | |
|      unsigned kvno, msg1;
 | |
|      unsigned tag;
 | |
|      int type;
 | |
| 	  
 | |
|      len = der_match_type (p, UNIV, CONS, UT_Sequence, &tlen);
 | |
|      if (len < 0)
 | |
| 	  return len;
 | |
|      else
 | |
| 	  p += len;
 | |
|      len = der_match_context (p, 0, UT_Integer, &kvno);
 | |
|      if (len < 0)
 | |
| 	  return len;
 | |
|      else
 | |
| 	  p += len;
 | |
|      if (kvno != 5)
 | |
| 	  return -1;
 | |
|      len = der_match_context (p, 1, UT_Integer, &msg1);
 | |
|      if (len < 0)
 | |
| 	  return len;
 | |
|      else
 | |
| 	  p += len;
 | |
|      if (msg1 != msg_type)
 | |
| 	  return -1;
 | |
|      len = der_get_context (p, &tag, &type, &tlen);
 | |
|      if (len < 0)
 | |
| 	  return len;
 | |
|      else
 | |
| 	  p += len;
 | |
|      if (tag == 2)
 | |
| 	  abort ();		/* XXX */
 | |
|      else if (tag == 3) {
 | |
| 	  p += der_get_val (p, UT_GeneralString, tlen, &k->realm);
 | |
|      }
 | |
|      len = der_get_context (p, &tag, &type, &tlen);
 | |
|      if (len < 0)
 | |
| 	  return len;
 | |
|      else
 | |
| 	  p += len;
 | |
|      der_get_principalname
 | |
|      return p - ptr;
 | |
| }
 | |
| 
 | |
| int
 | |
| der_get_as_rep (unsigned char *ptr, As_Rep *a)
 | |
| {
 | |
|      unsigned char *p = ptr;
 | |
|      int len;
 | |
|      unsigned tlen;
 | |
| 
 | |
|      len = der_match_type (p, APPL, CONS, KRB_AS_REP, &tlen);
 | |
|      if(len < 0)
 | |
| 	  return len;
 | |
|      else
 | |
| 	  p += len;
 | |
|      len = der_get_kdc_rep (p, tlen, KRB_AS_REP, a);
 | |
|      if (len < 0)
 | |
| 	  return len;
 | |
|      else
 | |
| 	  p += len;
 | |
|      
 | |
|      return p - ptr;
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 |