diff --git a/Cargo.lock b/Cargo.lock index b09bbea..639fcb1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -403,9 +403,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ "darling_core", "darling_macro", @@ -413,11 +413,10 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" dependencies = [ - "fnv", "ident_case", "proc-macro2", "quote", @@ -427,9 +426,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", @@ -597,9 +596,9 @@ dependencies = [ [[package]] name = "ext-php-rs" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feb2e956267898c7b81d0dab7d17cd7f6ca17fd5cf5ba25866f4052cf86b0935" +checksum = "babf1838a191c62b88c73351100b55d2b3ffee4d3a91b4101190574352c6c426" dependencies = [ "anyhow", "bindgen", @@ -617,9 +616,9 @@ dependencies = [ [[package]] name = "ext-php-rs-derive" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "231921568cc6937b7f4d22a5feaf7f28b263288297835cf4ba76671989545b67" +checksum = "6ad2ea3a19621a895ee396903a0e493a7128cde28306d922e4da55805b0dc3f9" dependencies = [ "convert_case", "darling", @@ -691,9 +690,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -900,9 +899,9 @@ checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "lzma-rust2" -version = "0.13.0" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c60a23ffb90d527e23192f1246b14746e2f7f071cb84476dd879071696c18a4a" +checksum = "17f7337d278fec032975dc884152491580dd23750ee957047856735fe0e61ede" dependencies = [ "crc", "sha2 0.10.9", @@ -1864,9 +1863,9 @@ dependencies = [ [[package]] name = "zip" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2a05c7c36fde6c09b08576c9f7fb4cda705990f73b58fe011abf7dfb24168b" +checksum = "bdd8a47718a4ee5fe78e07667cd36f3de80e7c2bfe727c7074245ffc7303c037" dependencies = [ "aes", "arbitrary", @@ -1875,6 +1874,7 @@ dependencies = [ "crc32fast", "deflate64", "flate2", + "generic-array", "getrandom 0.3.4", "hmac", "indexmap", diff --git a/Cargo.toml b/Cargo.toml index b39c4c7..e8206ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ description = "PHP wrapper for Biscuit authorization tokens" authors = ["Pierre Tondereau "] [dependencies] -ext-php-rs = "0.15.2" +ext-php-rs = "0.15.3" biscuit-auth = { version = "6.0.0", features = ["pem"] } hex = "0.4" diff --git a/biscuit-php.stubs.php b/biscuit-php.stubs.php new file mode 100644 index 0000000..a607939 --- /dev/null +++ b/biscuit-php.stubs.php @@ -0,0 +1,299 @@ + PublicKey { + #[php(getter)] + pub fn get_public_key(&self) -> PublicKey { PublicKey(self.0.public()) } - pub fn private(&self) -> PrivateKey { + #[php(getter)] + pub fn get_private_key(&self) -> PrivateKey { PrivateKey(self.0.private()) } } diff --git a/stubs/.gitkeep b/stubs/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/stubs/Biscuit/Auth/Algorithm.php b/stubs/Biscuit/Auth/Algorithm.php deleted file mode 100644 index 8cfbda6..0000000 --- a/stubs/Biscuit/Auth/Algorithm.php +++ /dev/null @@ -1,14 +0,0 @@ -public(); + $publicKey = $kp->getPublicKey(); static::assertInstanceOf(PublicKey::class, $publicKey); - $privateKey = $kp->private(); + $privateKey = $kp->getPrivateKey(); static::assertInstanceOf(PrivateKey::class, $privateKey); } @@ -43,7 +43,7 @@ public function testKeyPairFromPrivateKey(): void $kp = KeyPair::fromPrivateKey($privateKey); static::assertInstanceOf(KeyPair::class, $kp); - static::assertSame($privateKeyHex, $kp->private()->toHex()); + static::assertSame($privateKeyHex, $kp->getPrivateKey()->toHex()); } public function testPublicKeyFromHex(): void @@ -94,7 +94,7 @@ public function testBiscuitBuilder(): void $builder->addRule(new Rule('can_read($user, $res) <- user($user), resource($res)')); $builder->addCheck(new Check('check if user($u)')); - $biscuit = $builder->build($kp->private()); + $biscuit = $builder->build($kp->getPrivateKey()); static::assertInstanceOf(Biscuit::class, $biscuit); } @@ -109,7 +109,7 @@ public function testBiscuitBuilderWithParameters(): void [], ); - $biscuit = $builder->build($kp->private()); + $biscuit = $builder->build($kp->getPrivateKey()); static::assertInstanceOf(Biscuit::class, $biscuit); } @@ -127,13 +127,13 @@ public function testBiscuitSerialization(): void $base64 = $biscuit->toBase64(); static::assertIsString($base64); - $parsed = Biscuit::fromBase64($base64, $kp->public()); + $parsed = Biscuit::fromBase64($base64, $kp->getPublicKey()); static::assertInstanceOf(Biscuit::class, $parsed); $bytes = $biscuit->toBytes(); static::assertIsArray($bytes); - $parsed2 = Biscuit::fromBytes(pack('C*', ...$bytes), $kp->public()); + $parsed2 = Biscuit::fromBytes(pack('C*', ...$bytes), $kp->getPublicKey()); static::assertInstanceOf(Biscuit::class, $parsed2); } @@ -143,7 +143,7 @@ public function testBiscuitAppend(): void $builder = new BiscuitBuilder(); $builder->addCode('user("alice")'); - $biscuit = $builder->build($kp->private()); + $biscuit = $builder->build($kp->getPrivateKey()); static::assertSame(1, $biscuit->blockCount()); $block = new BlockBuilder(); @@ -177,7 +177,7 @@ public function testAuthorizerBuilder(): void $kp = new KeyPair(); $biscuitBuilder = new BiscuitBuilder(); $biscuitBuilder->addCode('user("alice")'); - $biscuit = $biscuitBuilder->build($kp->private()); + $biscuit = $biscuitBuilder->build($kp->getPrivateKey()); $authBuilder = new AuthorizerBuilder(); $authBuilder->addCode('allow if user("alice")'); @@ -195,7 +195,7 @@ public function testAuthorizerBuilderWithParameters(): void $kp = new KeyPair(); $biscuitBuilder = new BiscuitBuilder(); $biscuitBuilder->addCode('user("alice")'); - $biscuit = $biscuitBuilder->build($kp->private()); + $biscuit = $biscuitBuilder->build($kp->getPrivateKey()); $authBuilder = new AuthorizerBuilder(); $authBuilder->addCodeWithParams('allow if user({username})', ['username' => 'alice'], []); @@ -236,7 +236,7 @@ public function testCompleteLifecycle(): void $biscuit = $biscuit->append($block); $token = $biscuit->toBase64(); - $parsedToken = Biscuit::fromBase64($token, $kp->public()); + $parsedToken = Biscuit::fromBase64($token, $kp->getPublicKey()); $authBuilder = new AuthorizerBuilder(); $authBuilder->addCodeWithParams('allow if user({id})', ['id' => '1234'], []); @@ -252,7 +252,7 @@ public function testAuthorizerQuery(): void $biscuitBuilder = new BiscuitBuilder(); $biscuitBuilder->addCodeWithParams('user({id})', ['id' => '1234'], []); - $biscuit = $biscuitBuilder->build($kp->private()); + $biscuit = $biscuitBuilder->build($kp->getPrivateKey()); $authBuilder = new AuthorizerBuilder(); $authBuilder->addCode('allow if user($u)'); @@ -325,11 +325,11 @@ public function testUnverifiedBiscuit(): void $builder = new BiscuitBuilder(); $builder->addCode('test(true)'); - $token1 = $builder->build($kp->private()); + $token1 = $builder->build($kp->getPrivateKey()); $base64_1 = $token1->toBase64(); $builder->setRootKeyId(42); - $token2 = $builder->build($kp->private()); + $token2 = $builder->build($kp->getPrivateKey()); $block = new BlockBuilder(); $block->addCode('test(false)'); $token2 = $token2->append($block); @@ -358,7 +358,7 @@ public function testUnverifiedBiscuitVerification(): void $base64 = $biscuit->toBase64(); $utoken = UnverifiedBiscuit::fromBase64($base64); - $verified = $utoken->verify($kp->public()); + $verified = $utoken->verify($kp->getPublicKey()); static::assertInstanceOf(Biscuit::class, $verified); } @@ -367,7 +367,7 @@ public function testUnverifiedBiscuitAppend(): void $kp = new KeyPair(); $builder = new BiscuitBuilder(); $builder->addCode('user("alice")'); - $biscuit = $builder->build($kp->private()); + $biscuit = $builder->build($kp->getPrivateKey()); $base64 = $biscuit->toBase64(); $utoken = UnverifiedBiscuit::fromBase64($base64); @@ -384,7 +384,7 @@ public function testRevocationIds(): void $kp = new KeyPair(); $builder = new BiscuitBuilder(); $builder->addCode('user("alice")'); - $biscuit = $builder->build($kp->private()); + $biscuit = $builder->build($kp->getPrivateKey()); $revocationIds = $biscuit->revocationIds(); static::assertIsArray($revocationIds); @@ -403,7 +403,7 @@ public function testThirdPartyBlocks(): void $rootKp = new KeyPair(); $biscuitBuilder = new BiscuitBuilder(); $biscuitBuilder->addCodeWithParams('user({id})', ['id' => '1234'], []); - $biscuit = $biscuitBuilder->build($rootKp->private()); + $biscuit = $biscuitBuilder->build($rootKp->getPrivateKey()); $thirdPartyKp = new KeyPair(); $newBlock = new BlockBuilder(); @@ -412,17 +412,17 @@ public function testThirdPartyBlocks(): void $thirdPartyRequest = $biscuit->thirdPartyRequest(); static::assertInstanceOf(ThirdPartyRequest::class, $thirdPartyRequest); - $thirdPartyBlock = $thirdPartyRequest->createBlock($thirdPartyKp->private(), $newBlock); + $thirdPartyBlock = $thirdPartyRequest->createBlock($thirdPartyKp->getPrivateKey(), $newBlock); static::assertInstanceOf(ThirdPartyBlock::class, $thirdPartyBlock); - $biscuitWithThirdParty = $biscuit->appendThirdParty($thirdPartyKp->public(), $thirdPartyBlock); + $biscuitWithThirdParty = $biscuit->appendThirdParty($thirdPartyKp->getPublicKey(), $thirdPartyBlock); static::assertInstanceOf(Biscuit::class, $biscuitWithThirdParty); static::assertSame(2, $biscuitWithThirdParty->blockCount()); $externalKey = $biscuitWithThirdParty->blockExternalKey(1); static::assertInstanceOf(PublicKey::class, $externalKey); - static::assertSame($thirdPartyKp->public()->toHex(), $externalKey->toHex()); + static::assertSame($thirdPartyKp->getPublicKey()->toHex(), $externalKey->toHex()); } public function testPEMKeyImport(): void @@ -458,7 +458,7 @@ public function testSetRootKeyId(): void $builder->addCode('user("alice")'); $builder->setRootKeyId(42); - $biscuit = $builder->build($kp->private()); + $biscuit = $builder->build($kp->getPrivateKey()); $base64 = $biscuit->toBase64(); $utoken = UnverifiedBiscuit::fromBase64($base64); diff --git a/tests/KeyPairTest.php b/tests/KeyPairTest.php index 865f2c5..04c4e9e 100644 --- a/tests/KeyPairTest.php +++ b/tests/KeyPairTest.php @@ -17,9 +17,9 @@ public function testKeyPairGeneration(): void $keyPair = new KeyPair(); static::assertInstanceOf(KeyPair::class, $keyPair); - static::assertInstanceOf(PublicKey::class, $keyPair->public()); - static::assertInstanceOf(PrivateKey::class, $keyPair->private()); - static::assertIsString($keyPair->public()->toHex()); + static::assertInstanceOf(PublicKey::class, $keyPair->getPublicKey()); + static::assertInstanceOf(PrivateKey::class, $keyPair->getPrivateKey()); + static::assertIsString($keyPair->getPublicKey()->toHex()); } public function testNewWithAlgorithmDefault(): void @@ -27,7 +27,7 @@ public function testNewWithAlgorithmDefault(): void $keyPair = KeyPair::newWithAlgorithm(); static::assertInstanceOf(KeyPair::class, $keyPair); - static::assertStringStartsWith('ed25519/', $keyPair->public()->toHex()); + static::assertStringStartsWith('ed25519/', $keyPair->getPublicKey()->toHex()); } public function testNewWithAlgorithmEd25519(): void @@ -35,7 +35,7 @@ public function testNewWithAlgorithmEd25519(): void $keyPair = KeyPair::newWithAlgorithm(Algorithm::Ed25519); static::assertInstanceOf(KeyPair::class, $keyPair); - static::assertStringStartsWith('ed25519/', $keyPair->public()->toHex()); + static::assertStringStartsWith('ed25519/', $keyPair->getPublicKey()->toHex()); } public function testNewWithAlgorithmSecp256r1(): void @@ -43,7 +43,7 @@ public function testNewWithAlgorithmSecp256r1(): void $keyPair = KeyPair::newWithAlgorithm(Algorithm::Secp256r1); static::assertInstanceOf(KeyPair::class, $keyPair); - static::assertStringStartsWith('secp256r1/', $keyPair->public()->toHex()); + static::assertStringStartsWith('secp256r1/', $keyPair->getPublicKey()->toHex()); } public function testFromPrivateKey(): void @@ -54,18 +54,18 @@ public function testFromPrivateKey(): void $keyPair = KeyPair::fromPrivateKey($privateKey); static::assertInstanceOf(KeyPair::class, $keyPair); - static::assertSame($privateKeyHex, $keyPair->private()->toHex()); + static::assertSame($privateKeyHex, $keyPair->getPrivateKey()->toHex()); } public function testFromPrivateKeyRoundTrip(): void { $originalKeyPair = new KeyPair(); - $privateKey = $originalKeyPair->private(); + $privateKey = $originalKeyPair->getPrivateKey(); $reconstructedKeyPair = KeyPair::fromPrivateKey($privateKey); - static::assertSame($originalKeyPair->public()->toHex(), $reconstructedKeyPair->public()->toHex()); - static::assertSame($originalKeyPair->private()->toHex(), $reconstructedKeyPair->private()->toHex()); + static::assertSame($originalKeyPair->getPublicKey()->toHex(), $reconstructedKeyPair->getPublicKey()->toHex()); + static::assertSame($originalKeyPair->getPrivateKey()->toHex(), $reconstructedKeyPair->getPrivateKey()->toHex()); } public function testPrivateKeyConstruction(): void @@ -196,7 +196,7 @@ public function testPublicKeyFromBytesWithExplicitAlgorithm(): void public function testPublicKeyFromKeyPair(): void { $keyPair = new KeyPair(); - $publicKey = $keyPair->public(); + $publicKey = $keyPair->getPublicKey(); static::assertInstanceOf(PublicKey::class, $publicKey); static::assertStringStartsWith('ed25519/', $publicKey->toHex()); @@ -213,14 +213,14 @@ public function testPublicKeyToString(): void public function testKeyPairPublicPrivateConsistency(): void { $keyPair = new KeyPair(); - $publicKey = $keyPair->public(); - $privateKey = $keyPair->private(); + $publicKey = $keyPair->getPublicKey(); + $privateKey = $keyPair->getPrivateKey(); static::assertMatchesRegularExpression('/^ed25519\/[0-9a-f]{64}$/', $publicKey->toHex()); static::assertMatchesRegularExpression('/^ed25519-private\/[0-9a-f]{64}$/', $privateKey->toHex()); $reconstructed = KeyPair::fromPrivateKey($privateKey); - static::assertSame($publicKey->toHex(), $reconstructed->public()->toHex()); + static::assertSame($publicKey->toHex(), $reconstructed->getPublicKey()->toHex()); } public function testMultipleKeyPairsAreUnique(): void @@ -229,14 +229,14 @@ public function testMultipleKeyPairsAreUnique(): void $keyPair2 = new KeyPair(); static::assertNotSame( - $keyPair1->public()->toHex(), - $keyPair2->public()->toHex(), + $keyPair1->getPublicKey()->toHex(), + $keyPair2->getPublicKey()->toHex(), 'Different KeyPair instances should generate different keys', ); static::assertNotSame( - $keyPair1->private()->toHex(), - $keyPair2->private()->toHex(), + $keyPair1->getPrivateKey()->toHex(), + $keyPair2->getPrivateKey()->toHex(), 'Different KeyPair instances should generate different private keys', ); } @@ -245,15 +245,15 @@ public function testKeySerializationRoundTrip(): void { $originalKeyPair = new KeyPair(); - $publicBytes = $originalKeyPair->public()->toBytes(); + $publicBytes = $originalKeyPair->getPublicKey()->toBytes(); $publicReconstructed = PublicKey::fromBytes(pack('C*', ...$publicBytes)); - static::assertSame($originalKeyPair->public()->toHex(), $publicReconstructed->toHex()); + static::assertSame($originalKeyPair->getPublicKey()->toHex(), $publicReconstructed->toHex()); - $privateBytes = $originalKeyPair->private()->toBytes(); + $privateBytes = $originalKeyPair->getPrivateKey()->toBytes(); $privateReconstructed = PrivateKey::fromBytes(pack('C*', ...$privateBytes)); - static::assertSame($originalKeyPair->private()->toHex(), $privateReconstructed->toHex()); + static::assertSame($originalKeyPair->getPrivateKey()->toHex(), $privateReconstructed->toHex()); $reconstructedKeyPair = KeyPair::fromPrivateKey($privateReconstructed); - static::assertSame($originalKeyPair->public()->toHex(), $reconstructedKeyPair->public()->toHex()); + static::assertSame($originalKeyPair->getPublicKey()->toHex(), $reconstructedKeyPair->getPublicKey()->toHex()); } } diff --git a/tests/RbacExampleTest.php b/tests/RbacExampleTest.php index e120b51..9ecddcb 100644 --- a/tests/RbacExampleTest.php +++ b/tests/RbacExampleTest.php @@ -52,7 +52,7 @@ public function testAdminServiceCanPerformCriticalOperations(): void [], ); - $token = $tokenBuilder->build($keyPair->private()); + $token = $tokenBuilder->build($keyPair->getPrivateKey()); // 2. VERIFY TOKEN: Check if payment-api can perform api:delete at critical priority $authBuilder = new AuthorizerBuilder(); @@ -111,7 +111,7 @@ public function testWriterServiceCannotPerformCriticalOperations(): void [], ); - $token = $tokenBuilder->build($keyPair->private()); + $token = $tokenBuilder->build($keyPair->getPrivateKey()); // 2. VERIFY TOKEN: Check if notification-api can perform api:delete at critical priority $authBuilder = new AuthorizerBuilder(); @@ -182,7 +182,7 @@ public function testPriorityScopedRoles(): void [], ); - $token = $tokenBuilder->build($keyPair->private()); + $token = $tokenBuilder->build($keyPair->getPrivateKey()); // TEST 1: payment-api CAN perform api:delete at critical priority (admin role) $authBuilder1 = new AuthorizerBuilder();