Skip to content

Commit c2d0658

Browse files
authored
Merge pull request #11 from Cryptographic-API-Services/pre-release
#9 ED25519 Digital SIgnatures for SHA 512 and SHA 256
2 parents 5ea2ed1 + 3ae5071 commit c2d0658

15 files changed

+224
-51
lines changed

index.d.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@ export function encryptPlaintextRsa(publicKey: string, plaintext: Array<number>)
2929
export function decryptCiphertextRsa(privateKey: string, ciphertext: Array<number>): Array<number>
3030
export function signRsa(privateKey: string, hash: Array<number>): Array<number>
3131
export function verifyRsa(publicKey: string, hash: Array<number>, signature: Array<number>): boolean
32-
export function sha512RsaDigitalSignature(rsaKeySize: number, dataToSign: Array<number>): CasrsaDigitalSignatureResult
32+
export function sha512RsaDigitalSignature(rsaKeySize: number, dataToSign: Array<number>): RsaDigitalSignatureResult
3333
export function sha512RsaVerifyDigitalSignature(publicKey: string, dataToVerify: Array<number>, signature: Array<number>): boolean
34-
export function sha256RsaDigitalSignature(rsaKeySize: number, dataToSign: Array<number>): CasrsaDigitalSignatureResult
34+
export function sha256RsaDigitalSignature(rsaKeySize: number, dataToSign: Array<number>): RsaDigitalSignatureResult
3535
export function sha256RsaVerifyDigitalSignature(publicKey: string, dataToVerify: Array<number>, signature: Array<number>): boolean
36-
export function sha512Ed25519DigitalSignature(dataToSign: Array<number>): Casshaed25519DalekDigitalSignatureResult
36+
export function sha512Ed25519DigitalSignature(dataToSign: Array<number>): Shaed25519DalekDigitalSignatureResult
3737
export function sha512Ed25519DigitalSignatureVerify(publicKey: Array<number>, dataToVerify: Array<number>, signature: Array<number>): boolean
38+
export function sha256Ed25519DigitalSignature(dataToSign: Array<number>): Shaed25519DalekDigitalSignatureResult
39+
export function sha256Ed25519DigitalSignatureVerify(publicKey: Array<number>, dataToVerify: Array<number>, signature: Array<number>): boolean
3840
export type x25519SecretPublicKeyResult = X25519SecretPublicKeyResult
3941
export class X25519SecretPublicKeyResult {
4042
publicKey: Array<number>
@@ -52,15 +54,15 @@ export class RsaKeyPairResult {
5254
publicKey: string
5355
constructor(privateKey: string, publicKey: string)
5456
}
55-
export type CASRSADigitalSignatureResult = CasrsaDigitalSignatureResult
56-
export class CasrsaDigitalSignatureResult {
57+
export type RSADigitalSignatureResult = RsaDigitalSignatureResult
58+
export class RsaDigitalSignatureResult {
5759
publicKey: string
5860
privateKey: string
5961
signature: Array<number>
6062
constructor(publicKey: string, privateKey: string, signature: Array<number>)
6163
}
62-
export type CASSHAED25519DalekDigitalSignatureResult = Casshaed25519DalekDigitalSignatureResult
63-
export class Casshaed25519DalekDigitalSignatureResult {
64+
export type SHAED25519DalekDigitalSignatureResult = Shaed25519DalekDigitalSignatureResult
65+
export class Shaed25519DalekDigitalSignatureResult {
6466
publicKey: Array<number>
6567
signature: Array<number>
6668
constructor(publicKey: Array<number>, signature: Array<number>)

index.node

6.5 KB
Binary file not shown.

src-ts/digital-signature/digital-siganture-sha-512.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,29 @@
1-
import { CasrsaDigitalSignatureResult, sha512RsaDigitalSignature, sha512RsaVerifyDigitalSignature } from "../../index";
1+
import { RsaDigitalSignatureResult, SHAED25519DalekDigitalSignatureResult, sha512Ed25519DigitalSignature, sha512Ed25519DigitalSignatureVerify, sha512RsaDigitalSignature, sha512RsaVerifyDigitalSignature } from "../../index";
22
import { IDigitalSignature } from "./digital-signature-base";
33

44
export class DigitalSignatureSHA512Wrapper implements IDigitalSignature {
55

6-
createRsa(rsa_key_size: number, data_to_sign: number[]): CasrsaDigitalSignatureResult {
6+
createED25519(dataToSign: number[]): SHAED25519DalekDigitalSignatureResult {
7+
if (dataToSign?.length === 0) {
8+
throw new Error("Must provide allocated data to sign");
9+
}
10+
return sha512Ed25519DigitalSignature(dataToSign);
11+
}
12+
13+
verifyED25519(publicKey: number[], dataToVerify: number[], signature: number[]): boolean {
14+
if (!publicKey) {
15+
throw new Error("You must provide a public key for verify with ED25519");
16+
}
17+
if (dataToVerify?.length === 0) {
18+
throw new Error("Must provide allocated data to verify");
19+
}
20+
if (signature?.length === 0) {
21+
throw new Error("Must provide allocated signature to verify");
22+
}
23+
return sha512Ed25519DigitalSignatureVerify(publicKey, dataToVerify, signature);
24+
}
25+
26+
createRsa(rsa_key_size: number, data_to_sign: number[]): RsaDigitalSignatureResult {
727
if (rsa_key_size !== 1024 && rsa_key_size !== 2048 && rsa_key_size !== 4096) {
828
throw new Error("You need to provide an appropriate RSA key size.");
929
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import { CASRSADigitalSignatureResult } from "../../index";
1+
import { RSADigitalSignatureResult, SHAED25519DalekDigitalSignatureResult } from "../../index";
22

33
export interface IDigitalSignature {
4-
createRsa(rsa_key_size: number, data_to_sign: Array<number>): CASRSADigitalSignatureResult;
4+
createRsa(rsa_key_size: number, data_to_sign: Array<number>): RSADigitalSignatureResult;
55
verifyRSa(public_key: string, data_to_verify: Array<number>, signature: Array<number>): boolean;
6+
createED25519(dataToSign: Array<number>): SHAED25519DalekDigitalSignatureResult;
7+
verifyED25519(publicKey: Array<number>, dataToVerify: Array<number>, signature: Array<number>): boolean;
68
}

src-ts/digital-signature/digital-signaturte-sha-256.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,29 @@
1-
import { CasrsaDigitalSignatureResult, sha256RsaDigitalSignature, sha256RsaVerifyDigitalSignature } from "../../index";
1+
import { RsaDigitalSignatureResult, SHAED25519DalekDigitalSignatureResult, Shaed25519DalekDigitalSignatureResult, sha256Ed25519DigitalSignature, sha256Ed25519DigitalSignatureVerify, sha256RsaDigitalSignature, sha256RsaVerifyDigitalSignature, sha512Ed25519DigitalSignature } from "../../index";
22
import { IDigitalSignature } from "./digital-signature-base";
33

44
export class DigitalSignatureSHA256Wrapper implements IDigitalSignature {
5+
6+
createED25519(dataToSign: number[]): Shaed25519DalekDigitalSignatureResult {
7+
if (dataToSign?.length === 0) {
8+
throw new Error("Must provide allocated data to sign");
9+
}
10+
return sha256Ed25519DigitalSignature(dataToSign);
11+
}
12+
13+
verifyED25519(publicKey: number[], dataToVerify: number[], signature: number[]): boolean {
14+
if (!publicKey) {
15+
throw new Error("You must provide a public key for verify with ED25519");
16+
}
17+
if (dataToVerify?.length === 0) {
18+
throw new Error("Must provide allocated data to verify");
19+
}
20+
if (signature?.length === 0) {
21+
throw new Error("Must provide allocated signature to verify");
22+
}
23+
return sha256Ed25519DigitalSignatureVerify(publicKey, dataToVerify, signature);
24+
}
525

6-
createRsa(rsa_key_size: number, data_to_sign: number[]): CasrsaDigitalSignatureResult {
26+
createRsa(rsa_key_size: number, data_to_sign: number[]): RsaDigitalSignatureResult {
727
if (rsa_key_size !== 1024 && rsa_key_size !== 2048 && rsa_key_size !== 4096) {
828
throw new Error("You need to provide an appropriate RSA key size.");
929
}

src-ts/digital-signature/index.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
export enum DigitalSignatureType {
2-
SHA512 = 1,
3-
SHA256 = 2
4-
}
1+
import { DigitalSignatureType } from "./digital-signature-factory";
2+
import { DigitalSignatureFactory } from "./digital-signature-factory";
3+
import { DigitalSignatureSHA256Wrapper } from "./digital-signaturte-sha-256";
4+
import { DigitalSignatureSHA512Wrapper } from "./digital-siganture-sha-512";
5+
6+
export {
7+
DigitalSignatureFactory,
8+
DigitalSignatureSHA256Wrapper,
9+
DigitalSignatureSHA512Wrapper,
10+
DigitalSignatureType
11+
};

src-ts/global.d.ts

Lines changed: 0 additions & 2 deletions
This file was deleted.

src-ts/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ import {
1414
AESRSAHybridInitializer,
1515
HybridEncryptionWrapper,
1616
} from "./hybrid/index";
17+
import {
18+
DigitalSignatureFactory,
19+
DigitalSignatureSHA256Wrapper,
20+
DigitalSignatureSHA512Wrapper,
21+
DigitalSignatureType,
22+
} from "./digital-signature";
1723

1824
export {
1925
AesRsaHybridEncryptResult,
@@ -31,4 +37,8 @@ export {
3137
ScryptWrapper,
3238
SHAWrapper,
3339
X25519Wrapper,
40+
DigitalSignatureFactory,
41+
DigitalSignatureSHA256Wrapper,
42+
DigitalSignatureSHA512Wrapper,
43+
DigitalSignatureType,
3444
};
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
use napi_derive::napi;
22

33
#[napi(constructor)]
4-
pub struct CASRSADigitalSignatureResult {
4+
pub struct RSADigitalSignatureResult {
55
pub public_key: String,
66
pub private_key: String,
77
pub signature: Vec<u8>,
88
}
99

1010
#[napi(constructor)]
11-
pub struct CASSHAED25519DalekDigitalSignatureResult {
11+
pub struct SHAED25519DalekDigitalSignatureResult {
1212
pub public_key: Vec<u8>,
1313
pub signature: Vec<u8>
1414
}
1515

16-
pub trait CASRSADigitalSignature {
16+
pub trait RSADigitalSignature {
1717
fn digital_signature_rsa(
1818
rsa_key_size: u32,
1919
data_to_sign: Vec<u8>,
20-
) -> CASRSADigitalSignatureResult;
20+
) -> RSADigitalSignatureResult;
2121
fn verify_rsa(public_key: String, data_to_verify: Vec<u8>, signature: Vec<u8>) -> bool;
2222
}
2323

24-
pub trait CASED25519DigitalSignature {
25-
fn digital_signature_ed25519(data_to_sign: Vec<u8>) -> CASSHAED25519DalekDigitalSignatureResult;
24+
pub trait ED25519DigitalSignature {
25+
fn digital_signature_ed25519(data_to_sign: Vec<u8>) -> SHAED25519DalekDigitalSignatureResult;
2626
fn digital_signature_ed25519_verify(public_key: Vec<u8>, data_to_verify: Vec<u8>, signature: Vec<u8>) -> bool;
2727
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
use ed25519_dalek::{Keypair, Signature, Signer, Verifier};
2+
use napi_derive::napi;
3+
use sha3::{Digest, Sha3_256};
4+
5+
use super::cas_digital_signature_rsa::{
6+
ED25519DigitalSignature, SHAED25519DalekDigitalSignatureResult,
7+
};
8+
9+
pub struct SHA256ED25519DigitalSignature;
10+
11+
impl ED25519DigitalSignature for SHA256ED25519DigitalSignature {
12+
fn digital_signature_ed25519(data_to_sign: Vec<u8>) -> SHAED25519DalekDigitalSignatureResult {
13+
let mut hasher = Sha3_256::new();
14+
hasher.update(data_to_sign);
15+
let sha_hasher_result = hasher.finalize();
16+
let mut csprng = rand_07::rngs::OsRng {};
17+
let keypair = ed25519_dalek::Keypair::generate(&mut csprng);
18+
19+
let signature = keypair.sign(&sha_hasher_result);
20+
let signature_bytes = signature.to_bytes();
21+
let public_keypair_bytes = keypair.public.to_bytes();
22+
let result = SHAED25519DalekDigitalSignatureResult {
23+
public_key: public_keypair_bytes.to_vec(),
24+
signature: signature_bytes.to_vec(),
25+
};
26+
result
27+
}
28+
29+
fn digital_signature_ed25519_verify(public_key: Vec<u8>, data_to_verify: Vec<u8>, signature: Vec<u8>) -> bool {
30+
let mut hasher = Sha3_256::new();
31+
hasher.update(data_to_verify);
32+
let sha_hasher_result = hasher.finalize();
33+
34+
let public_key_parsed = ed25519_dalek::PublicKey::from_bytes(&public_key).unwrap();
35+
let signature_parsed = Signature::from_bytes(&signature).unwrap();
36+
return public_key_parsed
37+
.verify(&sha_hasher_result, &signature_parsed)
38+
.is_ok();
39+
}
40+
}
41+
42+
#[napi]
43+
pub fn sha_256_ed25519_digital_signature(data_to_sign: Vec<u8>) -> SHAED25519DalekDigitalSignatureResult {
44+
return SHA256ED25519DigitalSignature::digital_signature_ed25519(data_to_sign);
45+
}
46+
47+
#[napi]
48+
pub fn sha_256_ed25519_digital_signature_verify(public_key: Vec<u8>, data_to_verify: Vec<u8>, signature: Vec<u8>) -> bool {
49+
return SHA256ED25519DigitalSignature::digital_signature_ed25519_verify(public_key, data_to_verify, signature)
50+
}
51+
52+
#[test]
53+
fn sha_256_ed25519_test() {
54+
let key_size: u32 = 1024;
55+
let data_to_sign = b"GetTheseBytes".to_vec();
56+
let signature_result: SHAED25519DalekDigitalSignatureResult = SHA256ED25519DigitalSignature::digital_signature_ed25519(data_to_sign.clone());
57+
let is_verified: bool = SHA256ED25519DigitalSignature::digital_signature_ed25519_verify(signature_result.public_key, data_to_sign, signature_result.signature);
58+
assert_eq!(is_verified, true);
59+
}
60+
61+
#[test]
62+
fn sha_512_ed25519_test_fail() {
63+
let key_size: u32 = 1024;
64+
let data_to_sign = b"GetTheseBytes".to_vec();
65+
let signature_result: SHAED25519DalekDigitalSignatureResult = SHA256ED25519DigitalSignature::digital_signature_ed25519(data_to_sign.clone());
66+
let not_original_data = b"NOtTHoseBytes".to_vec();
67+
let is_verified: bool = SHA256ED25519DigitalSignature::digital_signature_ed25519_verify(signature_result.public_key, not_original_data, signature_result.signature);
68+
assert_eq!(is_verified, false);
69+
}

src/digital_signature/sha_256_rsa.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ use rsa::{
88
use sha3::{Digest, Sha3_256};
99

1010

11-
use super::cas_digital_signature_rsa::{CASRSADigitalSignatureResult, CASRSADigitalSignature};
11+
use super::cas_digital_signature_rsa::{RSADigitalSignatureResult, RSADigitalSignature};
1212

1313
pub struct SHA256RSADigitalSignature;
1414

15-
impl CASRSADigitalSignature for SHA256RSADigitalSignature {
15+
impl RSADigitalSignature for SHA256RSADigitalSignature {
1616
fn digital_signature_rsa(
1717
rsa_key_size: u32,
1818
data_to_sign: Vec<u8>,
19-
) -> CASRSADigitalSignatureResult {
19+
) -> RSADigitalSignatureResult {
2020
let mut hasher = Sha3_256::new();
2121
hasher.update(data_to_sign);
2222
let sha_hasher_result = hasher.finalize();
@@ -27,7 +27,7 @@ impl CASRSADigitalSignature for SHA256RSADigitalSignature {
2727
let mut signed_data = private_key
2828
.sign(Pkcs1v15Sign::new_unprefixed(), &sha_hasher_result)
2929
.unwrap();
30-
let result = CASRSADigitalSignatureResult {
30+
let result = RSADigitalSignatureResult {
3131
private_key: private_key
3232
.to_pkcs8_pem(rsa::pkcs8::LineEnding::LF)
3333
.unwrap()
@@ -63,7 +63,7 @@ impl CASRSADigitalSignature for SHA256RSADigitalSignature {
6363
pub fn sha_256_rsa_digital_signature(
6464
rsa_key_size: u32,
6565
data_to_sign: Vec<u8>,
66-
) -> CASRSADigitalSignatureResult {
66+
) -> RSADigitalSignatureResult {
6767
return SHA256RSADigitalSignature::digital_signature_rsa(rsa_key_size, data_to_sign);
6868
}
6969

@@ -80,7 +80,7 @@ pub fn sha_256_rsa_verify_digital_signature(
8080
fn sha_256_rsa_digital_signature_test() {
8181
let key_size: u32 = 1024;
8282
let data_to_sign = b"GetTheseBytes".to_vec();
83-
let signature_result: CASRSADigitalSignatureResult = SHA256RSADigitalSignature::digital_signature_rsa(key_size, data_to_sign.clone());
83+
let signature_result: RSADigitalSignatureResult = SHA256RSADigitalSignature::digital_signature_rsa(key_size, data_to_sign.clone());
8484
let is_verified: bool = SHA256RSADigitalSignature::verify_rsa(signature_result.public_key, data_to_sign, signature_result.signature);
8585
assert_eq!(is_verified, true);
8686
}
@@ -89,7 +89,7 @@ fn sha_256_rsa_digital_signature_test() {
8989
fn sha_256_rsa_digital_signature_fail_test() {
9090
let key_size: u32 = 1024;
9191
let data_to_sign = b"GetTheseBytes".to_vec();
92-
let signature_result: CASRSADigitalSignatureResult = SHA256RSADigitalSignature::digital_signature_rsa(key_size, data_to_sign.clone());
92+
let signature_result: RSADigitalSignatureResult = SHA256RSADigitalSignature::digital_signature_rsa(key_size, data_to_sign.clone());
9393
let new_data = b"NOtTheOriginalData".to_vec();
9494
let is_verified: bool = SHA256RSADigitalSignature::verify_rsa(signature_result.public_key, new_data, signature_result.signature);
9595
assert_eq!(is_verified, false);

src/digital_signature/sha_512_ed25519.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ use napi_derive::napi;
33
use sha3::{Digest, Sha3_512};
44

55
use super::cas_digital_signature_rsa::{
6-
CASED25519DigitalSignature, CASSHAED25519DalekDigitalSignatureResult,
6+
ED25519DigitalSignature, SHAED25519DalekDigitalSignatureResult,
77
};
88

99
pub struct SHA512ED25519DigitalSignature;
1010

11-
impl CASED25519DigitalSignature for SHA512ED25519DigitalSignature {
11+
impl ED25519DigitalSignature for SHA512ED25519DigitalSignature {
1212
fn digital_signature_ed25519(
1313
data_to_sign: Vec<u8>,
14-
) -> CASSHAED25519DalekDigitalSignatureResult {
14+
) -> SHAED25519DalekDigitalSignatureResult {
1515
let mut hasher = Sha3_512::new();
1616
hasher.update(data_to_sign);
1717
let sha_hasher_result = hasher.finalize();
@@ -21,7 +21,7 @@ impl CASED25519DigitalSignature for SHA512ED25519DigitalSignature {
2121
let signature = keypair.sign(&sha_hasher_result);
2222
let signature_bytes = signature.to_bytes();
2323
let public_keypair_bytes = keypair.public.to_bytes();
24-
let result = CASSHAED25519DalekDigitalSignatureResult {
24+
let result = SHAED25519DalekDigitalSignatureResult {
2525
public_key: public_keypair_bytes.to_vec(),
2626
signature: signature_bytes.to_vec(),
2727
};
@@ -46,7 +46,7 @@ impl CASED25519DigitalSignature for SHA512ED25519DigitalSignature {
4646
}
4747

4848
#[napi]
49-
pub fn sha_512_ed25519_digital_signature(data_to_sign: Vec<u8>) -> CASSHAED25519DalekDigitalSignatureResult {
49+
pub fn sha_512_ed25519_digital_signature(data_to_sign: Vec<u8>) -> SHAED25519DalekDigitalSignatureResult {
5050
return SHA512ED25519DigitalSignature::digital_signature_ed25519(data_to_sign);
5151
}
5252

@@ -59,7 +59,7 @@ pub fn sha_512_ed25519_digital_signature_verify(public_key: Vec<u8>, data_to_ver
5959
fn sha_512_ed25519_test() {
6060
let key_size: u32 = 1024;
6161
let data_to_sign = b"GetTheseBytes".to_vec();
62-
let signature_result: CASSHAED25519DalekDigitalSignatureResult = SHA512ED25519DigitalSignature::digital_signature_ed25519(data_to_sign.clone());
62+
let signature_result: SHAED25519DalekDigitalSignatureResult = SHA512ED25519DigitalSignature::digital_signature_ed25519(data_to_sign.clone());
6363
let is_verified: bool = SHA512ED25519DigitalSignature::digital_signature_ed25519_verify(signature_result.public_key, data_to_sign, signature_result.signature);
6464
assert_eq!(is_verified, true);
6565
}
@@ -68,7 +68,7 @@ fn sha_512_ed25519_test() {
6868
fn sha_512_ed25519_test_fail() {
6969
let key_size: u32 = 1024;
7070
let data_to_sign = b"GetTheseBytes".to_vec();
71-
let signature_result: CASSHAED25519DalekDigitalSignatureResult = SHA512ED25519DigitalSignature::digital_signature_ed25519(data_to_sign.clone());
71+
let signature_result: SHAED25519DalekDigitalSignatureResult = SHA512ED25519DigitalSignature::digital_signature_ed25519(data_to_sign.clone());
7272
let not_original_data = b"NOtTHoseBytes".to_vec();
7373
let is_verified: bool = SHA512ED25519DigitalSignature::digital_signature_ed25519_verify(signature_result.public_key, not_original_data, signature_result.signature);
7474
assert_eq!(is_verified, false);

0 commit comments

Comments
 (0)