public function format(PublicKeyInterface $key) { if (!$key->getCurve() instanceof NamedCurveFp) { throw new \RuntimeException('Not implemented for unnamed curves'); } $sequence = new Sequence(new Sequence(new ObjectIdentifier(DerPublicKeySerializer::X509_ECDSA_OID), CurveOidMapper::getCurveOid($key->getCurve())), new BitString($this->encodePoint($key->getPoint()))); return $sequence->getBinary(); }
/** * @param NamedCurveFp $c * @param GeneratorPoint $G * @return string */ public function serialize(NamedCurveFp $c, GeneratorPoint $G) { $math = $G->getAdapter(); $fieldID = $this->getFieldIdAsn($math, $c); $curve = $this->getCurveAsn($math, $c); $domain = new Sequence(new Integer(1), $fieldID, $curve, new OctetString($this->pointSerializer->serialize($G)), new Integer($G->getOrder()), new Integer(1)); $payload = $domain->getBinary(); $content = self::HEADER . PHP_EOL . trim(chunk_split(base64_encode($payload), 64, PHP_EOL)) . PHP_EOL . self::FOOTER; return $content; }
public function testParseBase64() { $sequence = new Sequence(new Set(new ObjectIdentifier('1.2.250.1.16.9'), new Sequence(new Integer(42), new BitString('A0 12 00 43')))); $data = base64_encode($sequence->getBinary()); $template = [Identifier::SEQUENCE => [Identifier::SET => [Identifier::OBJECT_IDENTIFIER, Identifier::SEQUENCE => [Identifier::INTEGER, Identifier::BITSTRING]]]]; $parser = new TemplateParser(); $object = $parser->parseBase64($data, $template); $this->assertInstanceOf(Set::class, $object[0]); $this->assertInstanceOf(ObjectIdentifier::class, $object[0][0]); $this->assertInstanceOf(Sequence::class, $object[0][1]); $this->assertInstanceOf(Integer::class, $object[0][1][0]); $this->assertInstanceOf(BitString::class, $object[0][1][1]); }
public function testREADME_encoding() { $this->expectOutputString('MBgCAwHiQAEB/woBARYLSGVsbG8gd29ybGQxODAYAgMB4kABAf8KAQEWC0hlbGxvIHdvcmxkBQAGBiqBegEQCQYJKoZIhvcNAQEBEwdGb28gYmFy'); $integer = new Integer(123456); $boolean = new Boolean(true); $enum = new Enumerated(1); $ia5String = new IA5String('Hello world'); $asnNull = new NullObject(); $objectIdentifier1 = new ObjectIdentifier('1.2.250.1.16.9'); $objectIdentifier2 = new ObjectIdentifier(OID::RSA_ENCRYPTION); $printableString = new PrintableString('Foo bar'); $sequence = new Sequence($integer, $boolean, $enum, $ia5String); $set = new Set($sequence, $asnNull, $objectIdentifier1, $objectIdentifier2, $printableString); $myBinary = $sequence->getBinary(); $myBinary .= $set->getBinary(); echo base64_encode($myBinary); }
/** * @depends testFromBinary */ public function testFromBinaryWithOffset() { $originalObject1 = new Sequence(new Boolean(true), new Integer(123)); $originalObject2 = new Sequence(new Integer(64), new Boolean(false)); $binaryData = $originalObject1->getBinary(); $binaryData .= $originalObject2->getBinary(); $offset = 0; $parsedObject = Sequence::fromBinary($binaryData, $offset); $this->assertEquals($originalObject1, $parsedObject); $this->assertEquals(8, $offset); $parsedObject = Sequence::fromBinary($binaryData, $offset); $this->assertEquals($originalObject2, $parsedObject); $this->assertEquals(16, $offset); }
/** * @param Sequence $object * @return \Mdanter\Ecc\Crypto\Key\PublicKeyInterface */ public function parseSubjectKeyInfo(Sequence $object) { $pubkey = $this->pubKeySer->parse($object->getBinary()); return $pubkey; }
/** * @param \Jose\Object\JWKInterface $key * @param string $data * @param string $R * @param string $S * * @return bool */ private function verifyOpenSSLSignature(JWKInterface $key, $data, $R, $S) { $pem = ECKey::toPublic(new ECKey($key))->toPEM(); $oid_sequence = new Sequence(); $oid_sequence->addChildren([new Integer(gmp_strval($this->convertHexToGmp($R), 10)), new Integer(gmp_strval($this->convertHexToGmp($S), 10))]); return 1 === openssl_verify($data, $oid_sequence->getBinary(), $pem, $this->getHashAlgorithm()); }
<?php require_once __DIR__ . '/../vendor/autoload.php'; use FG\ASN1\OID; use FG\ASN1\Universal\Integer; use FG\ASN1\Universal\Boolean; use FG\ASN1\Universal\Enumerated; use FG\ASN1\Universal\IA5String; use FG\ASN1\Universal\ObjectIdentifier; use FG\ASN1\Universal\PrintableString; use FG\ASN1\Universal\Sequence; use FG\ASN1\Universal\Set; use FG\ASN1\Universal\NullObject; $integer = new Integer(123456); $boolean = new Boolean(true); $enum = new Enumerated(1); $ia5String = new IA5String('Hello world'); $asnNull = new NullObject(); $objectIdentifier1 = new ObjectIdentifier('1.2.250.1.16.9'); $objectIdentifier2 = new ObjectIdentifier(OID::RSA_ENCRYPTION); $printableString = new PrintableString('Foo bar'); $sequence = new Sequence($integer, $boolean, $enum, $ia5String); $set = new Set($sequence, $asnNull, $objectIdentifier1, $objectIdentifier2, $printableString); $myBinary = $sequence->getBinary(); $myBinary .= $set->getBinary(); echo base64_encode($myBinary);
/** * {@inheritDoc} * @see \Mdanter\Ecc\Serializer\PrivateKeySerializerInterface::serialize() */ public function serialize(PrivateKeyInterface $key) { $privateKeyInfo = new Sequence(new Integer(self::VERSION), new OctetString($this->formatKey($key)), new ExplicitlyTaggedObject(0, CurveOidMapper::getCurveOid($key->getPoint()->getCurve())), new ExplicitlyTaggedObject(1, $this->encodePubKey($key))); return $privateKeyInfo->getBinary(); }
/** * */ private function initPrivateKey() { $this->addChild(new Integer(0)); $oid_sequence = new Sequence(); $oid_sequence->addChild(new ObjectIdentifier('1.2.840.113549.1.1.1')); $oid_sequence->addChild(new NullObject()); $this->addChild($oid_sequence); $v = new Integer(0); $n = new Integer($this->fromBase64ToInteger($this->n)); $e = new Integer($this->fromBase64ToInteger($this->e)); $d = new Integer($this->fromBase64ToInteger($this->d)); $p = new Integer($this->fromBase64ToInteger($this->p)); $q = new Integer($this->fromBase64ToInteger($this->q)); $dp = new Integer($this->fromBase64ToInteger($this->dp)); $dq = new Integer($this->fromBase64ToInteger($this->dq)); $qi = new Integer($this->fromBase64ToInteger($this->qi)); $key_sequence = new Sequence(); $key_sequence->addChild($v); $key_sequence->addChild($n); $key_sequence->addChild($e); $key_sequence->addChild($d); $key_sequence->addChild($p); $key_sequence->addChild($q); $key_sequence->addChild($dp); $key_sequence->addChild($dq); $key_sequence->addChild($qi); $key_octet_string = new OctetString(bin2hex($key_sequence->getBinary())); $this->addChild($key_octet_string); }
private function initPrivateKey() { $this->addChild(new Integer(0)); $oid_sequence = new Sequence(); $oid_sequence->addChild(new ObjectIdentifier('1.2.840.113549.1.1.1')); $oid_sequence->addChild(new NullObject()); $this->addChild($oid_sequence); $v = new Integer(0); $n = new Integer($this->fromBase64ToInteger($this->values['n'])); $e = new Integer($this->fromBase64ToInteger($this->values['e'])); $d = new Integer($this->fromBase64ToInteger($this->values['d'])); $p = new Integer($this->fromBase64ToInteger($this->values['p'])); $q = new Integer($this->fromBase64ToInteger($this->values['q'])); $dp = array_key_exists('dp', $this->values) ? new Integer($this->fromBase64ToInteger($this->values['dp'])) : new Integer(0); $dq = array_key_exists('dq', $this->values) ? new Integer($this->fromBase64ToInteger($this->values['dq'])) : new Integer(0); $qi = array_key_exists('qi', $this->values) ? new Integer($this->fromBase64ToInteger($this->values['qi'])) : new Integer(0); $key_sequence = new Sequence(); $key_sequence->addChild($v); $key_sequence->addChild($n); $key_sequence->addChild($e); $key_sequence->addChild($d); $key_sequence->addChild($p); $key_sequence->addChild($q); $key_sequence->addChild($dp); $key_sequence->addChild($dq); $key_sequence->addChild($qi); $key_octet_string = new OctetString(bin2hex($key_sequence->getBinary())); $this->addChild($key_octet_string); }