util/import_gcry: Fix pylint warnings

Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Vladimir Serbinenko 2025-07-07 14:52:18 +00:00 committed by Daniel Kiper
parent 334353a977
commit de49514c9e

View File

@ -1,3 +1,4 @@
# pylint: disable=invalid-name,line-too-long
#*
#* GRUB -- GRand Unified Bootloader
#* Copyright (C) 2009 Free Software Foundation, Inc.
@ -27,7 +28,6 @@ def removesuffix(base: str, suffix: str) -> str:
if base.endswith(suffix):
return base[:-len(suffix)]
else:
return base
@ -36,7 +36,6 @@ def removeprefix(base: str, prefix: str) -> str:
if base.startswith(prefix):
return base[len(prefix):]
else:
return base
if len (sys.argv) < 3:
@ -46,44 +45,16 @@ indir = sys.argv[1]
outdir = sys.argv[2]
basedir = os.path.join (outdir, "lib/libgcrypt-grub")
try:
os.makedirs (basedir)
except:
print ("WARNING: %s already exists" % basedir)
os.makedirs (basedir, exist_ok=True)
cipher_dir_in = os.path.join (indir, "cipher")
cipher_dir_out = os.path.join (basedir, "cipher")
try:
os.makedirs (cipher_dir_out)
except:
print ("WARNING: %s already exists" % cipher_dir_out)
os.makedirs (cipher_dir_out, exist_ok=True)
mpidir = os.path.join (basedir, "mpi")
try:
os.makedirs (mpidir)
except:
print ("WARNING: %s already exists" % mpidir)
os.makedirs (mpidir, exist_ok=True)
srcdir = os.path.join (basedir, "src")
try:
os.makedirs (srcdir)
except:
print ("WARNING: %s already exists" % srcdir)
os.makedirs (srcdir, exist_ok=True)
cipher_files = sorted (os.listdir (cipher_dir_in))
conf = codecs.open (os.path.join ("grub-core", "Makefile.gcry.def"), "w", "utf-8")
conf.write ("AutoGen definitions Makefile.tpl;\n\n")
confutil = codecs.open ("Makefile.utilgcry.def", "w", "utf-8")
confutil.write ("AutoGen definitions Makefile.tpl;\n\n")
confutil.write ("library = {\n");
confutil.write (" name = libgrubgcry.a;\n");
confutil.write (" cflags = '$(CFLAGS_GCRY)';\n");
confutil.write (" cppflags = '$(CPPFLAGS_GCRY)';\n");
confutil.write (" extra_dist = grub-core/lib/libgcrypt-grub/cipher/ChangeLog;\n");
confutil.write ("\n");
for src in ['src/const-time.c']:
confutil.write (" common = grub-core/lib/libgcrypt-grub/%s;\n" % src)
confutil.write ("\n");
chlog = ""
modules_sym_md = []
@ -123,31 +94,51 @@ mdblocksizes = {"_gcry_digest_spec_crc32" : 64,
"_gcry_digest_spec_cshake256": 64,
"_gcry_digest_spec_blake2": "GRUB_BLAKE2 ## BS ## _BLOCK_SIZE"}
cryptolist = codecs.open (os.path.join (cipher_dir_out, "crypto.lst"), "w", "utf-8")
cipher_files = sorted (os.listdir (cipher_dir_in))
# rijndael is the only cipher using aliases. So no need for mangling, just
# hardcode it
cryptolist.write ("RIJNDAEL: gcry_rijndael\n");
cryptolist.write ("RIJNDAEL192: gcry_rijndael\n");
cryptolist.write ("RIJNDAEL256: gcry_rijndael\n");
cryptolist.write ("AES128: gcry_rijndael\n");
cryptolist.write ("AES-128: gcry_rijndael\n");
cryptolist.write ("AES-192: gcry_rijndael\n");
cryptolist.write ("AES-256: gcry_rijndael\n");
with codecs.open (os.path.join (cipher_dir_out, "crypto.lst"), "w", "utf-8") as cryptolist, \
codecs.open (os.path.join ("grub-core", "Makefile.gcry.def"), "w", "utf-8") as conf, \
codecs.open ("Makefile.utilgcry.def", "w", "utf-8") as confutil:
cryptolist.write ("ADLER32: adler32\n");
cryptolist.write ("CRC64: crc64\n");
conf.write ("AutoGen definitions Makefile.tpl;\n\n")
confutil.write ("AutoGen definitions Makefile.tpl;\n\n")
confutil.write ("library = {\n")
confutil.write (" name = libgrubgcry.a;\n")
confutil.write (" cflags = '$(CFLAGS_GCRY)';\n")
confutil.write (" cppflags = '$(CPPFLAGS_GCRY)';\n")
confutil.write (" extra_dist = grub-core/lib/libgcrypt-grub/cipher/ChangeLog;\n")
confutil.write ("\n")
extra_files = {
for src in ['src/const-time.c']:
confutil.write (" common = grub-core/lib/libgcrypt-grub/%s;\n" % src)
confutil.write ("\n")
# rijndael is the only cipher using aliases. So no need for mangling, just
# hardcode it
cryptolist.write ("RIJNDAEL: gcry_rijndael\n")
cryptolist.write ("RIJNDAEL192: gcry_rijndael\n")
cryptolist.write ("RIJNDAEL256: gcry_rijndael\n")
cryptolist.write ("AES128: gcry_rijndael\n")
cryptolist.write ("AES-128: gcry_rijndael\n")
cryptolist.write ("AES-192: gcry_rijndael\n")
cryptolist.write ("AES-256: gcry_rijndael\n")
cryptolist.write ("ADLER32: adler32\n")
cryptolist.write ("CRC64: crc64\n")
extra_files = {
"gcry_camellia": ["camellia.c"], # Main file is camellia-glue.c
"gcry_sha512" : ["hash-common.c"],
}
extra_files_list = [x for xs in extra_files.values() for x in xs] + ["pubkey-util.c", "rsa-common.c", "dsa-common.c", "md.c"]
}
extra_files_list = [x for xs in extra_files.values() for x in xs] + [
"pubkey-util.c", "rsa-common.c", "dsa-common.c", "md.c"]
for cipher_file in cipher_files:
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" or cipher_file == "ChangeLog-2011":
if cipher_file in ["ChangeLog", "ChangeLog-2011"]:
continue
chlognew = " * %s" % cipher_file
# Unused generic support files
@ -162,7 +153,9 @@ for cipher_file in cipher_files:
# TODO: Support ECC
# TODO: Support quantum-resistant
if cipher_file in ["poly1305.c", "chacha20.c", "ecc.c", "elgamal.c",
"sntrup761.c", "mceliece6688128f.c", "kyber-common.c", "kyber.c", "kyber-kdep.c", "kem-ecc.c", "kem.c"] or re.match (r"^ecc-.*\.c$", cipher_file):
"sntrup761.c", "mceliece6688128f.c", "kyber-common.c",
"kyber.c", "kyber-kdep.c", "kem-ecc.c",
"kem.c"] or re.match (r"^ecc-.*\.c$", cipher_file):
chlog = "%s%s: Removed\n" % (chlog, chlognew)
continue
# TODO: Use optimized versions
@ -179,8 +172,7 @@ for cipher_file in cipher_files:
nch = False
if re.match (r".*\.[ch]$", cipher_file):
isc = re.match (r".*\.c$", cipher_file)
f = codecs.open (infile, "r", "utf-8")
fw = codecs.open (outfile, "w", "utf-8")
with codecs.open (infile, "r", "utf-8") as f, codecs.open (outfile, "w", "utf-8") as fw:
fw.write ("/* This file was automatically imported with \n")
fw.write (" import_gcry.py. Please don't modify it */\n")
add_license = cipher_file == "pubkey-util.c" or (isc and not cipher_file in extra_files_list)
@ -219,9 +211,9 @@ for cipher_file in cipher_files:
skip_statement = False
skip_comma = False
if isc:
modname = "gcry_%s" % removesuffix(removesuffix(cipher_file, ".c"), "-glue").replace("-", "_")
modname = "gcry_%s" % removesuffix(removesuffix(cipher_file, ".c"),
"-glue").replace("-", "_")
for line in f:
line = line
if skip_statement:
if not re.search (";", line) is None:
skip_statement = False
@ -252,7 +244,7 @@ for cipher_file in cipher_files:
fw.write (" ,%s\n" % escapenl)
fw.write (" GRUB_UTIL_MODNAME(\"%s\")%s\n" % (modname, escapenl))
if ismd:
if not (mdname in mdblocksizes):
if mdname not in mdblocksizes:
print ("ERROR: Unknown digest blocksize: %s\n"
% mdname)
exit (1)
@ -284,32 +276,31 @@ for cipher_file in cipher_files:
# We're optimising for size and exclude anything needing good
# randomness.
if re.match ("(_gcry_hash_selftest_check_one|bulk_selftest_setkey|run_selftests|do_tripledes_set_extra_info|selftest|sm4_selftest|_gcry_[a-z0-9_]*_hash_buffers|_gcry_sha1_hash_buffer|tripledes_set2keys|_gcry_rmd160_mixblock|serpent_test|dsa_generate_ext|test_keys|gen_k|sign|gen_x931_parm_xp|generate_x931|generate_key|dsa_generate|dsa_sign|ecc_sign|generate|generate_fips186|_gcry_register_pk_dsa_progress|_gcry_register_pk_ecc_progress|progress|scanval|ec2os|ecc_generate_ext|ecc_generate|ecc_get_param|_gcry_register_pk_dsa_progress|gen_x931_parm_xp|gen_x931_parm_xi|rsa_decrypt|rsa_sign|rsa_generate_ext|rsa_generate|secret|check_exponent|rsa_blind|rsa_unblind|extract_a_from_sexp|curve_free|curve_copy|point_set|_gcry_dsa_gen_rfc6979_k|bits2octets|int2octets|_gcry_md_debug|_gcry_md_selftest|_gcry_md_is_enabled|_gcry_md_is_secure|_gcry_md_init|_gcry_md_info|md_get_algo|md_extract|_gcry_md_get |_gcry_md_get_algo |_gcry_md_extract|_gcry_md_setkey|md_setkey|prepare_macpads|_gcry_md_algo_name|search_oid|spec_from_oid|spec_from_name|spec_from_algo|map_algo|cshake_hash_buffers|selftest_seq)", line) is not None:
skip = 1
if not re.match ("selftest", line) is None and cipher_file == "idea.c":
skip = 3
if not re.match ("serpent_test", line) is None:
fw.write ("static const char *serpent_test (void) { return 0; }\n");
fw.write ("static const char *serpent_test (void) { return 0; }\n")
if not re.match ("sm4_selftest", line) is None:
fw.write ("static const char *sm4_selftest (void) { return 0; }\n");
fw.write ("static const char *sm4_selftest (void) { return 0; }\n")
hash_buf = re.match ("(_gcry_[a-z0-9_]*_hash_buffers)", line)
if hash_buf is not None:
fw.write ("#define %s 0" % (hash_buf.group(0)))
if not re.match ("dsa_generate", line) is None:
fw.write ("#define dsa_generate 0");
fw.write ("#define dsa_generate 0")
if not re.match ("ecc_generate", line) is None:
fw.write ("#define ecc_generate 0");
fw.write ("#define ecc_generate 0")
if not re.match ("rsa_generate ", line) is None:
fw.write ("#define rsa_generate 0");
fw.write ("#define rsa_generate 0")
if not re.match ("rsa_sign", line) is None:
fw.write ("#define rsa_sign 0");
fw.write ("#define rsa_sign 0")
if not re.match ("rsa_decrypt", line) is None:
fw.write ("#define rsa_decrypt 0");
fw.write ("#define rsa_decrypt 0")
if not re.match ("dsa_sign", line) is None:
fw.write ("#define dsa_sign 0");
fw.write ("#define dsa_sign 0")
if not re.match ("ecc_sign", line) is None:
fw.write ("#define ecc_sign 0");
fw.write ("#define ecc_sign 0")
if not re.match ("search_oid", line) is None:
fw.write ("#define search_oid(a,b) grub_crypto_lookup_md_by_oid(a)")
if not re.match ("spec_from_name", line) is None:
@ -335,11 +326,12 @@ for cipher_file in cipher_files:
continue
m = re.match ("(const )?gcry_cipher_spec_t", line)
if isc and not m is None:
assert (not ismd)
assert (not ispk)
assert (not iscipher)
assert (not iscryptostart)
ciphername = removeprefix(removeprefix(line, "const "), "gcry_cipher_spec_t").strip ()
assert not ismd
assert not ispk
assert not iscipher
assert not iscryptostart
ciphername = removeprefix(removeprefix(line, "const "),
"gcry_cipher_spec_t").strip ()
ciphername = re.match("[a-zA-Z0-9_]*",ciphername).group ()
ciphernames.append (ciphername)
iscipher = True
@ -347,10 +339,10 @@ for cipher_file in cipher_files:
m = re.match ("(const )?gcry_pk_spec_t", line)
if isc and not m is None:
assert (not ismd)
assert (not ispk)
assert (not iscipher)
assert (not iscryptostart)
assert not ismd
assert not ispk
assert not iscipher
assert not iscryptostart
pkname = removeprefix(removeprefix(line, "const "), "gcry_pk_spec_t").strip ()
pkname = re.match("[a-zA-Z0-9_]*",pkname).group ()
pknames.append (pkname)
@ -366,10 +358,10 @@ for cipher_file in cipher_files:
m = re.match ("(const )?gcry_md_spec_t", line)
if isc and not m is None:
assert (not ismd)
assert (not ispk)
assert (not iscipher)
assert (not iscryptostart)
assert not ismd
assert not ispk
assert not iscipher
assert not iscryptostart
line = removeprefix(line, "const ")
mdname = removeprefix(removeprefix(line, "const "), "gcry_md_spec_t").strip ()
mdname = re.match("[a-zA-Z0-9_]*",mdname).group ()
@ -380,10 +372,10 @@ for cipher_file in cipher_files:
iscryptostart = True
m = re.match (" (const )?gcry_md_spec_t _gcry_digest_spec_blake2.*\\\\", line)
if isc and not m is None:
assert (not ismd)
assert (not ispk)
assert (not iscipher)
assert (not iscryptostart)
assert not ismd
assert not ispk
assert not iscipher
assert not iscryptostart
line = removeprefix(line, " const ")
ismd = True
ismddefine = True
@ -519,7 +511,7 @@ for cipher_file in cipher_files:
fw.write (line)
if len (ciphernames) > 0 or len (mdnames) > 0 or len (pknames) > 0:
modfiles = [cipher_file]
if modname in extra_files.keys():
if modname in extra_files:
modfiles += extra_files[modname]
if len (ciphernames) > 0 or len (mdnames) > 0:
modules_sym_md.append (modname)
@ -574,66 +566,54 @@ for cipher_file in cipher_files:
if modname == "gcry_ecc":
conf.write (" common = lib/libgcrypt-grub/mpi/ec.c;\n")
conf.write (" cflags = '$(CFLAGS_GCRY) -Wno-redundant-decls';\n")
elif modname == "gcry_rijndael" or modname == "gcry_md4" or modname == "gcry_md5" or modname == "gcry_rmd160" or modname == "gcry_sha1" or modname == "gcry_sha256" or modname == "gcry_sha512" or modname == "gcry_tiger":
elif modname in ["gcry_rijndael", "gcry_md4", "gcry_md5", "gcry_rmd160", "gcry_sha1", "gcry_sha256", "gcry_sha512", "gcry_tiger"]:
# Alignment checked by hand
conf.write (" cflags = '$(CFLAGS_GCRY) -Wno-cast-align';\n");
conf.write (" cflags = '$(CFLAGS_GCRY) -Wno-cast-align';\n")
else:
conf.write (" cflags = '$(CFLAGS_GCRY)';\n");
conf.write (" cppflags = '$(CPPFLAGS_GCRY)';\n");
conf.write (" cflags = '$(CFLAGS_GCRY)';\n")
conf.write (" cppflags = '$(CPPFLAGS_GCRY)';\n")
conf.write ("};\n\n")
f.close ()
fw.close ()
if nch:
chlog = "%s%s\n" % (chlog, chlognew)
elif isc and cipher_file not in extra_files_list:
print ("WARNING: C file isn't a module: %s" % cipher_file)
f.close ()
fw.close ()
os.remove (outfile)
chlog = "%s\n * %s: Removed" % (chlog, cipher_file)
continue
chlog = "%s%sSkipped unknown file\n" % (chlog, chlognew)
print ("WARNING: unknown file %s" % cipher_file)
cryptolist.close ()
for src in sorted (os.listdir (os.path.join (indir, "src"))):
if src == "versioninfo.rc.in" or src == "ath.c" or src == "ChangeLog-2011" \
or src == "dumpsexp.c" or src == "fips.c" or src == "gcrypt.h.in" \
or src == "gcryptrnd.c"or src == "getrandom.c" \
or src == "global.c" or src == "hmac256.c" \
or src == "hwfeatures.c" or src == "libgcrypt-config.in" \
or src == "libgcrypt.def" or src == "libgcrypt.m4" \
or src == "libgcrypt.vers" or src == "Makefile.am" \
or src == "Manifest" or src == "misc.c" \
or src == "missing-string.c" or src == "module.c" \
or src == "secmem.c" \
or src == "stdmem.c" or src == "visibility.c":
for src in sorted (os.listdir (os.path.join (indir, "src"))):
if src in ["versioninfo.rc.in", "ath.c", "ChangeLog-2011",
"dumpsexp.c", "fips.c", "gcrypt.h.in",
"gcryptrnd.c", "getrandom.c",
"global.c", "hmac256.c",
"hwfeatures.c", "libgcrypt-config.in",
"libgcrypt.def", "libgcrypt.m4",
"libgcrypt.vers", "Makefile.am",
"Manifest", "misc.c",
"missing-string.c", "module.c",
"secmem.c",
"stdmem.c", "visibility.c"]:
continue
outfile = os.path.join (basedir, "src", src)
infile = os.path.join (indir, "src", src)
if os.path.isdir (infile):
continue
fw = codecs.open (outfile, "w", "utf-8")
with codecs.open (outfile, "w", "utf-8") as fw:
if src == "gcrypt-module.h":
fw.close ()
continue
if src == "visibility.h":
fw.write ("# include <grub/gcrypt/gcrypt.h>\n")
fw.close ()
continue
f = codecs.open (infile, "r", "utf-8")
with codecs.open (infile, "r", "utf-8") as f:
if src == "types.h":
fw.write (f.read ().replace ("float f;", "").replace ("double g;", ""))
f.close ()
fw.close ()
continue
if src == "cipher-proto.h":
fw.write("#include <grub/crypto.h>\n")
fw.write("typedef gcry_selftest_func_t selftest_func_t;")
f.close ()
fw.close ()
continue
if src == "g10lib.h":
@ -641,28 +621,22 @@ for src in sorted (os.listdir (os.path.join (indir, "src"))):
fw.write("#include <grub/crypto.h>\n")
fw.write("#include <stdlib.h>\n")
fw.write (f.read ().replace ("(printf,f,a)", "(__printf__,f,a)").replace ("#include \"../compat/libcompat.h\"", "").replace("#define N_(a) (a)", ""))
f.close ()
fw.close ()
continue
fw.write (f.read ())
f.close ()
fw.close ()
for src in sorted (os.listdir (os.path.join (indir, "mpi"))):
if src == "config.links" or src == "ChangeLog-2011" \
or src == "Manifest" \
or src == "Makefile.am":
for src in sorted (os.listdir (os.path.join (indir, "mpi"))):
if src in ["config.links", "ChangeLog-2011", "Manifest", "Makefile.am"]:
continue
infile = os.path.join (indir, "mpi", src)
outfile = os.path.join (basedir, "mpi", src)
if os.path.isdir (infile):
continue
f = codecs.open (infile, "r", "utf-8")
fw = codecs.open (outfile, "w", "utf-8")
with codecs.open (infile, "r", "utf-8") as f, codecs.open (outfile, "w", "utf-8") as fw:
fw.write ("/* This file was automatically imported with \n")
fw.write (" import_gcry.py. Please don't modify it */\n")
hold = False
holdline = ""
skip = 0
for line in f:
if skip > 0:
@ -688,71 +662,65 @@ for src in sorted (os.listdir (os.path.join (indir, "mpi"))):
continue
fw.write (line)
chlog = "%s * crypto.lst: New file.\n" % chlog
chlog = "%s * crypto.lst: New file.\n" % chlog
outfile = os.path.join (cipher_dir_out, "types.h")
fw=codecs.open (outfile, "w", "utf-8")
fw.write ("#include <grub/types.h>\n")
fw.write ("#include <cipher_wrap.h>\n")
chlog = "%s * types.h: New file.\n" % chlog
fw.close ()
outfile = os.path.join (cipher_dir_out, "types.h")
with codecs.open (outfile, "w", "utf-8") as fw:
fw.write ("#include <grub/types.h>\n")
fw.write ("#include <cipher_wrap.h>\n")
chlog = "%s * types.h: New file.\n" % chlog
outfile = os.path.join (cipher_dir_out, "memory.h")
fw=codecs.open (outfile, "w", "utf-8")
fw.write ("#include <cipher_wrap.h>\n")
chlog = "%s * memory.h: New file.\n" % chlog
fw.close ()
outfile = os.path.join (cipher_dir_out, "memory.h")
with codecs.open (outfile, "w", "utf-8") as fw:
fw.write ("#include <cipher_wrap.h>\n")
chlog = "%s * memory.h: New file.\n" % chlog
outfile = os.path.join (cipher_dir_out, "cipher.h")
fw=codecs.open (outfile, "w", "utf-8")
fw.write ("#include <grub/crypto.h>\n")
fw.write ("#include <cipher_wrap.h>\n")
chlog = "%s * cipher.h: Likewise.\n" % chlog
fw.close ()
outfile = os.path.join (cipher_dir_out, "cipher.h")
with codecs.open (outfile, "w", "utf-8") as fw:
fw.write ("#include <grub/crypto.h>\n")
fw.write ("#include <cipher_wrap.h>\n")
chlog = "%s * cipher.h: Likewise.\n" % chlog
outfile = os.path.join (cipher_dir_out, "g10lib.h")
fw=codecs.open (outfile, "w", "utf-8")
fw.write ("#include <cipher_wrap.h>\n")
chlog = "%s * g10lib.h: Likewise.\n" % chlog
fw.close ()
outfile = os.path.join (cipher_dir_out, "g10lib.h")
with codecs.open (outfile, "w", "utf-8") as fw:
fw.write ("#include <cipher_wrap.h>\n")
chlog = "%s * g10lib.h: Likewise.\n" % chlog
conf.close ();
conf.close ()
initfile = codecs.open (os.path.join (cipher_dir_out, "init.c"), "w", "utf-8")
initfile.write ("#include <grub/crypto.h>\n")
for module in modules_sym_md:
with codecs.open (os.path.join (cipher_dir_out, "init.c"), "w", "utf-8") as initfile:
initfile.write ("#include <grub/crypto.h>\n")
for module in modules_sym_md:
initfile.write ("extern void grub_%s_init (void);\n" % module)
initfile.write ("extern void grub_%s_fini (void);\n" % module)
initfile.write ("\n")
initfile.write ("void\n")
initfile.write ("grub_gcry_init_all (void)\n")
initfile.write ("{\n")
for module in modules_sym_md:
initfile.write ("\n")
initfile.write ("void\n")
initfile.write ("grub_gcry_init_all (void)\n")
initfile.write ("{\n")
for module in modules_sym_md:
initfile.write (" grub_%s_init ();\n" % module)
initfile.write ("}\n")
initfile.write ("\n")
initfile.write ("void\n")
initfile.write ("grub_gcry_fini_all (void)\n")
initfile.write ("{\n")
for module in modules_sym_md:
initfile.write ("}\n")
initfile.write ("\n")
initfile.write ("void\n")
initfile.write ("grub_gcry_fini_all (void)\n")
initfile.write ("{\n")
for module in modules_sym_md:
initfile.write (" grub_%s_fini ();\n" % module)
initfile.write ("}\n")
initfile.close ()
initfile.write ("}\n")
confutil.write (" common = grub-core/lib/libgcrypt-grub/cipher/init.c;\n")
confutil.write ("};\n");
confutil.close ();
confutil.write (" common = grub-core/lib/libgcrypt-grub/cipher/init.c;\n")
confutil.write ("};\n")
confutil.close ()
outfile = os.path.join (cipher_dir_out, "ChangeLog")
fw=codecs.open (outfile, "w", "utf-8")
dt = datetime.date.today ()
fw.write ("%04d-%02d-%02d Automatic import tool\n" % \
with codecs.open (outfile, "w", "utf-8") as fw:
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")
fw.close ()
fw.write ("\n")
fw.write (" Imported ciphers to GRUB\n")
fw.write ("\n")
fw.write (chlog)
fw.write ("\n")