Phân tích mã nguồn.

Một phần của tài liệu Nghiên cứu một số công nghệ xác thực (Trang 74)

2. Đặ tm = se mod n.

3.1.4.Phân tích mã nguồn.

Các định nghĩa hằng.

Hằng số Mô tả

MIN_RSA_MODULUS_BITS 1024, số bít nhỏ nhất của modulus.

MAX_RSA_MODULUS_BITS 2048, số bít lớn nhất của modulus.

MAX_RSA_MODULUS_LEN ((MAX_RSA_MODULUS_BITS + 7) / 8), số byte lớn nhất của modulus.

MAX_RSA_PRIME_BITS ((MAX_RSA_MODULUS_BITS + 1) / 2), số bít lớn

nhất của số nguyên tố.

MAX_RSA_PRIME_LEN ((MAX_RSA_PRIME_BITS + 7) / 8), số byte lớn nhất của số nguyên tố.

DA_SHA1 0x01, giá trị cờ nhận biết thuật toán băm SHA1.

SHA1_LEN 20, số byte của giá trị hàm băm SHA1.

MIN_DIGEST_LEN 20, số byte nhỏ nhất của giá trị hàm băm.

MAX_DIGEST_LEN 32, số byte lớn nhất của giá trị hàm băm.

MGF_1 0x11, cờ sử dụng hàm sinh mặt nạ MGF1.

MAX_MGF_INPUT_LEN MAX_RSA_MODULUS_LEN,

số byte đầu vào lớn nhất của hàm MGF1.

MAX_MGF_OUTPUT_LEN MAX_RSA_MODULUS_LEN,

số byte đầu ra lớn nhất của hàm MGF1.

EMSA_PSS 0x31, cờ nhận biết phương pháp mã hoá trong thủ tục ký.

MAX_PSS_SALT_LEN MAX_DIGEST_LEN (=32),

số byte lớn nhất của giá trị “salt” trong RSA-PSS.

MAX_SIGNATURE_LEN MAX_RSA_MODULUS_LEN,

số byte lớn nhất của chữ ký.

Các định nghĩa mã lỗi.

Mã lỗi Mô tả

RE_RSA_MESSAGE_LEN 0x0500, bản rõ dài hơn độ dài modulus.

RE_RSA_CIPHERTEXT_LEN 0x0501, bản mã dài hơn độ dài modulus.

RE_MODULUS_LEN 0x0502, các tham số khoá RSA lớn hơn modulus.

RE_PSS_LEN 0x0520, giá trị băm và salt quá lớn.

RE_PSS_DECODING 0x0521, lỗi trong hàm pssDecode.

RE_PSS_SALT_LEN 0x0522, số byte của giá trị “salt” > 32.

RE_DIGEST_ALGORITHM 0x0580, không đúng điều kiện thuật toán băm SHA1. (adsbygoogle = window.adsbygoogle || []).push({});

RE_DIGEST_LEN 0x0581, sai kích thước đối với thuật toán SHA1.

RE_MGF 0x0582, không đúng thuật toán MGF1.

RE_MGF_LEN 0x0583, độ dài đầu vào hoặc đầu ra của hàm MGF1

không đúng.

RE_NEED_RANDOM 0x05d0, bộ sinh giả ngẫu nhiên chưa được khởi tạo.

Các định nghĩa kiểu dữ liệu.

Kiểu dữ liệu Mô tả

POINTER Con trỏ tham chiếu tới dữ liệu kiểu unsigned char.

UINT2 Kiểu unsigned short int.

UINT4 Kiểu unsigned long int.

Các kiểu cấu trúc dữ liệu

STT Cấu trúc dữ liệu Mô tả

1 R_RANDOM_STRUCT Sử dụng cho việc sinh các giá trị ngẫu nhiên.

2 R_RSA_PUBLIC_KEY Lưu trữ các tham số của khoá công khai.

3 R_RSA_PRIVATE_KEY Lưu trữ các tham số của khoá bí mật

4 R_RSA_PROTO_KEY Lưu trữ các tham số của khoá công khai ngầm định.

Mô tả chức năng một số hàm:

Tên hàm Chức năng

void R_memset(POINTER output, int value, unsigned int len)

Thiết lập len phần tử của biến con trỏ output, nhận cùng giá trị là value.

int R_GetRandomBytesNeeded

(unsigned int *bytesNeeded,

R_RANDOM_STRUCT *randomStruct)

Gán con trỏ bytesNeeded giá trị của thành phần bytesNeeded trong biến randomStruct. Kiểm tra quá trình sinh số ngẫu nhiên.

void SHA1Init( SHA1_CTX *context) Gán các giá trị hằng số ban đầu cho các thành phần trong biến context.

void R_memcpy( POINTER output,

POINTER input, unsigned int len)

Sao chép len phần tử của biến con trỏ input cho output.

static void Decode

(UINT4 *output, unsigned char *input, unsigned int len) (adsbygoogle = window.adsbygoogle || []).push({});

Chuyển đổi xâu đầu vào input có các phần tử kiểu unsigned char (8 bít) thành xâu đầu ra có các phần tử kiểu UINT4 (32 bít). Độ dài của input là bội của 4.

Đây là hàm chuyển đổi cơ sở OS2IP.

int R_GetDigestLen

(unsigned int *digestLen, int digestAlgorithm)

Xác định độ dài đầu ra của thuật toán HASH, được xác định bởi digestAlgorithm. Hàm nhận giá trị RE_DIGEST_ALGORITHM trong trường hợp hàm HASH không là SHA1 hoặc độ dài đầu ra của hàm HASH vượt ra ngoài khoản hỗ trợ (MIN_DIGEST_LEN, MAX_DIGEST_LEN).

Ng-îc l¹i hµm nhËn gi¸ trÞ 0.

static void Encode

(unsigned char *output,

UINT4 *input, unsigned int len)

Có chức năng ngược với hàm Decode, chuyển đổi xâu đầu vào có kiểu UINT4 thành xâu đầu ra có kiểu xâu unsigned char. Độ dài xâu đầu ra output là bội số 4.

Đây là hàm chuyển đổi cơ sở I2OSP.

( R_RANDOM_STRUCT *randomStruct) phần của biến randomStruct.

int R_DigestInit

(R_DIGEST_CTX *context, int digestAlgorithm)

Khởi tạo biến cấu trúc context với thuật toán băm digestAlgorithm. Hàm nhận giá trị 0 nếu thuật toán HASH là SHA1, ngược lại hàm nhận giá trị RE_DIGEST_ALGORITHM.

int RSAPrivateBlock

(unsigned char *output, unsigned int *outputLen, unsigned char *input, unsigned int inputLen,

R_RSA_PRIVATE_KEY *privateKey)

Thực hiện giải mã bản mã input theo lược đồ RSA, sử dụng khoá bí mật privateKey.

Bản rõ được lưu trong output. Đây là thuật toán RSADP.

Hàm nhận giá trị 0 nếu không có lỗi.

int RSAPublicBlock

(unsigned char *output, unsigned int *outputLen, unsigned char *input, unsigned int inputLen,

R_RSA_PUBLIC_KEY *publicKey)

Mã hoá bản rõ input theo lược đồ RSA, sử dụng khoá công khai publicKey. Kết quả trả về bản mã output. Đây là thuật toán RSAEP. Hàm nhận giá trị 0 nếu không có lỗi.

void R_RandomFinal

(R_RANDOM_STRUCT *randomStruct)

Gán giá trị 0 cho biến randomStruct.

int R_DigestFinal (R_DIGEST_CTX *context, unsigned char *digest, unsigned int digestLen)

Lấy giá trị hash cuối cùng trong biến context, đặt vào digest với độ dài là digestLen bytes. (adsbygoogle = window.adsbygoogle || []).push({});

Ngược lại hàm nhận giá trị RE_DIGEST_LEN

hoặc RE_DIGEST_ALGORITHM.

int R_DigestUpdate (R_DIGEST_CTX *context, unsigned char *partIn, unsigned int partInLen)

Tính giá trị hash của thông điệp partIn với độ dài partInLen bytes, chỉ tính giá trị hash của các khối chẵn 64 bytes và sau mỗi lần tính, giá trị hash được cập nhật vào context. Hàm nhận giá trị 0 nếu thành công.

