Documentation
¶
Overview ¶
Package common provides I2P protocol common data structures and utilities.
This library implements type-safe I2P network protocol data structures according to specification version 0.9.67, with comprehensive validation and error handling.
Overview ¶
The go-i2p/common package provides fundamental building blocks for I2P applications:
- Data primitives (Integer, String, Date, Hash, Mapping)
- Cryptographic structures (Certificate, Signature, KeyCertificate)
- Network identities (Destination, RouterIdentity, RouterInfo)
- Tunnel management (Lease, LeaseSet, EncryptedLeaseSet)
- Encoding utilities (Base32, Base64)
Design Philosophy ¶
This library prioritizes safety and correctness:
- All types provide safe constructors with validation
- Zero-value types are checked and rejected
- Errors are returned explicitly, never ignored
- Stream parsing supports efficient multi-value reads
- Comprehensive test coverage (>85%) ensures reliability
Constructor Pattern ¶
All complex types follow a consistent constructor pattern:
// Primary constructor with validation
obj, err := NewType(params...)
if err != nil {
return err
}
// Parse from bytes
obj, remainder, err := NewTypeFromBytes(data)
if err != nil {
return err
}
// Read from stream (no constructor - returns parsed type)
obj, remainder, err := ReadType(data)
if err != nil {
return err
}
Validation Pattern ¶
All types implement validation methods:
// Comprehensive validation with detailed errors
if err := obj.Validate(); err != nil {
return fmt.Errorf("validation failed: %w", err)
}
// Boolean convenience method
if !obj.IsValid() {
return errors.New("object is invalid")
}
Safe Accessors ¶
Types provide both legacy and safe accessor methods:
// Legacy accessor (may return zero on error)
value := integer.Int()
// Safe accessor (returns error)
value, err := integer.IntSafe()
if err != nil {
return err
}
Package Organization ¶
The library is organized into focused packages:
- data: Primitive I2P data types
- base32/base64: I2P-specific encoding
- certificate: Certificate structures
- key_certificate: Key-specific certificates
- keys_and_cert: Combined public keys with certificates
- destination: Network identities
- router_identity: Router identities
- router_address: Router network addresses
- router_info: Complete router information
- lease: Individual tunnel leases
- lease_set: Standard lease sets
- lease_set2: Extended lease sets
- encrypted_leaseset: Encrypted lease sets
- meta_leaseset: Meta lease sets
- offline_signature: Offline signing support
- signature: Digital signatures
- session_tag: Session tags for encryption
- session_key: Session keys
Example Usage ¶
Creating a destination:
// Generate keys
keyCert, _ := key_certificate.NewEd25519X25519KeyCertificate()
pubKey, privKey := /* generate Ed25519 key pair */
encKey, encPrivKey := /* generate X25519 key pair */
// Create KeysAndCert
kac, err := keys_and_cert.NewKeysAndCert(keyCert, encKey, nil, pubKey)
if err != nil {
return err
}
// Create Destination
dest, err := destination.NewDestination(kac)
if err != nil {
return err
}
// Encode as Base32 address
address, err := dest.Base32Address()
fmt.Printf("I2P address: %s.b32.i2p\n", address)
Parsing from bytes:
// Parse destination from bytes
dest, remainder, err := destination.ReadDestination(data)
if err != nil {
return err
}
// Validate parsed data
if err := dest.Validate(); err != nil {
return fmt.Errorf("invalid destination: %w", err)
}
Migration from Legacy Code ¶
This library maintains backward compatibility while adding safe constructors:
// OLD (unsafe):
i := data.Integer(someBytes)
value := i.Int() // May return 0 on error
// NEW (safe):
i, err := data.NewIntegerFromBytes(someBytes)
if err != nil {
return err
}
value, err := i.IntSafe()
if err != nil {
return err
}
Specification Compliance ¶
Reference: https://geti2p.net/spec/common-structures
This implementation follows I2P specification version 0.9.67 and is designed for use in I2P routers, clients, and utilities.
Version Information ¶
Use the package constants to check specification version:
fmt.Printf("I2P Spec Version: %s\n", common.I2P_SPEC_VERSION)
fmt.Printf("Major.Minor.Patch: %d.%d.%d\n",
common.I2P_SPEC_MAJOR,
common.I2P_SPEC_MINOR,
common.I2P_SPEC_PATCH)
Package common provides I2P protocol common data structures and utilities.
Package common provides I2P protocol common data structures and utilities.
Index ¶
- Constants
- func AppendBigEndianUint16(buf []byte, val uint16) []byte
- func AppendBigEndianUint32(buf []byte, val uint32) []byte
- func CreateLeaseSetSignature(signingKey interface{}, data []byte, sigType uint16, ...) (sig.Signature, error)
- func DetermineSignatureType(destSigningKeyType int, offlineSig *offline_signature.OfflineSignature) uint16
- func ExtractEd25519PrivateKey(signingKey interface{}) (ed25519.PrivateKey, error)
- func ParseAndApplyCommonPrefix(target LeaseSetFieldApplier, inputData []byte, minSize int, structName string) (remainder []byte, err error)
- func ParseDestinationFromData(inputData []byte, structName string) (destination.Destination, []byte, error)
- func ParseEmbeddedMapping(inputData []byte, structName string) (data.Mapping, []byte, error)
- func ParseLeaseSetHeaderFields(inputData []byte) (published uint32, expires, flags uint16, remainder []byte)
- func ParseLeaseSetSignature(inputData []byte, defaultSigType int, hasOfflineKeys bool, ...) (sig.Signature, []byte, error)
- func ParseOfflineSignatureField(hasOfflineKeys bool, destSigType uint16, inputData []byte, structName string) (*offline_signature.OfflineSignature, []byte, error)
- func PrependLeaseSetTypeByte(typeByte byte, content []byte) []byte
- func ResolveSigningPublicKey(hasOfflineKeys bool, offlineSig *offline_signature.OfflineSignature, ...) (types.SigningPublicKey, error)
- func SerializeLeaseSetHeader(dest destination.Destination, published uint32, expiresOffset uint16, ...) ([]byte, error)
- func SignLeaseSetData(signingKey interface{}, data []byte, sigType uint16) ([]byte, error)
- func ValidateLeaseSetHeaderSize(dataLen int, structName string) error
- func ValidateMinDataSize(dataLen, minSize int, structName string) error
- func VerifyLeaseSetSignature(typeByte byte, fullBytes []byte, sigBytes []byte, ...) error
- func VerifySignatureData(dataToVerify []byte, sigBytes []byte, signingPubKey types.SigningPublicKey, ...) error
- type LeaseSetCommonFields
- type LeaseSetFieldApplier
Constants ¶
const I2P_SPEC_MAJOR = 0
I2P_SPEC_MAJOR represents the major version component of the I2P specification.
const I2P_SPEC_MINOR = 9
I2P_SPEC_MINOR represents the minor version component of the I2P specification.
const I2P_SPEC_PATCH = 67
I2P_SPEC_PATCH represents the patch version component of the I2P specification.
const I2P_SPEC_VERSION = "0.9.67"
I2P_SPEC_VERSION defines the I2P specification version that this library implements. This constant should be updated whenever the implementation is updated to match a newer specification. Reference: https://geti2p.net/spec/
const LeaseSetFlagOfflineKeys = 1 << 0
LeaseSetFlagOfflineKeys is bit 0 of the flags field, indicating that an offline signature is present. This constant is shared by LeaseSet2 and MetaLeaseSet.
const LeaseSetHeaderFieldsSize = 8
LeaseSetHeaderFieldsSize is the combined size of the published (4), expires (2), and flags (2) header fields shared by LeaseSet2 and MetaLeaseSet.
Variables ¶
This section is empty.
Functions ¶
func AppendBigEndianUint16 ¶ added in v0.1.5
AppendBigEndianUint16 appends a big-endian encoded uint16 to buf, consolidating the repeated make-encode-append pattern used across multiple lease set serialization functions.
func AppendBigEndianUint32 ¶ added in v0.1.5
AppendBigEndianUint32 appends a big-endian encoded uint32 to buf, consolidating the repeated make-encode-append pattern used across multiple lease set serialization functions.
func CreateLeaseSetSignature ¶ added in v0.1.5
func CreateLeaseSetSignature(
signingKey interface{},
data []byte,
sigType uint16,
signFn func(interface{}, []byte, uint16) ([]byte, error),
) (sig.Signature, error)
CreateLeaseSetSignature validates the signature type, delegates signing to the provided signFn, and wraps the result in a Signature object. This consolidates the identical createLeaseSet2Signature/createMetaLeaseSetSignature wrappers.
func DetermineSignatureType ¶ added in v0.1.5
func DetermineSignatureType(destSigningKeyType int, offlineSig *offline_signature.OfflineSignature) uint16
DetermineSignatureType returns the signature type to use for lease set signing, consolidating the identical logic from lease_set2 and meta_leaseset packages.
func ExtractEd25519PrivateKey ¶ added in v0.1.5
func ExtractEd25519PrivateKey(signingKey interface{}) (ed25519.PrivateKey, error)
ExtractEd25519PrivateKey extracts an ed25519.PrivateKey from the signing key interface, consolidating the identical extractEd25519PrivateKey/extractPrivateKey helpers from lease_set2 and meta_leaseset packages.
func ParseAndApplyCommonPrefix ¶ added in v0.1.5
func ParseAndApplyCommonPrefix( target LeaseSetFieldApplier, inputData []byte, minSize int, structName string, ) (remainder []byte, err error)
ParseAndApplyCommonPrefix parses the common wire-format prefix shared by LeaseSet2 and MetaLeaseSet and applies the resulting fields to the target structure via the LeaseSetFieldApplier interface. This consolidates the duplicated parse-then-assign pattern from both ReadLeaseSet2 and ReadMetaLeaseSet into a single call.
func ParseDestinationFromData ¶ added in v0.1.5
func ParseDestinationFromData(inputData []byte, structName string) (destination.Destination, []byte, error)
ParseDestinationFromData parses a destination from data, consolidating the identical parseDestinationField functions from lease_set2 and meta_leaseset.
func ParseEmbeddedMapping ¶ added in v0.1.5
ParseEmbeddedMapping parses an options mapping from data, filtering the expected "data exists beyond length" warning that occurs when a mapping is embedded in a larger structure. This consolidates the identical parseOptionsMapping functions from lease_set2 and meta_leaseset packages.
func ParseLeaseSetHeaderFields ¶ added in v0.1.5
func ParseLeaseSetHeaderFields(inputData []byte) (published uint32, expires, flags uint16, remainder []byte)
ParseLeaseSetHeaderFields parses the published timestamp (4 bytes), expires offset (2 bytes), and flags (2 bytes) from data, consolidating the identical parseHeaderFields logic from lease_set2 and meta_leaseset packages.
func ParseLeaseSetSignature ¶ added in v0.1.5
func ParseLeaseSetSignature( inputData []byte, defaultSigType int, hasOfflineKeys bool, offlineSig *offline_signature.OfflineSignature, structName string, ) (sig.Signature, []byte, error)
ParseLeaseSetSignature determines the signature type and parses the trailing signature from data, consolidating the identical parseSignatureAndFinalize functions from lease_set2, meta_leaseset, and encrypted_leaseset packages.
func ParseOfflineSignatureField ¶ added in v0.1.5
func ParseOfflineSignatureField( hasOfflineKeys bool, destSigType uint16, inputData []byte, structName string, ) (*offline_signature.OfflineSignature, []byte, error)
ParseOfflineSignatureField parses an optional offline signature from data if the offline keys flag is set, consolidating the identical parseOfflineSignature helper from lease_set2 and meta_leaseset packages.
func PrependLeaseSetTypeByte ¶ added in v0.1.5
PrependLeaseSetTypeByte prepends a DatabaseStore type byte to serialized lease set content, consolidating the identical pattern from serializeLeaseSet2ForSigning and serializeMetaLeaseSetForSigning.
func ResolveSigningPublicKey ¶ added in v0.1.5
func ResolveSigningPublicKey( hasOfflineKeys bool, offlineSig *offline_signature.OfflineSignature, dest destination.Destination, ) (types.SigningPublicKey, error)
ResolveSigningPublicKey determines which signing public key to use for lease set verification, consolidating the identical signingPublicKeyForVerification logic from lease_set2 and meta_leaseset packages. If offline keys are present, the transient signing public key from the OfflineSignature is constructed and returned. Otherwise, the Destination's signing public key is returned.
func SerializeLeaseSetHeader ¶ added in v0.1.5
func SerializeLeaseSetHeader( dest destination.Destination, published uint32, expiresOffset uint16, flags uint16, offlineSig *offline_signature.OfflineSignature, options data.Mapping, ) ([]byte, error)
SerializeLeaseSetHeader serializes the common header fields shared by LeaseSet2 and MetaLeaseSet: destination, published timestamp, expires offset, flags, optional offline signature, and options mapping. This eliminates duplication between serializeLeaseSet2Content and serializeMetaLeaseSetContent.
func SignLeaseSetData ¶ added in v0.1.5
SignLeaseSetData performs the actual cryptographic signing operation, dispatching to Ed25519, RedDSA, or Ed25519ph based on the sigType. This consolidates the identical signLeaseSet2Data and signMetaLeaseSetData.
func ValidateLeaseSetHeaderSize ¶ added in v0.1.5
ValidateLeaseSetHeaderSize validates that remaining data is sufficient for the common header fields (published, expires, flags), consolidating the identical validateHeaderDataSize functions from lease_set2 and meta_leaseset.
func ValidateMinDataSize ¶ added in v0.1.5
ValidateMinDataSize validates that dataLen meets a minimum size requirement, consolidating the identical validateMinSize and validateLeaseSet2MinSize functions from meta_leaseset and lease_set2 packages.
func VerifyLeaseSetSignature ¶ added in v0.1.5
func VerifyLeaseSetSignature( typeByte byte, fullBytes []byte, sigBytes []byte, signingPubKey types.SigningPublicKey, typeName string, ) error
VerifyLeaseSetSignature performs the common lease set signature verification pattern shared across LeaseSet2, MetaLeaseSet, and LeaseSet types. It prepends the typeByte to the content (fullBytes minus trailing signature), then verifies using the provided signing public key.
func VerifySignatureData ¶ added in v0.1.5
func VerifySignatureData( dataToVerify []byte, sigBytes []byte, signingPubKey types.SigningPublicKey, typeName string, ) error
VerifySignatureData verifies a cryptographic signature against already-prepared data using the provided signing public key. This is the common "create verifier → verify → log" tail shared across all lease set Verify() methods.
Types ¶
type LeaseSetCommonFields ¶ added in v0.1.5
type LeaseSetCommonFields struct {
Destination destination.Destination
Published uint32
Expires uint16
Flags uint16
OfflineSignature *offline_signature.OfflineSignature
Options data.Mapping
}
LeaseSetCommonFields holds the parsed header fields that are structurally identical between LeaseSet2 and MetaLeaseSet wire formats.
func ParseLeaseSetCommonPrefix ¶ added in v0.1.5
func ParseLeaseSetCommonPrefix( inputData []byte, minSize int, structName string, ) (fields LeaseSetCommonFields, remainder []byte, err error)
ParseLeaseSetCommonPrefix parses the common wire-format prefix shared by LeaseSet2 and MetaLeaseSet: destination, published, expires, flags, optional offline signature, and options mapping. This consolidates the identical parseDestinationAndHeader + parseOfflineSignature + parseOptionsMapping call sequence from both packages into a single function.
type LeaseSetFieldApplier ¶ added in v0.1.5
type LeaseSetFieldApplier interface {
ApplyCommonFields(fields LeaseSetCommonFields)
}
LeaseSetFieldApplier is implemented by lease set types that can receive parsed common header fields, eliminating duplicated field assignment code between LeaseSet2 and MetaLeaseSet.
Directories
¶
| Path | Synopsis |
|---|---|
|
Package base32 implements utilities for encoding and decoding text using I2P's alphabet.
|
Package base32 implements utilities for encoding and decoding text using I2P's alphabet. |
|
Package base64 implements I2P-specific base64 encoding and decoding utilities.
|
Package base64 implements I2P-specific base64 encoding and decoding utilities. |
|
Package certificate implements the certificate common-structure of I2P.
|
Package certificate implements the certificate common-structure of I2P. |
|
Package data implements I2P common data structures according to specification version 0.9.67.
|
Package data implements I2P common data structures according to specification version 0.9.67. |
|
Package destination implements the I2P Destination common data structure
|
Package destination implements the I2P Destination common data structure |
|
Package encrypted_leaseset implements the I2P EncryptedLeaseSet common data structure
|
Package encrypted_leaseset implements the I2P EncryptedLeaseSet common data structure |
|
Package key_certificate implements the I2P KeyCertificate common data structure
|
Package key_certificate implements the I2P KeyCertificate common data structure |
|
Package keys_and_cert implements the I2P KeysAndCert common data structure.
|
Package keys_and_cert implements the I2P KeysAndCert common data structure. |
|
Package lease implements the I2P Lease and Lease2 common data structures according to specification version 0.9.67.
|
Package lease implements the I2P Lease and Lease2 common data structures according to specification version 0.9.67. |
|
Package lease_set constants
|
Package lease_set constants |
|
Package lease_set2 implements the I2P LeaseSet2 common data structure
|
Package lease_set2 implements the I2P LeaseSet2 common data structure |
|
Package meta_leaseset implements the I2P MetaLeaseSet common data structure
|
Package meta_leaseset implements the I2P MetaLeaseSet common data structure |
|
Package offline_signature implements the I2P OfflineSignature common data structure according to specification version 0.9.67.
|
Package offline_signature implements the I2P OfflineSignature common data structure according to specification version 0.9.67. |
|
Package router_address implements the I2P RouterAddress common data structure
|
Package router_address implements the I2P RouterAddress common data structure |
|
Package router_identity implements the I2P RouterIdentity common data structure
|
Package router_identity implements the I2P RouterIdentity common data structure |
|
Package router_info implements the I2P RouterInfo common data structure.
|
Package router_info implements the I2P RouterInfo common data structure. |
|
Package session_key implements the I2P SessionKey common data structure
|
Package session_key implements the I2P SessionKey common data structure |
|
Package session_tag implements the I2P SessionTag common data structure
|
Package session_tag implements the I2P SessionTag common data structure |
|
Package signature implements the I2P Signature common data structure.
|
Package signature implements the I2P Signature common data structure. |