# PKCS#8 Private Key Structures
`synta.pkcs8` provides `OneAsymmetricKey` (also exported as `PrivateKeyInfo`) for parsing
DER-encoded private key envelopes produced by OpenSSL and other PKI tools (RFC 5958 / PKCS#8).
```python
import synta.pkcs8 as pkcs8
```
## OneAsymmetricKey
```python
class OneAsymmetricKey:
@staticmethod
def from_der(data: bytes) -> OneAsymmetricKey: ...
def to_der(self) -> bytes: ...
version: int # 0 = v1 (PrivateKeyInfo), 1 = v2 (RFC 5958)
private_key_algorithm: ObjectIdentifier # the private-key algorithm OID
private_key: bytes # raw key material (OCTET STRING value)
attributes_der: bytes | None # raw DER of [0] IMPLICIT attributes bag
public_key_der: bytes | None # raw DER of [1] IMPLICIT public key BIT STRING
alg_parameters_der: bytes | None # algorithm parameters DER, or None
PrivateKeyInfo = OneAsymmetricKey # RFC 5958 / PKCS#8 alias
```
## Usage
```python
import synta.pkcs8 as pkcs8
# Parse a PKCS#8 key from DER bytes
with open("key.der", "rb") as f:
key = pkcs8.OneAsymmetricKey.from_der(f.read())
print(f"version: {key.version}")
print(f"algorithm: {key.private_key_algorithm}")
print(f"key bytes: {key.private_key.hex()}")
# Algorithm parameters (e.g. curve OID for EC keys)
if key.alg_parameters_der:
import synta.pkixalgs as pa
ec_params = pa.ECParameters.from_der(key.alg_parameters_der)
if ec_params.arm == "namedCurve":
print(f"curve: {ec_params.named_curve_oid}")
# Check for optional public key component (v2 / RFC 5958)
if key.public_key_der:
print(f"public key DER: {len(key.public_key_der)} bytes")
# Use the PrivateKeyInfo alias
key2 = pkcs8.PrivateKeyInfo.from_der(key_der)
```
For cryptographic operations (signing, decryption, key generation), use
[`synta.PrivateKey`](../pki/keys.md) which wraps an OpenSSL key. `OneAsymmetricKey` is
a pure ASN.1 parser that does not invoke any cryptographic backend.
See also [PKCS#9 OIDs](../oids/pkcs9.md) for `id-friendlyName` and `id-localKeyId` bag attributes
used in PKCS#12 archives, and [PKCS Loaders](../pki/pkcs-loaders.md) for extracting raw
PKCS#8 DER bytes from PKCS#12 archives via `load_pkcs12_keys`.