(R_RANDOM_STRUCT *randomStruct, unsigned char *block, unsigned int blockLen)

lớn blockLen bytes cho biến randomStruct, sử dụng cho việc sinh các giá trị ngẫu nhiên về sau. Hàm nhận giá trị 0 nếu thành công

int R_GenerateBytes (unsigned char *block, unsigned int blockLen,

R_RANDOM_STRUCT *randomStruct )

Sinh blockLen bytes ngẫu nhiên từ mầm sinh randomStruct, kết quả đặt trong block. Hàm nhận giá trị 0 nếu thành công.

int R_DigestBlock

(unsigned char *digest, unsigned int digestLen, unsigned char *block, unsigned int blockLen, int digestAlgorithm)

Tính giá trị hash của chuỗi block với độ dài blockLen bytes, với thuật toán

digestAlgorithm và giá trị hash đầu ra là digestLen bytes. Hàm nhận giá trị 0 nếu thành công.

int MGF1(unsigned char *output, unsigned int outputLen,

unsigned char *input, unsigned int inputLen, int digestAlgorithm)

Hàm MGF (Mask Generation Function), sinh outputLen bytes mask Từ mầm sinh input và đặt kết quả trong output. Hàm nhận giá trị 0 nếu thành công.

int R_GenerateMask (unsigned char *output, unsigned int outputLen, unsigned char *input, unsigned int inputLen, int mgfAlgorithm, int digestAlgorithm)

Giao diện thực hiện các hàm MGF để sinh outputLen bytes mask từ mầm sinh input theo từng thuật toán mgfAlgorithm với input và output nhỏ hơn 216 octets, ở đây chỉ sử dụng hàm MGF1. Hàm nhận giá trị 0 nếu thành công.

static void InitRandomStruct

(R_RANDOM_STRUCT *randomStruct)

Khởi tạo cấu trúc sinh ngẫu nhiên với mầm sinh chỉ chứa các giá trị 0.

static int pssEncode (

unsigned char *output, unsigned int outputLen,

unsigned char *messageHash, unsigned int digestLen, unsigned int bitsToRemove,

Thực hiện chức năng mã hoá, đây chính là hàm EMSA-PSS-ENCODE trong bản

PKCS#1 version 2.1. Hàm nhận giá trị 0 nếu thành công.

R_RANDOM_STRUCT *randomStruct, unsigned int saltLen,

int mgfAlgorithm, int digestAlgorithm )

static int pssDecode

(unsigned char *input, unsigned int inputLen, (adsbygoogle = window.adsbygoogle || []).push({});

unsigned char *messageHash, unsigned int digestLen, unsigned int bitsRemoved,

unsigned int saltLen, int mgfAlgorithm, int digestAlgorithm)

Thực hiện chức năng giải mã, đây chính là hàm EMSA-PSS-DECODE trong bản

PKCS#1 version 2.1. Hàm nhận giá trị 0 nếu thành công.

int RSA_PSS_Sign (unsigned char *output, unsigned int *outputLen, unsigned char *messageHash, unsigned int messageHashLen,

R_RSA_PRIVATE_KEY *privateKey,

R_RANDOM_STRUCT *randomStruct, unsigned int saltLen,

int mgfAlgorithm, int digestAlgorithm)

Thực hiện ký lên chuỗi messageHash, đây là hàm RSASSA-PSS-SIGN trong

PKCS#1 version 2.1. Hàm nhận giá trị 0 nếu thành công.

int RSA_PSS_Verify

( unsigned char *input, unsigned int inputLen,

unsigned char *messageHash, unsigned int messageHashLen,

R_RSA_PUBLIC_KEY *publicKey, unsigned int saltLen,

int mgfAlgorithm, int digestAlgorithm)

Kiểm tra chữ ký đối với messageHash,

đây là hàm RSASSA-PSS-VERIFY trong PKCS#1 version 2.1. Hàm nhận giá trị 0 nếu thành công.

Một phần của tài liệu Nghiên cứu một số công nghệ xác thực (Trang 74)