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,
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,
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);
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,
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,
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,
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,
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,
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,