On 2008/11/23 23:07, Evgeny Sinelnikov wrote:

../libssl.so: undefined reference to `krb5_principal_set_type

Thank you for the warning.

I'm consulting MIT krb5 sources, but not actually testing compilation against MIT kerberos installed. Thus I haven't realized when I've got somehow myself under a delusion that krb5_principal_set_type is common to MIT and Heimdal, just as krb5_principal_compare is -- which is not the case.

The attached patch is corrected with respect to this (but still does not solve the krb5_ticket differences).

With best regards

Honza Macháček
diff -Naur openssl-0.9.8i/include/openssl/kssl.h 
openssl-0.9.8i-heimdal/include/openssl/kssl.h
--- include/openssl/kssl.h      2005-04-09 23:55:55.000000000 +0000
+++ include/openssl/kssl.h      2008-11-22 16:27:24.000000000 +0000
@@ -81,6 +81,7 @@
 */
 #ifdef KRB5_HEIMDAL
 typedef unsigned char krb5_octet;
+typedef krb5_times krb5_ticket_times;
 #define FAR
 #else
 
diff -Naur openssl-0.9.8i/ssl/kssl.c openssl-0.9.8i-heimdal/ssl/kssl.c
--- ssl/kssl.c  2008-04-02 11:15:05.000000000 +0000
+++ ssl/kssl.c  2008-11-24 16:05:07.000000000 +0000
@@ -821,16 +821,27 @@
         {
        switch (enctype)
                {
-       case ENCTYPE_DES_HMAC_SHA1:             /*    EVP_des_cbc();       */
-       case ENCTYPE_DES_CBC_CRC:
+       case ENCTYPE_DES_CBC_CRC:               /*    EVP_des_cbc();       */
        case ENCTYPE_DES_CBC_MD4:
        case ENCTYPE_DES_CBC_MD5:
+#ifdef KRB5_HEIMDAL
+       case ENCTYPE_DES_CBC_NONE:
+       case ENCTYPE_DES_CFB64_NONE:
+       case ENCTYPE_DES_PCBC_NONE:
+#else
+       case ENCTYPE_DES_HMAC_SHA1:
        case ENCTYPE_DES_CBC_RAW:
+#endif
                                return EVP_des_cbc();
                                break;
        case ENCTYPE_DES3_CBC_SHA1:             /*    EVP_des_ede3_cbc();  */
+#ifdef KRB5_HEIMDAL
+       case ENCTYPE_DES3_CBC_MD5:
+       case ENCTYPE_DES3_CBC_NONE:
+#else
        case ENCTYPE_DES3_CBC_SHA:
        case ENCTYPE_DES3_CBC_RAW:
+#endif
                                return EVP_des_ede3_cbc();
                                break;
        default:                return NULL;
@@ -883,6 +894,7 @@
        {
        int             i, j, n;
        static size_t   *cklens = NULL;
+       size_t  cksumsize;
 
 #ifdef KRB5_MIT_OLD11
        n = krb5_max_cksum;
@@ -894,13 +906,14 @@
        if (!cklens && !(cklens = (size_t *) calloc(sizeof(int),n+1)))  return 
NULL;
 
        for (i=0; i < n; i++)  {
-               if (!valid_cksumtype(i))  continue;     /*  array has holes  */
+               if (!krb5_c_valid_cksumtype(i))  continue;      /*  array has 
holes  */
+               if (krb5_c_checksum_length(NULL, i, &cksumsize))  continue;     
/*  there's something wrong  */
                for (j=0; j < n; j++)  {
                        if (cklens[j] == 0)  {
-                               cklens[j] = krb5_checksum_size(NULL,i);
+                               cklens[j] = cksumsize;
                                break;          /*  krb5 elem was new: add   */
                                }
-                       if (cklens[j] == krb5_checksum_size(NULL,i))  {
+                       if (cklens[j] == cksumsize)  {
                                break;          /*  ignore duplicate elements */
                                }
                        }
@@ -957,14 +970,21 @@
 print_krb5_data(char *label, krb5_data *kdata)
         {
        int i;
+       unsigned char *datastring;
+
+#ifdef KRB5_HEIMDAL
+       memcpy(datastring, kdata->data, kdata->length);
+#else
+       datastring = kdata->data;
+#endif
 
        printf("%s[%d] ", label, kdata->length);
        for (i=0; i < (int)kdata->length; i++)
                 {
-               if (0 &&  isprint((int) kdata->data[i]))
-                        printf(        "%c ",  kdata->data[i]);
+               if (0 &&  isprint((int) datastring[i]))
+                        printf(        "%c ",  datastring[i]);
                else
-                        printf(        "%02x ", (unsigned char) 
kdata->data[i]);
+                        printf(        "%02x ", datastring[i]);
                }
        printf("\n");
         }
@@ -1002,28 +1022,28 @@
 print_krb5_keyblock(char *label, krb5_keyblock *keyblk)
         {
        int i;
+       unsigned char *keyblkcontents;
 
        if (keyblk == NULL)
                 {
                printf("%s, keyblk==0\n", label);
                return;
                }
+
 #ifdef KRB5_HEIMDAL
        printf("%s\n\t[et%d:%d]: ", label, keyblk->keytype,
-                                          keyblk->keyvalue->length);
-       for (i=0; i < (int)keyblk->keyvalue->length; i++)
-                {
-               printf("%02x",(unsigned char *)(keyblk->keyvalue->contents)[i]);
-               }
-       printf("\n");
+                                          keyblk->keyvalue.length);
+       memcpy(keyblkcontents, keyblk->keyvalue.data, keyblk->keyvalue.length);
+       for (i=0; i < (int)keyblk->keyvalue.length; i++)
 #else
        printf("%s\n\t[et%d:%d]: ", label, keyblk->enctype, keyblk->length);
+       keyblkcontents = keyblk->contents;
        for (i=0; i < (int)keyblk->length; i++)
+#endif
                 {
-               printf("%02x",keyblk->contents[i]);
+               printf("%02x",keyblkcontents[i]);
                }
        printf("\n");
-#endif
         }
 
 
@@ -1034,10 +1054,37 @@
 print_krb5_princ(char *label, krb5_principal_data *princ)
         {
        int i, ui, uj;
+       unsigned int realmlength;
+       char *realmdata;
 
        printf("%s principal Realm: ", label);
        if (princ == NULL)  return;
-       for (ui=0; ui < (int)princ->realm.length; ui++)  
putchar(princ->realm.data[ui]);
+
+#ifdef KRB5_HEIMDAL
+       realmlength = krb5_realm_length(princ->realm);
+       realmdata = krb5_realm_data(princ->realm);
+#else
+       realmlength = princ->realm.length;
+       realmdata = princ->realm.data;
+#endif
+
+       for (ui=0; ui < (int)realmlength; ui++)  putchar(realmdata[ui]);
+
+#ifdef KRB5_HEIMDAL
+       printf(" (nametype %d) has %d strings:\n",
+              princ->name.name_type,
+              princ->name.name_string.len);
+       for (i=0; i < (int)princ->name.name_string.len; i++)
+                {
+               realmlength = krb5_realm_length(princ->name.name_string.val[i]);
+               realmdata = krb5_realm_data(princ->name.name_string.val[i]);
+               printf("\t%d [%d]: ", i, realmlength);
+               for (uj=0; uj < (int)realmlength; uj++)  {
+                       putchar(realmdata[uj]);
+                       }
+               printf("\n");
+               }
+#else
        printf(" (nametype %d) has %d strings:\n", princ->type,princ->length);
        for (i=0; i < (int)princ->length; i++)
                 {
@@ -1047,6 +1094,8 @@
                        }
                printf("\n");
                }
+#endif
+
        return;
         }
 
@@ -1275,6 +1324,17 @@
                return krb5rc;          /*  or  KRB5KRB_ERR_GENERIC;    */
                }
 
+#ifdef KRB5_HEIMDAL
+       krb5_principal_set_type(krb5context, new5ticket->server,
+                               asn1ticket->sname->nametype->data[0]);
+/*
+**     To do.
+**     MIT krb5_ticket looks more like the Ticket type of Heimdal,
+**     there seems to be no simple translation.
+**     May be the whole kssl_TKT2tkt function will have to be left out,
+**     and kssl_sget_tkt deeply rewriten for Heimdal.
+*/
+#else
        krb5_princ_type(krb5context, new5ticket->server) =
                        asn1ticket->sname->nametype->data[0];
        new5ticket->enc_part.enctype = asn1ticket->encdata->etype->data[0];
@@ -1296,6 +1356,7 @@
                        asn1ticket->encdata->cipher->data,
                        asn1ticket->encdata->cipher->length);
                }
+#endif
 
        *krb5ticket = new5ticket;
        return 0;
diff -Naur openssl-0.9.8i/ssl/kssl.h openssl-0.9.8i-heimdal/ssl/kssl.h
--- ssl/kssl.h  2005-04-09 23:55:55.000000000 +0000
+++ ssl/kssl.h  2008-11-22 16:27:24.000000000 +0000
@@ -81,6 +81,7 @@
 */
 #ifdef KRB5_HEIMDAL
 typedef unsigned char krb5_octet;
+typedef krb5_times krb5_ticket_times;
 #define FAR
 #else
 

Reply via email to