OpenCores
URL https://opencores.org/ocsvn/rc4-prbs/rc4-prbs/trunk

Subversion Repositories rc4-prbs

[/] [rc4-prbs/] [trunk/] [rc4.v] - Diff between revs 8 and 10

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 8 Rev 10
/*
/*
        RC4 PRGA module implementation
        RC4 PRGA module implementation
        Copyright 2012 - Alfredo Ortega
        Copyright 2012 - Alfredo Ortega
        aortega@alu.itba.edu.ar
        aortega@alu.itba.edu.ar
 
 
 This library is free software: you can redistribute it and/or
 This library is free software: you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation, either
 License as published by the Free Software Foundation, either
 version 3 of the License, or (at your option) any later version.
 version 3 of the License, or (at your option) any later version.
 
 
 This library is distributed in the hope that it will be useful,
 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.
 Lesser General Public License for more details.
 
 
 You should have received a copy of the GNU Lesser General Public
 You should have received a copy of the GNU Lesser General Public
 License along with this library.  If not, see <http://www.gnu.org/licenses/>.
 License along with this library.  If not, see <http://www.gnu.org/licenses/>.
*/
*/
 
 
 
 
`include "rc4.inc"
`include "/home/alfred/docto/FPGADesign/rc4-prbs/trunk/rc4.inc"
 
 
module rc4(clk,rst,output_ready,password_input,K);
module rc4(clk,rst,output_ready,password_input,K);
 
 
input clk; // Clock
input clk; // Clock
input rst; // Reset
input rst; // Reset
input [7:0] password_input; // Password input
input [7:0] password_input; // Password input
output output_ready; // Output valid
output output_ready; // Output valid
output [7:0] K; // Output port
output [7:0] K; // Output port
 
 
 
 
wire clk, rst; // clock, reset
wire clk, rst; // clock, reset
reg output_ready;
reg output_ready;
wire [7:0] password_input;
wire [7:0] password_input;
 
 
 
 
/* RC4 PRGA */
/* RC4 PRGA */
 
 
// Key
// Key
reg [7:0] key[0:`KEY_SIZE-1];
reg [7:0] key[0:`KEY_SIZE-1];
// S array
// S array
reg [7:0] S[0:256];
reg [7:0] S[0:256];
 
reg [9:0] discardCount;
 
 
// Key-scheduling state
// Key-scheduling state
`define KSS_KEYREAD 4'h0
`define KSS_KEYREAD 4'h0
`define KSS_KEYSCHED1 4'h1
`define KSS_KEYSCHED1 4'h1
`define KSS_KEYSCHED2 4'h2
`define KSS_KEYSCHED2 4'h2
`define KSS_KEYSCHED3 4'h3
`define KSS_KEYSCHED3 4'h3
`define KSS_CRYPTO       4'h4
`define KSS_CRYPTO       4'h4
`define KSS_CRYPTO2      4'h5
`define KSS_CRYPTO2      4'h5
// Variable names from http://en.wikipedia.org/wiki/RC4
// Variable names from http://en.wikipedia.org/wiki/RC4
reg [3:0] KSState;
reg [3:0] KSState;
reg [7:0] i; // Counter
reg [7:0] i; // Counter
reg [7:0] j;
reg [7:0] j;
reg [7:0] K;
reg [7:0] K;
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
        begin
        begin
        if (rst)
        if (rst)
                begin
                begin
                i <= 8'h0;
                i <= 8'h0;
                KSState <= `KSS_KEYREAD;
                KSState <= `KSS_KEYREAD;
                output_ready <= 0;
                output_ready <= 0;
                j <= 0;
                j <= 0;
                end
                end
        else
        else
        case (KSState)
        case (KSState)
                `KSS_KEYREAD:   begin // KSS_KEYREAD state: Read key from input
                `KSS_KEYREAD:   begin // KSS_KEYREAD state: Read key from input
                                if (i == `KEY_SIZE)
                                if (i == `KEY_SIZE)
                                        begin
                                        begin
                                        KSState <= `KSS_KEYSCHED1;
                                        KSState <= `KSS_KEYSCHED1;
                                        i<=8'h00;
                                        i<=8'h00;
                                        end
                                        end
                                else    begin
                                else    begin
                                        i <= i+1;
                                        i <= i+1;
                                        key[i] <= password_input;
                                        key[i] <= password_input;
                                        $display ("key[%d] = %08X",i,password_input);
                                        $display ("key[%d] = %08X",i,password_input);
                                        end
                                        end
                                end
                                end
