First try to gcry glue
This commit is contained in:
parent
34f4a5b005
commit
c9b1ebc10b
7 changed files with 401 additions and 1 deletions
|
@ -618,3 +618,5 @@ pkglib_MODULES += setjmp.mod
|
|||
setjmp_mod_SOURCES = lib/$(target_cpu)/setjmp.S
|
||||
setjmp_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
setjmp_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
||||
include $(srcdir)/conf/gcry.mk
|
||||
|
|
52
conf/gcry.rmk
Normal file
52
conf/gcry.rmk
Normal file
|
@ -0,0 +1,52 @@
|
|||
# -*- makefile -*-
|
||||
|
||||
pkglib_MODULES += seed.mod
|
||||
seed_mod_SOURCES = gcry/cipher/seed.c
|
||||
seed_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
seed_mod_LDFLAGS = $(COMMON_ASFLAGS)
|
||||
|
||||
pkglib_MODULES += twofish.mod
|
||||
twofish_mod_SOURCES = gcry/cipher/twofish.c
|
||||
twofish_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
twofish_mod_LDFLAGS = $(COMMON_ASFLAGS)
|
||||
|
||||
pkglib_MODULES += des.mod
|
||||
des_mod_SOURCES = gcry/cipher/des.c
|
||||
des_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
des_mod_LDFLAGS = $(COMMON_ASFLAGS)
|
||||
|
||||
pkglib_MODULES += arcfour.mod
|
||||
arcfour_mod_SOURCES = gcry/cipher/arcfour.c
|
||||
arcfour_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
arcfour_mod_LDFLAGS = $(COMMON_ASFLAGS)
|
||||
|
||||
pkglib_MODULES += rfc2268.mod
|
||||
rfc2268_mod_SOURCES = gcry/cipher/rfc2268.c
|
||||
rfc2268_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
rfc2268_mod_LDFLAGS = $(COMMON_ASFLAGS)
|
||||
|
||||
pkglib_MODULES += cast5.mod
|
||||
cast5_mod_SOURCES = gcry/cipher/cast5.c
|
||||
cast5_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
cast5_mod_LDFLAGS = $(COMMON_ASFLAGS)
|
||||
|
||||
pkglib_MODULES += camellia-glue.mod
|
||||
camellia-glue_mod_SOURCES = gcry/cipher/camellia-glue.c
|
||||
camellia-glue_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
camellia-glue_mod_LDFLAGS = $(COMMON_ASFLAGS)
|
||||
|
||||
pkglib_MODULES += rijndael.mod
|
||||
rijndael_mod_SOURCES = gcry/cipher/rijndael.c
|
||||
rijndael_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
rijndael_mod_LDFLAGS = $(COMMON_ASFLAGS)
|
||||
|
||||
pkglib_MODULES += serpent.mod
|
||||
serpent_mod_SOURCES = gcry/cipher/serpent.c
|
||||
serpent_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
serpent_mod_LDFLAGS = $(COMMON_ASFLAGS)
|
||||
|
||||
pkglib_MODULES += blowfish.mod
|
||||
blowfish_mod_SOURCES = gcry/cipher/blowfish.c
|
||||
blowfish_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
blowfish_mod_LDFLAGS = $(COMMON_ASFLAGS)
|
||||
|
|
@ -58,13 +58,15 @@ kernel_img_SOURCES = kern/i386/pc/startup.S \
|
|||
kern/generic/millisleep.c \
|
||||
kern/env.c \
|
||||
term/i386/pc/console.c term/i386/vga_common.c \
|
||||
kern/crypto.c \
|
||||
symlist.c
|
||||
kernel_img_HEADERS = boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
|
||||
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
||||
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
||||
machine/biosdisk.h machine/boot.h machine/console.h machine/init.h \
|
||||
machine/memory.h machine/loader.h machine/vga.h machine/vbe.h \
|
||||
machine/kernel.h machine/pxe.h i386/pit.h list.h handler.h command.h
|
||||
machine/kernel.h machine/pxe.h i386/pit.h list.h handler.h command.h \
|
||||
crypto.h
|
||||
kernel_img_CFLAGS = $(COMMON_CFLAGS) $(TARGET_IMG_CFLAGS)
|
||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR) $(COMMON_CFLAGS)
|
||||
|
|
136
import_gcry.py
Normal file
136
import_gcry.py
Normal file
|
@ -0,0 +1,136 @@
|
|||
import re
|
||||
import sys
|
||||
import os
|
||||
import datetime
|
||||
|
||||
if len (sys.argv) < 3:
|
||||
print ("Usage: %s SOURCE DESTINATION" % sys.argv[0])
|
||||
exit (0)
|
||||
indir = sys.argv[1]
|
||||
outdir = sys.argv[2]
|
||||
|
||||
basedir = os.path.join (outdir, "gcry")
|
||||
os.makedirs (basedir)
|
||||
cipher_dir_in = os.path.join (indir, "cipher")
|
||||
cipher_dir_out = os.path.join (basedir, "cipher")
|
||||
os.makedirs (cipher_dir_out)
|
||||
cipher_files = os.listdir (cipher_dir_in)
|
||||
conf = open (os.path.join (outdir, "conf", "gcry.rmk"), "w")
|
||||
conf.write ("# -*- makefile -*-\n\n")
|
||||
chlog = ""
|
||||
|
||||
for cipher_file in cipher_files:
|
||||
infile = os.path.join (cipher_dir_in, cipher_file)
|
||||
outfile = os.path.join (cipher_dir_out, cipher_file)
|
||||
if cipher_file == "ChangeLog":
|
||||
continue
|
||||
chlognew = " * %s" % cipher_file
|
||||
nch = False
|
||||
if re.match (".*\.[ch]$", cipher_file):
|
||||
isc = re.match (".*\.c$", cipher_file)
|
||||
f = open (infile, "r")
|
||||
fw = open (outfile, "w")
|
||||
fw.write ("/* This file was automatically imported with \n")
|
||||
fw.write (" import_gcry.py. Please don't modify it */\n");
|
||||
ciphernames = []
|
||||
for line in f:
|
||||
m = re.match ("#include <.*>", line)
|
||||
if not m is None:
|
||||
chmsg = "Removed including of %s" % \
|
||||
m.group () [len ("#include <"):len (m.group ()) - 1]
|
||||
if nch:
|
||||
chlognew = "%s\n %s" % (chlognew, chmsg)
|
||||
else:
|
||||
chlognew = "%s: %s" % (chlognew, chmsg)
|
||||
nch = True
|
||||
continue
|
||||
m = re.match ("gcry_cipher_spec_t", line)
|
||||
if isc and not m is None:
|
||||
ciphername = line [len ("gcry_cipher_spec_t"):].strip ()
|
||||
ciphername = re.match("[a-zA-Z0-9_]*",ciphername).group ()
|
||||
ciphernames.append (ciphername)
|
||||
fw.write (line)
|
||||
if len (ciphernames) > 0:
|
||||
modname = cipher_file [0:len(cipher_file) - 2]
|
||||
chmsg = "(GRUB_MOD_INIT(%s)): New function\n" % modname
|
||||
if nch:
|
||||
chlognew = "%s\n %s" % (chlognew, chmsg)
|
||||
else:
|
||||
chlognew = "%s%s" % (chlognew, chmsg)
|
||||
nch = True
|
||||
fw.write ("\n\nGRUB_MOD_INIT(%s)\n" % modname)
|
||||
fw.write ("{\n")
|
||||
for ciphername in ciphernames:
|
||||
chmsg = "Register cipher %s" % ciphername
|
||||
chlognew = "%s\n %s" % (chlognew, chmsg)
|
||||
fw.write (" grub_cipher_register (&%s);\n" % ciphername)
|
||||
fw.write ("}")
|
||||
chmsg = "(GRUB_MOD_FINI(%s)): New function\n" % modname
|
||||
chlognew = "%s\n %s" % (chlognew, chmsg)
|
||||
fw.write ("\n\nGRUB_MOD_FINI(%s)\n" % modname)
|
||||
fw.write ("{\n")
|
||||
for ciphername in ciphernames:
|
||||
chmsg = "Unregister cipher %s" % ciphername
|
||||
chlognew = "%s\n %s" % (chlognew, chmsg)
|
||||
fw.write (" grub_cipher_unregister (&%s);\n" % ciphername)
|
||||
fw.write ("}\n")
|
||||
conf.write ("pkglib_MODULES += %s.mod\n" % modname)
|
||||
conf.write ("%s_mod_SOURCES = gcry/cipher/%s\n" %\
|
||||
(modname, cipher_file))
|
||||
conf.write ("%s_mod_CFLAGS = $(COMMON_CFLAGS) -Wno-error\n" % modname)
|
||||
conf.write ("%s_mod_LDFLAGS = $(COMMON_ASFLAGS)\n\n" % modname)
|
||||
elif isc:
|
||||
print ("WARNING: c file isn't a module: %s" % cipher_file)
|
||||
f.close ()
|
||||
fw.close ()
|
||||
if nch:
|
||||
chlog = "%s%s\n" % (chlog, chlognew)
|
||||
continue
|
||||
if re.match ("(Manifest|Makefile\.am)$", cipher_file):
|
||||
chlog = "%s%sRemoved\n" % (chlog, chlognew)
|
||||
continue
|
||||
# Autogenerated files. Not even worth mentionning in ChangeLog
|
||||
if re.match ("Makefile\.in$", cipher_file):
|
||||
chlog = "%s%sRemoved\n" % (chlog, chlognew)
|
||||
continue
|
||||
chlog = "%s%sSkipped unknown file\n" % (chlog, chlognew)
|
||||
print ("WARNING: unknown file %s" % cipher_file)
|
||||
|
||||
outfile = os.path.join (cipher_dir_out, "types.h")
|
||||
fw=open (outfile, "w")
|
||||
fw.write ("#include <grub/types.h>\n")
|
||||
fw.write ("#include <grub/gcry_wrap.h>\n")
|
||||
chlog = "%s * types.h: New file.\n" % chlog
|
||||
fw.close ()
|
||||
|
||||
outfile = os.path.join (cipher_dir_out, "cipher.h")
|
||||
fw=open (outfile, "w")
|
||||
fw.write ("#include <grub/crypto.h>\n")
|
||||
fw.write ("#include <grub/gcry_wrap.h>\n")
|
||||
chlog = "%s * cipher.h: Likewise.\n" % chlog
|
||||
fw.close ()
|
||||
|
||||
outfile = os.path.join (cipher_dir_out, "g10lib.h")
|
||||
fw=open (outfile, "w")
|
||||
fw.write ("#include <grub/gcry_wrap.h>\n")
|
||||
chlog = "%s * g10lib.h: Likewise.\n" % chlog
|
||||
fw.close ()
|
||||
|
||||
infile = os.path.join (cipher_dir_in, "ChangeLog")
|
||||
outfile = os.path.join (cipher_dir_out, "ChangeLog")
|
||||
|
||||
|
||||
f=open (infile, "r")
|
||||
fw=open (outfile, "w")
|
||||
dt = datetime.date.today ()
|
||||
fw.write ("%04d-%02d-%02d Automatic import tool\n" % \
|
||||
(dt.year,dt.month, dt.day))
|
||||
fw.write ("\n")
|
||||
fw.write (" Imported ciphers to GRUB\n")
|
||||
fw.write ("\n")
|
||||
fw.write (chlog)
|
||||
fw.write ("\n")
|
||||
for line in f:
|
||||
fw.write (line)
|
||||
f.close ()
|
||||
fw.close ()
|
138
include/grub/crypto.h
Normal file
138
include/grub/crypto.h
Normal file
|
@ -0,0 +1,138 @@
|
|||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006
|
||||
* 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* 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
|
||||
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/types.h>
|
||||
|
||||
typedef enum
|
||||
{
|
||||
GPG_ERR_NO_ERROR,
|
||||
GPG_ERR_BAD_MPI,
|
||||
GPG_ERR_BAD_SECKEY,
|
||||
GPG_ERR_BAD_SIGNATURE,
|
||||
GPG_ERR_CIPHER_ALGO,
|
||||
GPG_ERR_CONFLICT,
|
||||
GPG_ERR_DECRYPT_FAILED,
|
||||
GPG_ERR_DIGEST_ALGO,
|
||||
GPG_ERR_GENERAL,
|
||||
GPG_ERR_INTERNAL,
|
||||
GPG_ERR_INV_ARG,
|
||||
GPG_ERR_INV_CIPHER_MODE,
|
||||
GPG_ERR_INV_FLAG,
|
||||
GPG_ERR_INV_KEYLEN,
|
||||
GPG_ERR_INV_OBJ,
|
||||
GPG_ERR_INV_OP,
|
||||
GPG_ERR_INV_SEXP,
|
||||
GPG_ERR_INV_VALUE,
|
||||
GPG_ERR_MISSING_VALUE,
|
||||
GPG_ERR_NO_ENCRYPTION_SCHEME,
|
||||
GPG_ERR_NO_OBJ,
|
||||
GPG_ERR_NO_PRIME,
|
||||
GPG_ERR_NO_SIGNATURE_SCHEME,
|
||||
GPG_ERR_NOT_FOUND,
|
||||
GPG_ERR_NOT_IMPLEMENTED,
|
||||
GPG_ERR_NOT_SUPPORTED,
|
||||
GPG_ERROR_CFLAGS,
|
||||
GPG_ERR_PUBKEY_ALGO,
|
||||
GPG_ERR_SELFTEST_FAILED,
|
||||
GPG_ERR_TOO_SHORT,
|
||||
GPG_ERR_UNSUPPORTED,
|
||||
GPG_ERR_WEAK_KEY,
|
||||
GPG_ERR_WRONG_KEY_USAGE,
|
||||
GPG_ERR_WRONG_PUBKEY_ALGO,
|
||||
} gcry_err_code_t;
|
||||
|
||||
enum gcry_cipher_modes
|
||||
{
|
||||
GCRY_CIPHER_MODE_NONE = 0, /* Not yet specified. */
|
||||
GCRY_CIPHER_MODE_ECB = 1, /* Electronic codebook. */
|
||||
GCRY_CIPHER_MODE_CFB = 2, /* Cipher feedback. */
|
||||
GCRY_CIPHER_MODE_CBC = 3, /* Cipher block chaining. */
|
||||
GCRY_CIPHER_MODE_STREAM = 4, /* Used with stream ciphers. */
|
||||
GCRY_CIPHER_MODE_OFB = 5, /* Outer feedback. */
|
||||
GCRY_CIPHER_MODE_CTR = 6 /* Counter. */
|
||||
};
|
||||
|
||||
/* Type for the cipher_setkey function. */
|
||||
typedef gcry_err_code_t (*gcry_cipher_setkey_t) (void *c,
|
||||
const unsigned char *key,
|
||||
unsigned keylen);
|
||||
|
||||
/* Type for the cipher_encrypt function. */
|
||||
typedef void (*gcry_cipher_encrypt_t) (void *c,
|
||||
unsigned char *outbuf,
|
||||
const unsigned char *inbuf);
|
||||
|
||||
/* Type for the cipher_decrypt function. */
|
||||
typedef void (*gcry_cipher_decrypt_t) (void *c,
|
||||
unsigned char *outbuf,
|
||||
const unsigned char *inbuf);
|
||||
|
||||
/* Type for the cipher_stencrypt function. */
|
||||
typedef void (*gcry_cipher_stencrypt_t) (void *c,
|
||||
unsigned char *outbuf,
|
||||
const unsigned char *inbuf,
|
||||
unsigned int n);
|
||||
|
||||
/* Type for the cipher_stdecrypt function. */
|
||||
typedef void (*gcry_cipher_stdecrypt_t) (void *c,
|
||||
unsigned char *outbuf,
|
||||
const unsigned char *inbuf,
|
||||
unsigned int n);
|
||||
|
||||
typedef struct gcry_cipher_oid_spec
|
||||
{
|
||||
const char *oid;
|
||||
int mode;
|
||||
} gcry_cipher_oid_spec_t;
|
||||
|
||||
/* Module specification structure for ciphers. */
|
||||
typedef struct gcry_cipher_spec
|
||||
{
|
||||
const char *name;
|
||||
const char **aliases;
|
||||
gcry_cipher_oid_spec_t *oids;
|
||||
grub_size_t blocksize;
|
||||
grub_size_t keylen;
|
||||
grub_size_t contextsize;
|
||||
gcry_cipher_setkey_t setkey;
|
||||
gcry_cipher_encrypt_t encrypt;
|
||||
gcry_cipher_decrypt_t decrypt;
|
||||
gcry_cipher_stencrypt_t stencrypt;
|
||||
gcry_cipher_stdecrypt_t stdecrypt;
|
||||
} gcry_cipher_spec_t;
|
||||
|
||||
struct grub_cipher
|
||||
{
|
||||
struct grub_cipher *next;
|
||||
const char *name;
|
||||
};
|
||||
typedef struct grub_cipher *grub_cipher_t;
|
||||
|
||||
extern grub_cipher_t EXPORT_VAR (grub_ciphers);
|
||||
void EXPORT_FUNC(grub_burn_stack) (grub_size_t size);
|
||||
|
||||
|
||||
#endif
|
36
include/grub/gcry_wrap.h
Normal file
36
include/grub/gcry_wrap.h
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GRUB_GCRY_WRAP_HEADER
|
||||
#define GRUB_GCRY_WRAP_HEADER 1
|
||||
|
||||
#include <grub/types.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/crypto.h>
|
||||
|
||||
typedef grub_uint32_t u32;
|
||||
typedef grub_uint16_t u16;
|
||||
typedef grub_uint8_t byte;
|
||||
typedef grub_size_t size_t;
|
||||
|
||||
#define _gcry_burn_stack grub_burn_stack
|
||||
#define log_error(fmt, args...) grub_dprintf ("crypto", fmt, ## args)
|
||||
|
||||
#endif
|
34
kern/crypto.c
Normal file
34
kern/crypto.c
Normal file
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1999, 2001, 2002, 2003, 2007,
|
||||
* 2008, 2009 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <grub/crypto.h>
|
||||
#include <grub/misc.h>
|
||||
|
||||
grub_cipher_t grub_ciphers;
|
||||
|
||||
/* Based on libgcrypt-1.4.4/src/misc.c. */
|
||||
void
|
||||
grub_burn_stack (grub_size_t size)
|
||||
{
|
||||
char buf[64];
|
||||
|
||||
grub_memset (buf, 0, sizeof (buf));
|
||||
size -= sizeof (buf);
|
||||
if (size > 0)
|
||||
grub_burn_stack (size);
|
||||
}
|
Loading…
Reference in a new issue