Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 18 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,28 @@ thiserror = "2.0.11"
hmac = { version = "0.12.1", optional = true }
sha2 = { version = "0.10.8", features = ["oid"], optional = true }
rsa = { version = "0.9.7", optional = true }
pkcs1 = "0.7.5"
p256 = { version = "0.13.2", features = ["pem"], optional = true }
pkcs1 = { version = "0.7.5", optional = true }
p256 = { version = "0.13.2", features = ["pem", "arithmetic", "jwk"], optional = true }
p384 = { version ="0.13.1", optional = true }
chrono = "0.4.39"
ecdsa = "0.16.9"
rand = { version = "0.8.0", optional = true }

[features]
default = ["hs256"]
pkcs1 = ["dep:pkcs1"]
rand = ["dep:rand"]

hmac = ["hs256", "hs384", "hs512"]
hs256 = ["dep:hmac", "dep:sha2"]
hs384 = ["dep:hmac", "dep:sha2"]
hs512 = ["dep:hmac", "dep:sha2"]

rsassa-pkcs1-v1_5 = ["rs256", "rs384", "rs512"]
rs256 = ["dep:rsa", "dep:sha2"]
rs384 = ["dep:rsa", "dep:sha2"]
rs512 = ["dep:rsa", "dep:sha2"]

ecdsa = ["es256", "es384"]
es256 = ["dep:p256"]
es384 = ["dep:p384"]
34 changes: 34 additions & 0 deletions scripts/generate-jwks/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# dependencies (bun install)
node_modules

# output
out
dist
*.tgz

# code coverage
coverage
*.lcov

# logs
logs
_.log
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json

# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local

# caches
.eslintcache
.cache
*.tsbuildinfo

# IntelliJ based IDEs
.idea

# Finder (MacOS) folder config
.DS_Store
15 changes: 15 additions & 0 deletions scripts/generate-jwks/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# generate-jwks

To install dependencies:

```bash
bun install
```

To run:

```bash
bun run index.ts
```

This project was created using `bun init` in bun v1.3.10. [Bun](https://bun.com) is a fast all-in-one JavaScript runtime.
26 changes: 26 additions & 0 deletions scripts/generate-jwks/bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

31 changes: 31 additions & 0 deletions scripts/generate-jwks/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
const es256 = await crypto.subtle.generateKey(
{
name: "ECDSA",
namedCurve: "P-256",
},
true,
["sign", "verify"],
);

const es256private = await crypto.subtle.exportKey("jwk", es256.privateKey);
const es256public = await crypto.subtle.exportKey("jwk", es256.publicKey);

await Bun.write("es256-public.jwks.json", JSON.stringify(es256public, null, 2));
await Bun.write("es256-private.jwks.json", JSON.stringify(es256private, null, 2));

const rs256 = await crypto.subtle.generateKey(
{
name: "RSASSA-PKCS1-v1_5",
modulusLength: 2048,
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: "SHA-256",
},
true,
["sign", "verify"],
);

const rs256private = await crypto.subtle.exportKey("jwk", rs256.privateKey);
const rs256public = await crypto.subtle.exportKey("jwk", rs256.publicKey);

await Bun.write("rs256-public.jwks.json", JSON.stringify(rs256public, null, 2));
await Bun.write("rs256-private.jwks.json", JSON.stringify(rs256private, null, 2));
12 changes: 12 additions & 0 deletions scripts/generate-jwks/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"name": "generate-jwks",
"module": "index.ts",
"type": "module",
"private": true,
"devDependencies": {
"@types/bun": "latest"
},
"peerDependencies": {
"typescript": "^5"
}
}
29 changes: 29 additions & 0 deletions scripts/generate-jwks/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"compilerOptions": {
// Environment setup & latest features
"lib": ["ESNext"],
"target": "ESNext",
"module": "Preserve",
"moduleDetection": "force",
"jsx": "react-jsx",
"allowJs": true,

// Bundler mode
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"verbatimModuleSyntax": true,
"noEmit": true,

// Best practices
"strict": true,
"skipLibCheck": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,

// Some stricter flags (disabled by default)
"noUnusedLocals": false,
"noUnusedParameters": false,
"noPropertyAccessFromIndexSignature": false
}
}
16 changes: 15 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,18 @@
mod modules;

pub use modules::token;
pub use modules::algorithm;
pub use modules::algorithm;

#[cfg(test)]
mod tests {
use crate::algorithm::es::ES256Private;
use crate::modules::key::JwkPrivateParams;

#[test]
fn test_es256() {
let key = ES256Private::rand();
let params = key.get_private_params();

dbg!(&params);
}
}
3 changes: 2 additions & 1 deletion src/modules.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pub mod token;
pub mod algorithm;
pub mod algorithm;
pub mod key;
2 changes: 2 additions & 0 deletions src/modules/algorithm/algorithms.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@


54 changes: 46 additions & 8 deletions src/modules/algorithm/mod.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,53 @@
mod models;
mod traits;
mod algorithms;

pub use models::none_algorithm::NoneAlgorithm;
pub use traits::jw_alg_verify::JwAlgVerify;
pub use traits::jw_alg_sign::JwAlgSign;
pub use traits::jw_alg::JwAlg;
pub use traits::partial_jw_alg::PartialJwAlg;

#[cfg(feature = "hs256")]
pub use models::hs256_algorithm::HS256Algorithm;
pub use models::none_algorithm::NoneAlgorithm;

#[cfg(feature = "rs256")]
pub use models::rs256_algorithm::RS256Algorithm;
pub use models::*;

#[cfg(feature = "es256")]
pub use models::es256_algorithm::ES256Algorithm;
// #[cfg(any(feature = "es256", feature = "es384"))]
// pub use models::es;

pub use traits::jw_alg::JwAlg;
// // HS
// #[cfg(any(feature = "hs256", feature = "hs384", feature = "hs512"))]
// use crate::algorithm::models::hs_algorithm::HSPrivate;
//
// #[cfg(feature = "hs256")]
// pub type HS256Private = HSPrivate<sha2::Sha256>;
//
// #[cfg(feature = "hs384")]
// pub type HS384Private = HSPrivate<sha2::Sha384>;
//
// #[cfg(feature = "hs512")]
// pub type HS512Private = HSPrivate<sha2::Sha512>;
//
// // RS
// #[cfg(any(feature = "rs256", feature = "rs384", feature = "rs512"))]
// use crate::algorithm::models::rs::rs_private::RSPrivate;
//
// #[cfg(any(feature = "rs256", feature = "rs384", feature = "rs512"))]
// use crate::algorithm::models::rs_algorithm::rs_public::RSPublic;
//
// #[cfg(feature = "rs256")]
// pub type RS256Private = RSPrivate<sha2::Sha256>;
//
// #[cfg(feature = "rs256")]
// pub type RS256Public = RSPublic<sha2::Sha256>;
//
// #[cfg(feature = "rs384")]
// pub type RS384Private = RSPrivate<sha2::Sha384>;
//
// #[cfg(feature = "rs384")]
// pub type RS384Public = RSPublic<sha2::Sha384>;
//
// #[cfg(feature = "rs512")]
// pub type RS512Private = RSPrivate<sha2::Sha512>;
//
// #[cfg(feature = "rs512")]
// pub type RS512Public = RSPublic<sha2::Sha512>;
13 changes: 7 additions & 6 deletions src/modules/algorithm/models.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
pub mod none_algorithm;

#[cfg(feature = "hs256")]
pub mod hs256_algorithm;
#[cfg(any(feature = "hs256", feature = "hs384", feature = "hs512"))]
pub mod hs;

#[cfg(feature = "rs256")]
pub mod rs256_algorithm;
#[cfg(any(feature = "rs256", feature = "rs384", feature = "rs512"))]
pub mod rs;

#[cfg(feature = "es256")]
pub mod es256_algorithm;
#[cfg(any(feature = "es256", feature = "es384"))]
pub mod es;
pub mod any;
Loading