/* Contains elements based on gcrypt-module.h and gcrypt.h.in.
If it's changed please update this file. */
-#ifndef GRUB_CIPHER_HEADER
-#define GRUB_CIPHER_HEADER 1
+#ifndef GRUB_CRYPTO_HEADER
+#define GRUB_CRYPTO_HEADER 1
#include <grub/symbol.h>
#include <grub/types.h>
-#include <grub/misc.h>
-#include <grub/mm.h>
+#include <grub/err.h>
+/* For GRUB_ACCESS_DENIED. */
+#include <grub/auth.h>
typedef enum
{
GPG_ERR_WEAK_KEY,
GPG_ERR_WRONG_KEY_USAGE,
GPG_ERR_WRONG_PUBKEY_ALGO,
+ GPG_ERR_OUT_OF_MEMORY
} gcry_err_code_t;
#define gpg_err_code_t gcry_err_code_t
#define gpg_error_t gcry_err_code_t
void
grub_crypto_xor (void *out, const void *in1, const void *in2, grub_size_t size);
-grub_err_t
+
+gcry_err_code_t
grub_crypto_ecb_decrypt (grub_crypto_cipher_handle_t cipher,
void *out, void *in, grub_size_t size);
-grub_err_t
+gcry_err_code_t
grub_crypto_ecb_encrypt (grub_crypto_cipher_handle_t cipher,
void *out, void *in, grub_size_t size);
-grub_err_t
+gcry_err_code_t
grub_crypto_cbc_encrypt (grub_crypto_cipher_handle_t cipher,
void *out, void *in, grub_size_t size,
void *iv_in);
-grub_err_t
+gcry_err_code_t
grub_crypto_cbc_decrypt (grub_crypto_cipher_handle_t cipher,
void *out, void *in, grub_size_t size,
void *iv);
void
-grub_cipher_register (gcry_cipher_spec_t *cipher);
-void
-grub_cipher_unregister (gcry_cipher_spec_t *cipher);
-void
grub_md_register (gcry_md_spec_t *digest);
void
grub_md_unregister (gcry_md_spec_t *cipher);
const gcry_md_spec_t *
grub_crypto_lookup_md_by_name (const char *name);
+grub_err_t
+grub_crypto_gcry_error (gcry_err_code_t in);
+
void grub_burn_stack (grub_size_t size);
extern gcry_md_spec_t _gcry_digest_spec_md5;
}
}
-grub_err_t
+gcry_err_code_t
grub_crypto_ecb_decrypt (grub_crypto_cipher_handle_t cipher,
void *out, void *in, grub_size_t size)
{
grub_uint8_t *inptr, *outptr, *end;
+ if (!cipher->cipher->decrypt)
+ return GPG_ERR_NOT_SUPPORTED;
if (size % cipher->cipher->blocksize != 0)
- return grub_error (GRUB_ERR_BAD_ARGUMENT,
- "This encryption can't decrypt partial blocks");
+ return GPG_ERR_INV_ARG;
end = (grub_uint8_t *) in + size;
for (inptr = in, outptr = out; inptr < end;
inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize)
cipher->cipher->decrypt (cipher->ctx, outptr, inptr);
- return GRUB_ERR_NONE;
+ return GPG_ERR_NO_ERROR;
}
-grub_err_t
+gcry_err_code_t
grub_crypto_ecb_encrypt (grub_crypto_cipher_handle_t cipher,
void *out, void *in, grub_size_t size)
{
grub_uint8_t *inptr, *outptr, *end;
+ if (!cipher->cipher->encrypt)
+ return GPG_ERR_NOT_SUPPORTED;
if (size % cipher->cipher->blocksize != 0)
- return grub_error (GRUB_ERR_BAD_ARGUMENT,
- "This encryption can't decrypt partial blocks");
+ return GPG_ERR_INV_ARG;
end = (grub_uint8_t *) in + size;
for (inptr = in, outptr = out; inptr < end;
inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize)
cipher->cipher->encrypt (cipher->ctx, outptr, inptr);
- return GRUB_ERR_NONE;
+ return GPG_ERR_NO_ERROR;
}
-grub_err_t
+gcry_err_code_t
grub_crypto_cbc_encrypt (grub_crypto_cipher_handle_t cipher,
void *out, void *in, grub_size_t size,
void *iv_in)
{
grub_uint8_t *inptr, *outptr, *end;
void *iv;
+ if (!cipher->cipher->decrypt)
+ return GPG_ERR_NOT_SUPPORTED;
if (size % cipher->cipher->blocksize != 0)
- return grub_error (GRUB_ERR_BAD_ARGUMENT,
- "This encryption can't decrypt partial blocks");
+ return GPG_ERR_INV_ARG;
end = (grub_uint8_t *) in + size;
iv = iv_in;
for (inptr = in, outptr = out; inptr < end;
iv = outptr;
}
grub_memcpy (iv_in, iv, cipher->cipher->blocksize);
- return GRUB_ERR_NONE;
+ return GPG_ERR_NO_ERROR;
}
-grub_err_t
+gcry_err_code_t
grub_crypto_cbc_decrypt (grub_crypto_cipher_handle_t cipher,
void *out, void *in, grub_size_t size,
void *iv)
{
grub_uint8_t *inptr, *outptr, *end;
grub_uint8_t ivt[cipher->cipher->blocksize];
+ if (!cipher->cipher->decrypt)
+ return GPG_ERR_NOT_SUPPORTED;
if (size % cipher->cipher->blocksize != 0)
- return grub_error (GRUB_ERR_BAD_ARGUMENT,
- "This encryption can't decrypt partial blocks");
+ return GPG_ERR_INV_ARG;
end = (grub_uint8_t *) in + size;
for (inptr = in, outptr = out; inptr < end;
inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize)
grub_crypto_xor (outptr, outptr, iv, cipher->cipher->blocksize);
grub_memcpy (iv, ivt, cipher->cipher->blocksize);
}
- return GRUB_ERR_NONE;
+ return GPG_ERR_NO_ERROR;
+}
+
+grub_err_t
+grub_crypto_gcry_error (gcry_err_code_t in)
+{
+ if (in == GPG_ERR_NO_ERROR)
+ return GRUB_ERR_NONE;
+ return GRUB_ACCESS_DENIED;
}