Improved error handling
This commit is contained in:
parent
d944246c6a
commit
fbf62978dc
2 changed files with 42 additions and 28 deletions
|
@ -20,13 +20,14 @@
|
||||||
/* Contains elements based on gcrypt-module.h and gcrypt.h.in.
|
/* Contains elements based on gcrypt-module.h and gcrypt.h.in.
|
||||||
If it's changed please update this file. */
|
If it's changed please update this file. */
|
||||||
|
|
||||||
#ifndef GRUB_CIPHER_HEADER
|
#ifndef GRUB_CRYPTO_HEADER
|
||||||
#define GRUB_CIPHER_HEADER 1
|
#define GRUB_CRYPTO_HEADER 1
|
||||||
|
|
||||||
#include <grub/symbol.h>
|
#include <grub/symbol.h>
|
||||||
#include <grub/types.h>
|
#include <grub/types.h>
|
||||||
#include <grub/misc.h>
|
#include <grub/err.h>
|
||||||
#include <grub/mm.h>
|
/* For GRUB_ACCESS_DENIED. */
|
||||||
|
#include <grub/auth.h>
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
@ -64,6 +65,7 @@ typedef enum
|
||||||
GPG_ERR_WEAK_KEY,
|
GPG_ERR_WEAK_KEY,
|
||||||
GPG_ERR_WRONG_KEY_USAGE,
|
GPG_ERR_WRONG_KEY_USAGE,
|
||||||
GPG_ERR_WRONG_PUBKEY_ALGO,
|
GPG_ERR_WRONG_PUBKEY_ALGO,
|
||||||
|
GPG_ERR_OUT_OF_MEMORY
|
||||||
} gcry_err_code_t;
|
} gcry_err_code_t;
|
||||||
#define gpg_err_code_t gcry_err_code_t
|
#define gpg_err_code_t gcry_err_code_t
|
||||||
#define gpg_error_t gcry_err_code_t
|
#define gpg_error_t gcry_err_code_t
|
||||||
|
@ -186,26 +188,23 @@ grub_crypto_cipher_close (grub_crypto_cipher_handle_t cipher);
|
||||||
|
|
||||||
void
|
void
|
||||||
grub_crypto_xor (void *out, const void *in1, const void *in2, grub_size_t size);
|
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,
|
grub_crypto_ecb_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||||
void *out, void *in, grub_size_t size);
|
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,
|
grub_crypto_ecb_encrypt (grub_crypto_cipher_handle_t cipher,
|
||||||
void *out, void *in, grub_size_t size);
|
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,
|
grub_crypto_cbc_encrypt (grub_crypto_cipher_handle_t cipher,
|
||||||
void *out, void *in, grub_size_t size,
|
void *out, void *in, grub_size_t size,
|
||||||
void *iv_in);
|
void *iv_in);
|
||||||
grub_err_t
|
gcry_err_code_t
|
||||||
grub_crypto_cbc_decrypt (grub_crypto_cipher_handle_t cipher,
|
grub_crypto_cbc_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||||
void *out, void *in, grub_size_t size,
|
void *out, void *in, grub_size_t size,
|
||||||
void *iv);
|
void *iv);
|
||||||
void
|
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);
|
grub_md_register (gcry_md_spec_t *digest);
|
||||||
void
|
void
|
||||||
grub_md_unregister (gcry_md_spec_t *cipher);
|
grub_md_unregister (gcry_md_spec_t *cipher);
|
||||||
|
@ -215,6 +214,9 @@ grub_crypto_hash (const gcry_md_spec_t *hash, void *out, void *in,
|
||||||
const gcry_md_spec_t *
|
const gcry_md_spec_t *
|
||||||
grub_crypto_lookup_md_by_name (const char *name);
|
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);
|
void grub_burn_stack (grub_size_t size);
|
||||||
|
|
||||||
extern gcry_md_spec_t _gcry_digest_spec_md5;
|
extern gcry_md_spec_t _gcry_digest_spec_md5;
|
||||||
|
|
44
lib/crypto.c
44
lib/crypto.c
|
@ -149,46 +149,49 @@ 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,
|
grub_crypto_ecb_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||||
void *out, void *in, grub_size_t size)
|
void *out, void *in, grub_size_t size)
|
||||||
{
|
{
|
||||||
grub_uint8_t *inptr, *outptr, *end;
|
grub_uint8_t *inptr, *outptr, *end;
|
||||||
|
if (!cipher->cipher->decrypt)
|
||||||
|
return GPG_ERR_NOT_SUPPORTED;
|
||||||
if (size % cipher->cipher->blocksize != 0)
|
if (size % cipher->cipher->blocksize != 0)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
return GPG_ERR_INV_ARG;
|
||||||
"This encryption can't decrypt partial blocks");
|
|
||||||
end = (grub_uint8_t *) in + size;
|
end = (grub_uint8_t *) in + size;
|
||||||
for (inptr = in, outptr = out; inptr < end;
|
for (inptr = in, outptr = out; inptr < end;
|
||||||
inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize)
|
inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize)
|
||||||
cipher->cipher->decrypt (cipher->ctx, outptr, inptr);
|
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,
|
grub_crypto_ecb_encrypt (grub_crypto_cipher_handle_t cipher,
|
||||||
void *out, void *in, grub_size_t size)
|
void *out, void *in, grub_size_t size)
|
||||||
{
|
{
|
||||||
grub_uint8_t *inptr, *outptr, *end;
|
grub_uint8_t *inptr, *outptr, *end;
|
||||||
|
if (!cipher->cipher->encrypt)
|
||||||
|
return GPG_ERR_NOT_SUPPORTED;
|
||||||
if (size % cipher->cipher->blocksize != 0)
|
if (size % cipher->cipher->blocksize != 0)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
return GPG_ERR_INV_ARG;
|
||||||
"This encryption can't decrypt partial blocks");
|
|
||||||
end = (grub_uint8_t *) in + size;
|
end = (grub_uint8_t *) in + size;
|
||||||
for (inptr = in, outptr = out; inptr < end;
|
for (inptr = in, outptr = out; inptr < end;
|
||||||
inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize)
|
inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize)
|
||||||
cipher->cipher->encrypt (cipher->ctx, outptr, inptr);
|
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,
|
grub_crypto_cbc_encrypt (grub_crypto_cipher_handle_t cipher,
|
||||||
void *out, void *in, grub_size_t size,
|
void *out, void *in, grub_size_t size,
|
||||||
void *iv_in)
|
void *iv_in)
|
||||||
{
|
{
|
||||||
grub_uint8_t *inptr, *outptr, *end;
|
grub_uint8_t *inptr, *outptr, *end;
|
||||||
void *iv;
|
void *iv;
|
||||||
|
if (!cipher->cipher->decrypt)
|
||||||
|
return GPG_ERR_NOT_SUPPORTED;
|
||||||
if (size % cipher->cipher->blocksize != 0)
|
if (size % cipher->cipher->blocksize != 0)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
return GPG_ERR_INV_ARG;
|
||||||
"This encryption can't decrypt partial blocks");
|
|
||||||
end = (grub_uint8_t *) in + size;
|
end = (grub_uint8_t *) in + size;
|
||||||
iv = iv_in;
|
iv = iv_in;
|
||||||
for (inptr = in, outptr = out; inptr < end;
|
for (inptr = in, outptr = out; inptr < end;
|
||||||
|
@ -199,19 +202,20 @@ grub_crypto_cbc_encrypt (grub_crypto_cipher_handle_t cipher,
|
||||||
iv = outptr;
|
iv = outptr;
|
||||||
}
|
}
|
||||||
grub_memcpy (iv_in, iv, cipher->cipher->blocksize);
|
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,
|
grub_crypto_cbc_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||||
void *out, void *in, grub_size_t size,
|
void *out, void *in, grub_size_t size,
|
||||||
void *iv)
|
void *iv)
|
||||||
{
|
{
|
||||||
grub_uint8_t *inptr, *outptr, *end;
|
grub_uint8_t *inptr, *outptr, *end;
|
||||||
grub_uint8_t ivt[cipher->cipher->blocksize];
|
grub_uint8_t ivt[cipher->cipher->blocksize];
|
||||||
|
if (!cipher->cipher->decrypt)
|
||||||
|
return GPG_ERR_NOT_SUPPORTED;
|
||||||
if (size % cipher->cipher->blocksize != 0)
|
if (size % cipher->cipher->blocksize != 0)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
return GPG_ERR_INV_ARG;
|
||||||
"This encryption can't decrypt partial blocks");
|
|
||||||
end = (grub_uint8_t *) in + size;
|
end = (grub_uint8_t *) in + size;
|
||||||
for (inptr = in, outptr = out; inptr < end;
|
for (inptr = in, outptr = out; inptr < end;
|
||||||
inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize)
|
inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize)
|
||||||
|
@ -221,5 +225,13 @@ grub_crypto_cbc_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||||
grub_crypto_xor (outptr, outptr, iv, cipher->cipher->blocksize);
|
grub_crypto_xor (outptr, outptr, iv, cipher->cipher->blocksize);
|
||||||
grub_memcpy (iv, ivt, 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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue