Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  cipher.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Cryptographic API.
 *
 * Single-block cipher operations.
 *
 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
 * Copyright (c) 2005 Herbert Xu <herbert@gondor.apana.org.au>
 */


#include <crypto/algapi.h>
#include <crypto/internal/cipher.h>
#include <linux/kernel.h>
#include <linux/crypto.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/string.h>
#include "internal.h"

static int setkey_unaligned(struct crypto_cipher *tfm, const u8 *key,
       unsigned int keylen)
{
 struct cipher_alg *cia = crypto_cipher_alg(tfm);
 unsigned long alignmask = crypto_cipher_alignmask(tfm);
 int ret;
 u8 *buffer, *alignbuffer;
 unsigned long absize;

 absize = keylen + alignmask;
 buffer = kmalloc(absize, GFP_ATOMIC);
 if (!buffer)
  return -ENOMEM;

 alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1);
 memcpy(alignbuffer, key, keylen);
 ret = cia->cia_setkey(crypto_cipher_tfm(tfm), alignbuffer, keylen);
 kfree_sensitive(buffer);
 return ret;

}

int crypto_cipher_setkey(struct crypto_cipher *tfm,
    const u8 *key, unsigned int keylen)
{
 struct cipher_alg *cia = crypto_cipher_alg(tfm);
 unsigned long alignmask = crypto_cipher_alignmask(tfm);

 if (keylen < cia->cia_min_keysize || keylen > cia->cia_max_keysize)
  return -EINVAL;

 if ((unsigned long)key & alignmask)
  return setkey_unaligned(tfm, key, keylen);

 return cia->cia_setkey(crypto_cipher_tfm(tfm), key, keylen);
}
EXPORT_SYMBOL_NS_GPL(crypto_cipher_setkey, "CRYPTO_INTERNAL");

static inline void cipher_crypt_one(struct crypto_cipher *tfm,
        u8 *dst, const u8 *src, bool enc)
{
 unsigned long alignmask = crypto_cipher_alignmask(tfm);
 struct cipher_alg *cia = crypto_cipher_alg(tfm);
 void (*fn)(struct crypto_tfm *, u8 *, const u8 *) =
  enc ? cia->cia_encrypt : cia->cia_decrypt;

 if (unlikely(((unsigned long)dst | (unsigned long)src) & alignmask)) {
  unsigned int bs = crypto_cipher_blocksize(tfm);
  u8 buffer[MAX_CIPHER_BLOCKSIZE + MAX_CIPHER_ALIGNMASK];
  u8 *tmp = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1);

  memcpy(tmp, src, bs);
  fn(crypto_cipher_tfm(tfm), tmp, tmp);
  memcpy(dst, tmp, bs);
 } else {
  fn(crypto_cipher_tfm(tfm), dst, src);
 }
}

void crypto_cipher_encrypt_one(struct crypto_cipher *tfm,
          u8 *dst, const u8 *src)
{
 cipher_crypt_one(tfm, dst, src, true);
}
EXPORT_SYMBOL_NS_GPL(crypto_cipher_encrypt_one, "CRYPTO_INTERNAL");

void crypto_cipher_decrypt_one(struct crypto_cipher *tfm,
          u8 *dst, const u8 *src)
{
 cipher_crypt_one(tfm, dst, src, false);
}
EXPORT_SYMBOL_NS_GPL(crypto_cipher_decrypt_one, "CRYPTO_INTERNAL");

struct crypto_cipher *crypto_clone_cipher(struct crypto_cipher *cipher)
{
 struct crypto_tfm *tfm = crypto_cipher_tfm(cipher);
 struct crypto_alg *alg = tfm->__crt_alg;
 struct crypto_cipher *ncipher;
 struct crypto_tfm *ntfm;

 if (alg->cra_init)
  return ERR_PTR(-ENOSYS);

 if (unlikely(!crypto_mod_get(alg)))
  return ERR_PTR(-ESTALE);

 ntfm = __crypto_alloc_tfmgfp(alg, CRYPTO_ALG_TYPE_CIPHER,
         CRYPTO_ALG_TYPE_MASK, GFP_ATOMIC);
 if (IS_ERR(ntfm)) {
  crypto_mod_put(alg);
  return ERR_CAST(ntfm);
 }

 ntfm->crt_flags = tfm->crt_flags;

 ncipher = __crypto_cipher_cast(ntfm);

 return ncipher;
}
EXPORT_SYMBOL_GPL(crypto_clone_cipher);

Messung V0.5
C=95 H=95 G=94

¤ Dauer der Verarbeitung: 0.13 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge