krb5: add krb5_[en|de]crypt_inplace_ivec
authorStefan Metzmacher <metze@samba.org>
Fri, 8 Aug 2008 14:31:15 +0000 (16:31 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 18 Aug 2008 06:49:04 +0000 (08:49 +0200)
This functions just do the encryption without
adding confounders or checksums.

metze

source/heimdal/lib/krb5/crypto.c
source/heimdal/lib/krb5/krb5-protos.h

index e91cb9391a6431397e1994b12294d1bea74f0354..4b8c3e82a143fb199209aaf007b49d4777243f7f 100644 (file)
@@ -3047,6 +3047,34 @@ encrypt_internal_derived(krb5_context context,
     return ret;
 }
 
+static krb5_error_code
+encrypt_internal_derived_inplace(krb5_context context,
+                                krb5_crypto crypto,
+                                unsigned usage,
+                                void *data,
+                                size_t len,
+                                void *ivec)
+{
+    krb5_error_code ret;
+    struct key_data *dkey;
+    const struct encryption_type *et = crypto->et;
+
+    ret = _get_derived_key(context, crypto, ENCRYPTION_USAGE(usage), &dkey);
+    if(ret)
+       goto fail;
+    ret = _key_schedule(context, dkey);
+    if(ret)
+       goto fail;
+#ifdef CRYPTO_DEBUG
+    krb5_crypto_debug(context, 1, len, dkey->key);
+#endif
+    ret = (*et->encrypt)(context, dkey, data, len, 1, usage, ivec);
+    if (ret)
+       goto fail;
+    return 0;
+ fail:
+    return ret;
+}
 
 static krb5_error_code
 encrypt_internal(krb5_context context,
@@ -3116,6 +3144,31 @@ encrypt_internal(krb5_context context,
     return ret;
 }
 
+static krb5_error_code
+encrypt_internal_inplace(krb5_context context,
+                        krb5_crypto crypto,
+                        void *data,
+                        size_t len,
+                        void *ivec)
+{
+    krb5_error_code ret;
+    const struct encryption_type *et = crypto->et;
+
+    ret = _key_schedule(context, &crypto->key);
+    if(ret)
+       goto fail;
+#ifdef CRYPTO_DEBUG
+    krb5_crypto_debug(context, 1, len, crypto->key.key);
+#endif
+    ret = (*et->encrypt)(context, &crypto->key, data, len, 1, 0, ivec);
+    if (ret) {
+       goto fail;
+    }
+    return 0;
+ fail:
+    return ret;
+}
+
 static krb5_error_code
 encrypt_internal_special(krb5_context context,
                         krb5_crypto crypto,
@@ -3142,6 +3195,9 @@ encrypt_internal_special(krb5_context context,
     krb5_generate_random_block(p, et->confoundersize);
     p += et->confoundersize;
     memcpy (p, data, len);
+#ifdef CRYPTO_DEBUG
+    krb5_crypto_debug(context, 1, sz, crypto->key.key);
+#endif
     ret = (*et->encrypt)(context, &crypto->key, tmp, sz, TRUE, usage, ivec);
     if (ret) {
        memset(tmp, 0, sz);
@@ -3153,6 +3209,27 @@ encrypt_internal_special(krb5_context context,
     return 0;
 }
 
+static krb5_error_code
+encrypt_internal_special_inplace(krb5_context context,
+                                krb5_crypto crypto,
+                                int usage,
+                                void *data,
+                                size_t len,
+                                void *ivec)
+{
+    struct encryption_type *et = crypto->et;
+    krb5_error_code ret;
+
+#ifdef CRYPTO_DEBUG
+    krb5_crypto_debug(context, 1, len, crypto->key.key);
+#endif
+    ret = (*et->encrypt)(context, &crypto->key, data, len, TRUE, usage, ivec);
+    if (ret) {
+       return ret;
+    }
+    return 0;
+}
+
 static krb5_error_code
 decrypt_internal_derived(krb5_context context,
                         krb5_crypto crypto,
@@ -3237,6 +3314,37 @@ decrypt_internal_derived(krb5_context context,
     return 0;
 }
 
+static krb5_error_code
+decrypt_internal_derived_inplace(krb5_context context,
+                        krb5_crypto crypto,
+                        unsigned usage,
+                        void *data,
+                        size_t len,
+                        void *ivec)
+{
+    krb5_error_code ret;
+    struct key_data *dkey;
+    struct encryption_type *et = crypto->et;
+
+    ret = _get_derived_key(context, crypto, ENCRYPTION_USAGE(usage), &dkey);
+    if(ret) {
+       return ret;
+    }
+    ret = _key_schedule(context, dkey);
+    if(ret) {
+       return ret;
+    }
+#ifdef CRYPTO_DEBUG
+    krb5_crypto_debug(context, 0, len, dkey->key);
+#endif
+    ret = (*et->encrypt)(context, dkey, data, len, 0, usage, ivec);
+    if (ret) {
+       return ret;
+    }
+
+    return 0;
+}
+
 static krb5_error_code
 decrypt_internal(krb5_context context,
                 krb5_crypto crypto,
@@ -3302,6 +3410,30 @@ decrypt_internal(krb5_context context,
     return 0;
 }
 
+static krb5_error_code
+decrypt_internal_inplace(krb5_context context,
+                krb5_crypto crypto,
+                void *data,
+                size_t len,
+                void *ivec)
+{
+    krb5_error_code ret;
+    struct encryption_type *et = crypto->et;
+
+    ret = _key_schedule(context, &crypto->key);
+    if(ret) {
+       return ret;
+    }
+#ifdef CRYPTO_DEBUG
+    krb5_crypto_debug(context, 0, len, crypto->key.key);
+#endif
+    ret = (*et->encrypt)(context, &crypto->key, data, len, 0, 0, ivec);
+    if (ret) {
+       return ret;
+    }
+    return 0;
+}
+
 static krb5_error_code
 decrypt_internal_special(krb5_context context,
                         krb5_crypto crypto,
@@ -3346,6 +3478,25 @@ decrypt_internal_special(krb5_context context,
     return 0;
 }
 
+static krb5_error_code
+decrypt_internal_special_inplace(krb5_context context,
+                        krb5_crypto crypto,
+                        int usage,
+                        void *data,
+                        size_t len,
+                        void *ivec)
+{
+    struct encryption_type *et = crypto->et;
+    krb5_error_code ret;
+
+    ret = (*et->encrypt)(context, &crypto->key, data, len, FALSE, usage, ivec);
+    if (ret) {
+       return ret;
+    }
+
+    return 0;
+}
+
 
 krb5_error_code KRB5_LIB_FUNCTION
 krb5_encrypt_ivec(krb5_context context,
@@ -3377,6 +3528,24 @@ krb5_encrypt(krb5_context context,
     return krb5_encrypt_ivec(context, crypto, usage, data, len, result, NULL);
 }
 
+krb5_error_code KRB5_LIB_FUNCTION
+krb5_encrypt_inplace_ivec(krb5_context context,
+                 krb5_crypto crypto,
+                 unsigned usage,
+                 void *data,
+                 size_t len,
+                 void *ivec)
+{
+    if(derived_crypto(context, crypto))
+       return encrypt_internal_derived_inplace(context, crypto, usage,
+                                               data, len, ivec);
+    else if (special_crypto(context, crypto))
+       return encrypt_internal_special_inplace(context, crypto, usage,
+                                           data, len, ivec);
+    else
+       return encrypt_internal_inplace(context, crypto, data, len, ivec);
+}
+
 krb5_error_code KRB5_LIB_FUNCTION
 krb5_encrypt_EncryptedData(krb5_context context,
                           krb5_crypto crypto,
@@ -3414,6 +3583,24 @@ krb5_decrypt_ivec(krb5_context context,
        return decrypt_internal(context, crypto, data, len, result, ivec);
 }
 
+krb5_error_code KRB5_LIB_FUNCTION
+krb5_decrypt_inplace_ivec(krb5_context context,
+                 krb5_crypto crypto,
+                 unsigned usage,
+                 void *data,
+                 size_t len,
+                 void *ivec)
+{
+    if(derived_crypto(context, crypto))
+       return decrypt_internal_derived_inplace(context, crypto, usage,
+                                       data, len, ivec);
+    else if (special_crypto (context, crypto))
+       return decrypt_internal_special_inplace(context, crypto, usage,
+                                       data, len, ivec);
+    else
+       return decrypt_internal_inplace(context, crypto, data, len, ivec);
+}
+
 krb5_error_code KRB5_LIB_FUNCTION
 krb5_decrypt(krb5_context context,
             krb5_crypto crypto,
index ead66565e7690f37c5ebf54d9f08bc47095845e0..6755411b7d2cf2312929d8f16f34d240582908fd 100644 (file)
@@ -1288,6 +1288,15 @@ krb5_decrypt_ivec (
        krb5_data */*result*/,
        void */*ivec*/);
 
+krb5_error_code KRB5_LIB_FUNCTION
+krb5_decrypt_inplace_ivec(
+       krb5_context /*context*/,
+       krb5_crypto /*crypto*/,
+       unsigned /*usage*/,
+       void */*data*/,
+       size_t /*len*/,
+       void */*ivec*/);
+
 krb5_error_code KRB5_LIB_FUNCTION
 krb5_decrypt_ticket (
        krb5_context /*context*/,
@@ -1594,6 +1603,15 @@ krb5_encrypt_ivec (
        krb5_data */*result*/,
        void */*ivec*/);
 
+krb5_error_code KRB5_LIB_FUNCTION
+krb5_encrypt_inplace_ivec(
+       krb5_context /*context*/,
+       krb5_crypto /*crypto*/,
+       unsigned /*usage*/,
+       void */*data*/,
+       size_t /*len*/,
+       void */*ivec*/);
+
 krb5_error_code KRB5_LIB_FUNCTION
 krb5_enctype_disable (
        krb5_context /*context*/,