Message ID | 1430730017-3712-1-git-send-email-ard.biesheuvel@linaro.org (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Herbert Xu |
Headers | show |
On 4 May 2015 at 10:00, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote: > The arm64 CRC32 (not CRC32c) implementation was not quite doing > the same thing as the generic one. Fix that. Thanks Ard, I agree the bitwise inverse at the end is applicable to Castagnoli, but not to the vanilla CRC-32 in the kernel. > > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Acked-by: Steve Capper <steve.capper@linaro.org> Cheers, -- Steve > --- > arch/arm64/crypto/crc32-arm64.c | 22 +++++++++++++++++++--- > 1 file changed, 19 insertions(+), 3 deletions(-) > > diff --git a/arch/arm64/crypto/crc32-arm64.c b/arch/arm64/crypto/crc32-arm64.c > index 9499199924ae..6a37c3c6b11d 100644 > --- a/arch/arm64/crypto/crc32-arm64.c > +++ b/arch/arm64/crypto/crc32-arm64.c > @@ -147,13 +147,21 @@ static int chksum_final(struct shash_desc *desc, u8 *out) > { > struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); > > + put_unaligned_le32(ctx->crc, out); > + return 0; > +} > + > +static int chksumc_final(struct shash_desc *desc, u8 *out) > +{ > + struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); > + > put_unaligned_le32(~ctx->crc, out); > return 0; > } > > static int __chksum_finup(u32 crc, const u8 *data, unsigned int len, u8 *out) > { > - put_unaligned_le32(~crc32_arm64_le_hw(crc, data, len), out); > + put_unaligned_le32(crc32_arm64_le_hw(crc, data, len), out); > return 0; > } > > @@ -199,6 +207,14 @@ static int crc32_cra_init(struct crypto_tfm *tfm) > { > struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); > > + mctx->key = 0; > + return 0; > +} > + > +static int crc32c_cra_init(struct crypto_tfm *tfm) > +{ > + struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); > + > mctx->key = ~0; > return 0; > } > @@ -229,7 +245,7 @@ static struct shash_alg crc32c_alg = { > .setkey = chksum_setkey, > .init = chksum_init, > .update = chksumc_update, > - .final = chksum_final, > + .final = chksumc_final, > .finup = chksumc_finup, > .digest = chksumc_digest, > .descsize = sizeof(struct chksum_desc_ctx), > @@ -241,7 +257,7 @@ static struct shash_alg crc32c_alg = { > .cra_alignmask = 0, > .cra_ctxsize = sizeof(struct chksum_ctx), > .cra_module = THIS_MODULE, > - .cra_init = crc32_cra_init, > + .cra_init = crc32c_cra_init, > } > }; > > -- > 1.9.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-crypto" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, May 04, 2015 at 11:00:16AM +0200, Ard Biesheuvel wrote: > The arm64 CRC32 (not CRC32c) implementation was not quite doing > the same thing as the generic one. Fix that. > > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Applied to crypto.
diff --git a/arch/arm64/crypto/crc32-arm64.c b/arch/arm64/crypto/crc32-arm64.c index 9499199924ae..6a37c3c6b11d 100644 --- a/arch/arm64/crypto/crc32-arm64.c +++ b/arch/arm64/crypto/crc32-arm64.c @@ -147,13 +147,21 @@ static int chksum_final(struct shash_desc *desc, u8 *out) { struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); + put_unaligned_le32(ctx->crc, out); + return 0; +} + +static int chksumc_final(struct shash_desc *desc, u8 *out) +{ + struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); + put_unaligned_le32(~ctx->crc, out); return 0; } static int __chksum_finup(u32 crc, const u8 *data, unsigned int len, u8 *out) { - put_unaligned_le32(~crc32_arm64_le_hw(crc, data, len), out); + put_unaligned_le32(crc32_arm64_le_hw(crc, data, len), out); return 0; } @@ -199,6 +207,14 @@ static int crc32_cra_init(struct crypto_tfm *tfm) { struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); + mctx->key = 0; + return 0; +} + +static int crc32c_cra_init(struct crypto_tfm *tfm) +{ + struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); + mctx->key = ~0; return 0; } @@ -229,7 +245,7 @@ static struct shash_alg crc32c_alg = { .setkey = chksum_setkey, .init = chksum_init, .update = chksumc_update, - .final = chksum_final, + .final = chksumc_final, .finup = chksumc_finup, .digest = chksumc_digest, .descsize = sizeof(struct chksum_desc_ctx), @@ -241,7 +257,7 @@ static struct shash_alg crc32c_alg = { .cra_alignmask = 0, .cra_ctxsize = sizeof(struct chksum_ctx), .cra_module = THIS_MODULE, - .cra_init = crc32_cra_init, + .cra_init = crc32c_cra_init, } };
The arm64 CRC32 (not CRC32c) implementation was not quite doing the same thing as the generic one. Fix that. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- arch/arm64/crypto/crc32-arm64.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-)