Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
bdb275bb
Commit
bdb275bb
authored
Jun 20, 2019
by
Herbert Xu
Browse files
Options
Browse Files
Download
Plain Diff
Merge
git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Merge crypto tree to pick up vmx changes.
parents
b0d76521
7829a0c1
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
100 additions
and
129 deletions
+100
-129
crypto/hmac.c
crypto/hmac.c
+4
-0
crypto/jitterentropy-kcapi.c
crypto/jitterentropy-kcapi.c
+1
-1
drivers/crypto/caam/ctrl.c
drivers/crypto/caam/ctrl.c
+1
-1
drivers/crypto/vmx/aesp8-ppc.pl
drivers/crypto/vmx/aesp8-ppc.pl
+1
-1
drivers/crypto/vmx/ghash.c
drivers/crypto/vmx/ghash.c
+86
-125
include/crypto/hash.h
include/crypto/hash.h
+7
-1
No files found.
crypto/hmac.c
View file @
bdb275bb
...
...
@@ -157,6 +157,10 @@ static int hmac_init_tfm(struct crypto_tfm *tfm)
parent
->
descsize
=
sizeof
(
struct
shash_desc
)
+
crypto_shash_descsize
(
hash
);
if
(
WARN_ON
(
parent
->
descsize
>
HASH_MAX_DESCSIZE
))
{
crypto_free_shash
(
hash
);
return
-
EINVAL
;
}
ctx
->
hash
=
hash
;
return
0
;
...
...
crypto/jitterentropy-kcapi.c
View file @
bdb275bb
...
...
@@ -193,7 +193,7 @@ static void __exit jent_mod_exit(void)
crypto_unregister_rng
(
&
jent_alg
);
}
subsys_initcall
(
jent_mod_init
);
module_init
(
jent_mod_init
);
module_exit
(
jent_mod_exit
);
MODULE_LICENSE
(
"Dual BSD/GPL"
);
...
...
drivers/crypto/caam/ctrl.c
View file @
bdb275bb
...
...
@@ -469,7 +469,7 @@ static int caam_get_era(struct caam_ctrl __iomem *ctrl)
}
/*
* ERRATA: imx6 devices (imx6D, imx6Q, imx6DL, imx6S, imx6DP and imx6
DQ
)
* ERRATA: imx6 devices (imx6D, imx6Q, imx6DL, imx6S, imx6DP and imx6
QP
)
* have an issue wherein AXI bus transactions may not occur in the correct
* order. This isn't a problem running single descriptors, but can be if
* running multiple concurrent descriptors. Reworking the driver to throttle
...
...
drivers/crypto/vmx/aesp8-ppc.pl
View file @
bdb275bb
...
...
@@ -1357,7 +1357,7 @@ Loop_ctr32_enc:
addi $idx,$idx,16
bdnz Loop_ctr32_enc
vaddu
w
m $ivec,$ivec,$one
vaddu
q
m $ivec,$ivec,$one
vmr $dat,$inptail
lvx $inptail,0,$inp
addi $inp,$inp,16
...
...
drivers/crypto/vmx/ghash.c
View file @
bdb275bb
// SPDX-License-Identifier: GPL-2.0
/**
* GHASH routines supporting VMX instructions on the Power 8
*
* Copyright (C) 2015 International Business Machines Inc.
*
* This program 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; version 2 only.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* Copyright (C) 2015, 2019 International Business Machines Inc.
*
* Author: Marcelo Henrique Cerri <mhcerri@br.ibm.com>
*
* Extended by Daniel Axtens <dja@axtens.net> to replace the fallback
* mechanism. The new approach is based on arm64 code, which is:
* Copyright (C) 2014 - 2018 Linaro Ltd. <ard.biesheuvel@linaro.org>
*/
#include <linux/types.h>
...
...
@@ -38,70 +30,25 @@ void gcm_ghash_p8(u64 Xi[2], const u128 htable[16],
const
u8
*
in
,
size_t
len
);
struct
p8_ghash_ctx
{
/* key used by vector asm */
u128
htable
[
16
];
struct
crypto_shash
*
fallback
;
/* key used by software fallback */
be128
key
;
};
struct
p8_ghash_desc_ctx
{
u64
shash
[
2
];
u8
buffer
[
GHASH_DIGEST_SIZE
];
int
bytes
;
struct
shash_desc
fallback_desc
;
};
static
int
p8_ghash_init_tfm
(
struct
crypto_tfm
*
tfm
)
{
const
char
*
alg
=
"ghash-generic"
;
struct
crypto_shash
*
fallback
;
struct
crypto_shash
*
shash_tfm
=
__crypto_shash_cast
(
tfm
);
struct
p8_ghash_ctx
*
ctx
=
crypto_tfm_ctx
(
tfm
);
fallback
=
crypto_alloc_shash
(
alg
,
0
,
CRYPTO_ALG_NEED_FALLBACK
);
if
(
IS_ERR
(
fallback
))
{
printk
(
KERN_ERR
"Failed to allocate transformation for '%s': %ld
\n
"
,
alg
,
PTR_ERR
(
fallback
));
return
PTR_ERR
(
fallback
);
}
crypto_shash_set_flags
(
fallback
,
crypto_shash_get_flags
((
struct
crypto_shash
*
)
tfm
));
/* Check if the descsize defined in the algorithm is still enough. */
if
(
shash_tfm
->
descsize
<
sizeof
(
struct
p8_ghash_desc_ctx
)
+
crypto_shash_descsize
(
fallback
))
{
printk
(
KERN_ERR
"Desc size of the fallback implementation (%s) does not match the expected value: %lu vs %u
\n
"
,
alg
,
shash_tfm
->
descsize
-
sizeof
(
struct
p8_ghash_desc_ctx
),
crypto_shash_descsize
(
fallback
));
return
-
EINVAL
;
}
ctx
->
fallback
=
fallback
;
return
0
;
}
static
void
p8_ghash_exit_tfm
(
struct
crypto_tfm
*
tfm
)
{
struct
p8_ghash_ctx
*
ctx
=
crypto_tfm_ctx
(
tfm
);
if
(
ctx
->
fallback
)
{
crypto_free_shash
(
ctx
->
fallback
);
ctx
->
fallback
=
NULL
;
}
}
static
int
p8_ghash_init
(
struct
shash_desc
*
desc
)
{
struct
p8_ghash_ctx
*
ctx
=
crypto_tfm_ctx
(
crypto_shash_tfm
(
desc
->
tfm
));
struct
p8_ghash_desc_ctx
*
dctx
=
shash_desc_ctx
(
desc
);
dctx
->
bytes
=
0
;
memset
(
dctx
->
shash
,
0
,
GHASH_DIGEST_SIZE
);
dctx
->
fallback_desc
.
tfm
=
ctx
->
fallback
;
return
crypto_shash_init
(
&
dctx
->
fallback_desc
);
return
0
;
}
static
int
p8_ghash_setkey
(
struct
crypto_shash
*
tfm
,
const
u8
*
key
,
...
...
@@ -119,7 +66,51 @@ static int p8_ghash_setkey(struct crypto_shash *tfm, const u8 *key,
disable_kernel_vsx
();
pagefault_enable
();
preempt_enable
();
return
crypto_shash_setkey
(
ctx
->
fallback
,
key
,
keylen
);
memcpy
(
&
ctx
->
key
,
key
,
GHASH_BLOCK_SIZE
);
return
0
;
}
static
inline
void
__ghash_block
(
struct
p8_ghash_ctx
*
ctx
,
struct
p8_ghash_desc_ctx
*
dctx
)
{
if
(
crypto_simd_usable
())
{
preempt_disable
();
pagefault_disable
();
enable_kernel_vsx
();
gcm_ghash_p8
(
dctx
->
shash
,
ctx
->
htable
,
dctx
->
buffer
,
GHASH_DIGEST_SIZE
);
disable_kernel_vsx
();
pagefault_enable
();
preempt_enable
();
}
else
{
crypto_xor
((
u8
*
)
dctx
->
shash
,
dctx
->
buffer
,
GHASH_BLOCK_SIZE
);
gf128mul_lle
((
be128
*
)
dctx
->
shash
,
&
ctx
->
key
);
}
}
static
inline
void
__ghash_blocks
(
struct
p8_ghash_ctx
*
ctx
,
struct
p8_ghash_desc_ctx
*
dctx
,
const
u8
*
src
,
unsigned
int
srclen
)
{
if
(
crypto_simd_usable
())
{
preempt_disable
();
pagefault_disable
();
enable_kernel_vsx
();
gcm_ghash_p8
(
dctx
->
shash
,
ctx
->
htable
,
src
,
srclen
);
disable_kernel_vsx
();
pagefault_enable
();
preempt_enable
();
}
else
{
while
(
srclen
>=
GHASH_BLOCK_SIZE
)
{
crypto_xor
((
u8
*
)
dctx
->
shash
,
src
,
GHASH_BLOCK_SIZE
);
gf128mul_lle
((
be128
*
)
dctx
->
shash
,
&
ctx
->
key
);
srclen
-=
GHASH_BLOCK_SIZE
;
src
+=
GHASH_BLOCK_SIZE
;
}
}
}
static
int
p8_ghash_update
(
struct
shash_desc
*
desc
,
...
...
@@ -129,49 +120,33 @@ static int p8_ghash_update(struct shash_desc *desc,
struct
p8_ghash_ctx
*
ctx
=
crypto_tfm_ctx
(
crypto_shash_tfm
(
desc
->
tfm
));
struct
p8_ghash_desc_ctx
*
dctx
=
shash_desc_ctx
(
desc
);
if
(
!
crypto_simd_usable
())
{
return
crypto_shash_update
(
&
dctx
->
fallback_desc
,
src
,
srclen
);
}
else
{
if
(
dctx
->
bytes
)
{
if
(
dctx
->
bytes
+
srclen
<
GHASH_DIGEST_SIZE
)
{
memcpy
(
dctx
->
buffer
+
dctx
->
bytes
,
src
,
srclen
);
dctx
->
bytes
+=
srclen
;
return
0
;
}
if
(
dctx
->
bytes
)
{
if
(
dctx
->
bytes
+
srclen
<
GHASH_DIGEST_SIZE
)
{
memcpy
(
dctx
->
buffer
+
dctx
->
bytes
,
src
,
GHASH_DIGEST_SIZE
-
dctx
->
bytes
);
preempt_disable
();
pagefault_disable
();
enable_kernel_vsx
();
gcm_ghash_p8
(
dctx
->
shash
,
ctx
->
htable
,
dctx
->
buffer
,
GHASH_DIGEST_SIZE
);
disable_kernel_vsx
();
pagefault_enable
();
preempt_enable
();
src
+=
GHASH_DIGEST_SIZE
-
dctx
->
bytes
;
srclen
-=
GHASH_DIGEST_SIZE
-
dctx
->
bytes
;
dctx
->
bytes
=
0
;
}
len
=
srclen
&
~
(
GHASH_DIGEST_SIZE
-
1
);
if
(
len
)
{
preempt_disable
();
pagefault_disable
();
enable_kernel_vsx
();
gcm_ghash_p8
(
dctx
->
shash
,
ctx
->
htable
,
src
,
len
);
disable_kernel_vsx
();
pagefault_enable
();
preempt_enable
();
src
+=
len
;
srclen
-=
len
;
}
if
(
srclen
)
{
memcpy
(
dctx
->
buffer
,
src
,
srclen
);
dctx
->
bytes
=
srclen
;
srclen
);
dctx
->
bytes
+=
srclen
;
return
0
;
}
return
0
;
memcpy
(
dctx
->
buffer
+
dctx
->
bytes
,
src
,
GHASH_DIGEST_SIZE
-
dctx
->
bytes
);
__ghash_block
(
ctx
,
dctx
);
src
+=
GHASH_DIGEST_SIZE
-
dctx
->
bytes
;
srclen
-=
GHASH_DIGEST_SIZE
-
dctx
->
bytes
;
dctx
->
bytes
=
0
;
}
len
=
srclen
&
~
(
GHASH_DIGEST_SIZE
-
1
);
if
(
len
)
{
__ghash_blocks
(
ctx
,
dctx
,
src
,
len
);
src
+=
len
;
srclen
-=
len
;
}
if
(
srclen
)
{
memcpy
(
dctx
->
buffer
,
src
,
srclen
);
dctx
->
bytes
=
srclen
;
}
return
0
;
}
static
int
p8_ghash_final
(
struct
shash_desc
*
desc
,
u8
*
out
)
...
...
@@ -180,25 +155,14 @@ static int p8_ghash_final(struct shash_desc *desc, u8 *out)
struct
p8_ghash_ctx
*
ctx
=
crypto_tfm_ctx
(
crypto_shash_tfm
(
desc
->
tfm
));
struct
p8_ghash_desc_ctx
*
dctx
=
shash_desc_ctx
(
desc
);
if
(
!
crypto_simd_usable
())
{
return
crypto_shash_final
(
&
dctx
->
fallback_desc
,
out
);
}
else
{
if
(
dctx
->
bytes
)
{
for
(
i
=
dctx
->
bytes
;
i
<
GHASH_DIGEST_SIZE
;
i
++
)
dctx
->
buffer
[
i
]
=
0
;
preempt_disable
();
pagefault_disable
();
enable_kernel_vsx
();
gcm_ghash_p8
(
dctx
->
shash
,
ctx
->
htable
,
dctx
->
buffer
,
GHASH_DIGEST_SIZE
);
disable_kernel_vsx
();
pagefault_enable
();
preempt_enable
();
dctx
->
bytes
=
0
;
}
memcpy
(
out
,
dctx
->
shash
,
GHASH_DIGEST_SIZE
);
return
0
;
if
(
dctx
->
bytes
)
{
for
(
i
=
dctx
->
bytes
;
i
<
GHASH_DIGEST_SIZE
;
i
++
)
dctx
->
buffer
[
i
]
=
0
;
__ghash_block
(
ctx
,
dctx
);
dctx
->
bytes
=
0
;
}
memcpy
(
out
,
dctx
->
shash
,
GHASH_DIGEST_SIZE
);
return
0
;
}
struct
shash_alg
p8_ghash_alg
=
{
...
...
@@ -213,11 +177,8 @@ struct shash_alg p8_ghash_alg = {
.
cra_name
=
"ghash"
,
.
cra_driver_name
=
"p8_ghash"
,
.
cra_priority
=
1000
,
.
cra_flags
=
CRYPTO_ALG_NEED_FALLBACK
,
.
cra_blocksize
=
GHASH_BLOCK_SIZE
,
.
cra_ctxsize
=
sizeof
(
struct
p8_ghash_ctx
),
.
cra_module
=
THIS_MODULE
,
.
cra_init
=
p8_ghash_init_tfm
,
.
cra_exit
=
p8_ghash_exit_tfm
,
},
};
include/crypto/hash.h
View file @
bdb275bb
...
...
@@ -150,7 +150,13 @@ struct shash_desc {
};
#define HASH_MAX_DIGESTSIZE 64
#define HASH_MAX_DESCSIZE 360
/*
* Worst case is hmac(sha3-224-generic). Its context is a nested 'shash_desc'
* containing a 'struct sha3_state'.
*/
#define HASH_MAX_DESCSIZE (sizeof(struct shash_desc) + 360)
#define HASH_MAX_STATESIZE 512
#define SHASH_DESC_ON_STACK(shash, ctx) \
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment