view dcrypt/crypto/Crypto.d @ 10:cd376996cdb3

Renamed SymmetricCipher back to Cipher (we don't support any other kind atm, I'll deal with it when we do.). Added BlockCipherWrapper for the encryption of arbitrary streams with or without padding. Removed hashByName, and replaced it with createHash. Re-did the high-level API, and filled out Crypto. Added cipher creation via createCipher. Added dsk to the CONTRIBUTORS file for helping with the design of the high-level API.
author Thomas Dixon <reikon@reikon.us>
date Wed, 20 Aug 2008 20:08:07 -0400
parents 29b910949588
children 02970e63257d
line wrap: on
line source

/**
 * This file is part of the dcrypt project.
 *
 * Copyright: Copyright (C) dcrypt contributors 2008. All rights reserved.
 * License:   MIT
 * Authors:   Thomas Dixon
 */

module dcrypt.crypto.Crypto;

// Hash functions
public import dcrypt.crypto.Hash;
import dcrypt.crypto.hashes.MD5;
import dcrypt.crypto.hashes.SHA1;
import dcrypt.crypto.hashes.SHA224;
import dcrypt.crypto.hashes.SHA256;
import dcrypt.crypto.hashes.SHA384;
import dcrypt.crypto.hashes.SHA512;

// Params
public import dcrypt.crypto.params.SymmetricKey;
public import dcrypt.crypto.params.ParametersWithIV;


// Ciphers
public import dcrypt.crypto.Cipher;
public import dcrypt.crypto.BlockCipher;
public import dcrypt.crypto.StreamCipher;
public import dcrypt.crypto.BlockCipherWrapper;
import dcrypt.crypto.ciphers.Blowfish;
import dcrypt.crypto.ciphers.RC6;
import dcrypt.crypto.ciphers.TEA;
import dcrypt.crypto.ciphers.XTEA;
import dcrypt.crypto.ciphers.RC4;
import dcrypt.crypto.ciphers.AES;

// Block modes
import dcrypt.crypto.modes.CBC;
import dcrypt.crypto.modes.CTR;

// Block padding
public import dcrypt.crypto.BlockCipherPadding;
import dcrypt.crypto.padding.NullByte;
import dcrypt.crypto.padding.X923;
import dcrypt.crypto.padding.PKCS7;
import dcrypt.crypto.padding.RFC1321;

enum Hashes {
    MD5=0,
    SHA1,
    SHA224,
    SHA256,
    SHA384,
    SHA512
}

enum Ciphers {
    // Block ciphers
    Blowfish=0,
    AES,
    RC6,
    TEA,
    XTEA,
    
    // Stream ciphers
    RC4
}

enum Modes {
    ECB=-1,
    CTR,
    CBC
}

enum Padding {
    None=-1,
    NullByte, // lol
    X923,
    PKCS7,
    RFC1321
}

struct Crypto {
    static Hash createHash(uint hash) {
        switch (hash) {
            case Hashes.MD5:
                return new MD5;
            case Hashes.SHA1:
                return new SHA1;
            case Hashes.SHA224:
                return new SHA224;
            case Hashes.SHA256:
                return new SHA256;
            case Hashes.SHA384:
                return new SHA384;
            case Hashes.SHA512:
                return new SHA512;
            default:
                throw new InvalidParameterError("Unknown hash function passed to createHash()");
        }
    }
    
    static Cipher createCipher(uint cipher, uint mode=Modes.ECB, uint padding=Padding.None) {
        BlockCipher c = null,
                    m = null;
        BlockCipherPadding p = null;
        switch (cipher) {
            case Ciphers.Blowfish:
                c = new Blowfish;
                break;
            case Ciphers.AES:
                c = new AES;
                break;
            case Ciphers.RC6:
                c = new RC6;
                break;
            case Ciphers.TEA:
                c = new TEA;
                break;
            case Ciphers.XTEA:
                c = new XTEA;
                break;
            case Ciphers.RC4:
                return new RC4; // Note the return
            default:
                throw new InvalidParameterError("Unknown cipher passed to createCipher()");
        }
        
        switch (mode) {
            case Modes.ECB:
                break;
            case Modes.CTR:
                m = new CTR(c);
                break;
            case Modes.CBC:
                m = new CBC(c);
                break;
            default:
                throw new InvalidParameterError("Unknown mode passed to createCipher()");
        }
        
        switch (padding) {
            case Padding.None:
                break;
            case Padding.NullByte:
                p = new NullByte;
                break;
            case Padding.X923:
                p = new X923;
                break;
            case Padding.PKCS7:
                p = new PKCS7;
                break;
            case Padding.RFC1321:
                p = new RFC1321;
                break;
            default:
                throw new InvalidParameterError("Unknown padding passed to createCipher()");
        }
        
        return new BlockCipherWrapper(((m is null) ? c : m), p);
    }
}