/*
/*
for i from 0 to 255
for i from 0 to 255
    S[i] := i
    S[i] := i
endfor
endfor
*/
*/
                `KSS_KEYSCHED1: begin // KSS_KEYSCHED1: Increment counter for S initialization
                `KSS_KEYSCHED1: begin // KSS_KEYSCHED1: Increment counter for S initialization
                                S[i] <= i;
                                S[i] <= i;
                                if (i == 8'hFF)
                                if (i == 8'hFF)
                                        begin
                                        begin
                                        KSState <= `KSS_KEYSCHED2;
                                        KSState <= `KSS_KEYSCHED2;
                                        i <= 8'h00;
                                        i <= 8'h00;
                                        end
                                        end
                                else    i <= i +1;
                                else    i <= i +1;
                                end
                                end
/*
/*
j := 0
j := 0
for i from 0 to 255
for i from 0 to 255
    j := (j + S[i] + key[i mod keylength]) mod 256
    j := (j + S[i] + key[i mod keylength]) mod 256
    swap values of S[i] and S[j]
    swap values of S[i] and S[j]
endfor
endfor
*/
*/
                `KSS_KEYSCHED2: begin // KSS_KEYSCHED2: Initialize S array
                `KSS_KEYSCHED2: begin // KSS_KEYSCHED2: Initialize S array
                                j <= (j + S[i] + key[i % `KEY_SIZE]);
                                j <= (j + S[i] + key[i % `KEY_SIZE]);
                                KSState <= `KSS_KEYSCHED3;
                                KSState <= `KSS_KEYSCHED3;
                                end
                                end
                `KSS_KEYSCHED3: begin // KSS_KEYSCHED3: S array permutation
                `KSS_KEYSCHED3: begin // KSS_KEYSCHED3: S array permutation
                                S[i]<=S[j];
                                S[i]<=S[j];
                                S[j]<=S[i];
                                S[j]<=S[i];
                                if (i == 8'hFF)
                                if (i == 8'hFF)
                                        begin
                                        begin
                                        KSState <= `KSS_CRYPTO;
                                        KSState <= `KSS_CRYPTO;
                                        i <= 8'h01;
                                        i <= 8'h01;
                                        j <= 8'h00;
                                        j <= 8'h00;
 
                                        discardCount <= 10'h0;
                                        end
                                        end
                                else    begin
                                else    begin
                                        i <= i + 1;
                                        i <= i + 1;
                                        KSState <= `KSS_KEYSCHED2;
                                        KSState <= `KSS_KEYSCHED2;
                                        end
                                        end
                                end
                                end
/*
/*
i := 0
i := 0
j := 0
j := 0
while GeneratingOutput:
while GeneratingOutput:
    i := (i + 1) mod 256
    i := (i + 1) mod 256
    j := (j + S[i]) mod 256
    j := (j + S[i]) mod 256
    swap values of S[i] and S[j]
    swap values of S[i] and S[j]
    K := S[(S[i] + S[j]) mod 256]
    K := S[(S[i] + S[j]) mod 256]
    output K
    output K
endwhile
endwhile
*/
*/
                `KSS_CRYPTO: begin      //KSS_CRYPTO: Output crypto stream
                `KSS_CRYPTO: begin      //KSS_CRYPTO: Output crypto stream
                                j <= (j + S[i]);
                                j <= (j + S[i]);
                                KSState <= `KSS_CRYPTO2;
                                KSState <= `KSS_CRYPTO2;
                                output_ready <= 0; // K not valid yet
                                output_ready <= 0; // K not valid yet
                                end
                                end
                `KSS_CRYPTO2: begin
                `KSS_CRYPTO2: begin
                                S[i] <= S[j];
                                S[i] <= S[j];
                                S[j] <= S[i]; // We can do this because of verilog.
                                S[j] <= S[i]; // We can do this because of verilog.
                                K <= S[ S[i]+S[j] ];
                                K <= S[ S[i]+S[j] ];
                                output_ready <= 1; // Valid K at output
                                if (discardCount<1000)
 
                                        discardCount<=discardCount+1;
 
                                else    output_ready <= 1; // Valid K at output
                                i <= i+1;
                                i <= i+1;
                                KSState <= `KSS_CRYPTO;
                                KSState <= `KSS_CRYPTO;
                                end
                                end
                default:        begin
                default:        begin
                                end
                                end
        endcase
        endcase
        end
        end
 
 
endmodule
endmodule
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.