common

package module
v0.1.59999 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 8, 2026 License: MIT Imports: 13 Imported by: 0

README

go-i2p/common

A comprehensive Go library implementing I2P (Invisible Internet Project) network protocol common data structures and utilities. This library provides type-safe implementations of the I2P specification common structures, factored out from the main I2P router to enable reusable components for parsing, encoding, and manipulating I2P network data.

Notes on scope:

go-i2p theoretically has strictly scoped packages for low-level operations. This package is strictly scoped to common data structures only and properly structured.

This package MAY use any of the following libraries, and SHOULD use them where possible.

This package MUST NOT use any of the following libraries.


Installation

go mod init your-project
go get github.com/go-i2p/common

Usage

Creating Key Certificates (New Simplified API)

The library now provides simplified constructors for common key certificate types:

package main

import (
    "fmt"
    "github.com/go-i2p/common/key_certificate"
)

func main() {
    // Modern Ed25519/X25519 key certificate (recommended)
    keyCert, err := key_certificate.NewEd25519X25519KeyCertificate()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    fmt.Printf("Signing type: %d\n", keyCert.SigningPublicKeyType())
    fmt.Printf("Crypto type: %d\n", keyCert.PublicKeyType())
    
    // Or create with custom key types
    keyCert, err = key_certificate.NewKeyCertificateWithTypes(
        key_certificate.KEYCERT_SIGN_ED25519,
        key_certificate.KEYCERT_CRYPTO_X25519,
    )
}
Getting Key Sizes Without Object Creation

Query key sizes for padding calculations without creating certificate objects:

package main

import (
    "fmt"
    "github.com/go-i2p/common/key_certificate"
    "github.com/go-i2p/common/keys_and_cert"
)

func main() {
    // Get size information for key types
    sizes, err := key_certificate.GetKeySizes(
        key_certificate.KEYCERT_SIGN_ED25519,
        key_certificate.KEYCERT_CRYPTO_X25519,
    )
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    // Calculate padding size
    paddingSize := keys_and_cert.KEYS_AND_CERT_DATA_SIZE - 
        (sizes.CryptoPublicKeySize + sizes.SigningPublicKeySize)
    
    fmt.Printf("Signature size: %d bytes\n", sizes.SignatureSize)
    fmt.Printf("Signing public key size: %d bytes\n", sizes.SigningPublicKeySize)
    fmt.Printf("Crypto public key size: %d bytes\n", sizes.CryptoPublicKeySize)
    fmt.Printf("Required padding: %d bytes\n", paddingSize)
}
Using the Certificate Builder Pattern

For complex certificate construction scenarios:

package main

import (
    "fmt"
    "github.com/go-i2p/common/certificate"
)

func main() {
    // Build a KEY certificate (7=Ed25519 signing, 4=X25519 crypto)
    builder := certificate.NewCertificateBuilder()
    builder, err := builder.WithKeyTypes(7, 4)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    cert, err := builder.Build()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    _ = cert

    // Or build a certificate with a custom payload
    customPayload := []byte{0x01, 0x02, 0x03, 0x04}
    builder2 := certificate.NewCertificateBuilder()
    builder2, err = builder2.WithType(certificate.CERT_HASHCASH)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    builder2, err = builder2.WithPayload(customPayload)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    cert, err = builder2.Build()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    _ = cert
}
Simple Integer Encoding

Use the new encoding utilities for cleaner binary encoding:

package main

import (
    "fmt"
    "github.com/go-i2p/common/data"
)

func main() {
    // Encode integers without error handling (for valid values)
    signingType := data.EncodeUint16(7)  // Ed25519
    cryptoType := data.EncodeUint16(4)   // X25519
    
    fmt.Printf("Signing type bytes: %v\n", signingType[:])
    fmt.Printf("Crypto type bytes: %v\n", cryptoType[:])
    
    // Decode back to integers
    sigValue := data.DecodeUint16(signingType)
    cryptoValue := data.DecodeUint16(cryptoType)
    
    fmt.Printf("Decoded signing: %d, crypto: %d\n", sigValue, cryptoValue)
    
    // For variable-length encoding with validation
    bytes, err := data.EncodeIntN(1234, 2)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    fmt.Printf("Encoded bytes: %v\n", bytes)
}
Basic Certificate Parsing
package main

import (
    "fmt"
    "github.com/go-i2p/common/certificate"
)

func main() {
    // Parse I2P certificate from binary data
    data := []byte{0x00, 0x00, 0x02, 0xff, 0xff}
    cert, remainder, err := certificate.ReadCertificate(data)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    certType, err := cert.Type()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    certLen, err := cert.Length()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    fmt.Printf("Certificate type: %d\n", certType)
    fmt.Printf("Certificate length: %d\n", certLen)
    fmt.Printf("Remaining bytes: %d\n", len(remainder))
}
Working with Destinations
package main

import (
    "fmt"
    "github.com/go-i2p/common/destination"
)

func main() {
    // Read destination from binary data
    data := []byte{/* destination bytes */}
    dest, remainder, err := destination.ReadDestination(data)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    _ = remainder
    base32Address, err := dest.Base32Address()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    base64Address, err := dest.Base64()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    fmt.Printf("Base32 address: %s\n", base32Address)
    fmt.Printf("Base64 address: %s\n", base64Address)
}
Parsing Router Information
package main

import (
    "fmt"
    "github.com/go-i2p/common/router_info"
)

func main() {
    // Read router info from binary data
    data := []byte{/* router info bytes */}
    routerInfo, remainder, err := router_info.ReadRouterInfo(data)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    _ = remainder
    identity := routerInfo.RouterIdentity()
    addresses := routerInfo.RouterAddresses()
    capabilities := routerInfo.RouterCapabilities()
    
    fmt.Printf("Router identity: %v\n", identity)
    fmt.Printf("Router addresses: %d\n", len(addresses))
    fmt.Printf("Router capabilities: %s\n", capabilities)
}
Working with I2P Strings
package main

import (
    "fmt"
    "github.com/go-i2p/common/data"
)

func main() {
    // Parse I2P string from binary data
    stringData := []byte{0x05, 'h', 'e', 'l', 'l', 'o'}
    i2pString := data.I2PString(stringData)
    
    length, err := i2pString.Length()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    content, err := i2pString.Data()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    fmt.Printf("String length: %d\n", length)
    fmt.Printf("String content: %s\n", content)
}

Logging

This library uses github.com/go-i2p/logger for comprehensive structured logging. Every log message includes pkg and func fields identifying the source package and function.

Enabling Debug Logging
# Enable debug output
DEBUG_I2P=debug go run your-program.go

# Enable warnings-as-fatal (for strict validation)
WARNFAIL_I2P=true go run your-program.go
Log Output Format

All log messages include structured fields for filtering and diagnostics:

time=2025-01-01 12:00:00 level=debug msg=Reading Destination from bytes func=ReadDestination input_length=387 pkg=destination
time=2025-01-01 12:00:00 level=error msg=data too short func=ReadDate pkg=data
Per-Package Logging

Each package has a dedicated log.go file declaring its logger instance. The following packages emit structured logs:

base32, base64, certificate, common, data, destination, encrypted_leaseset, key_certificate, keys_and_cert, lease, lease_set, lease_set2, meta_leaseset, offline_signature, router_address, router_identity, router_info, session_key, session_tag, signature


Requirements

  • Go Version: 1.25.0 or later
  • I2P Specification: 0.9.67 (June 2025)
  • Dependencies:
    • github.com/go-i2p/crypto - I2P cryptographic primitives
    • github.com/go-i2p/logger - Structured logging wrapper
    • github.com/samber/oops - Enhanced error handling
    • github.com/stretchr/testify - Testing utilities

Testing

Run the comprehensive test suite:

# Run all tests
make test

# Run specific component tests
go test ./certificate/...
go test ./destination/...
go test ./router_info/...

# Run tests with debug logging enabled
DEBUG_I2P=debug go test ./...

# Run fuzz tests
go test -fuzz=FuzzCertificate ./certificate/

License

MIT License - see LICENSE file for details.

Copyright (c) 2025 I2P For Go

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

View Source
const I2P_SPEC_MAJOR = 0

I2P_SPEC_MAJOR represents the major version component of the I2P specification.

View Source
const I2P_SPEC_MINOR = 9

I2P_SPEC_MINOR represents the minor version component of the I2P specification.

View Source
const I2P_SPEC_PATCH = 67

I2P_SPEC_PATCH represents the patch version component of the I2P specification.

View Source
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/

View Source
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.

View Source
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

func AppendBigEndianUint16(buf []byte, val uint16) []byte

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

func AppendBigEndianUint32(buf []byte, val uint32) []byte

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

func ParseEmbeddedMapping(inputData []byte, structName string) (data.Mapping, []byte, error)

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

func PrependLeaseSetTypeByte(typeByte byte, content []byte) []byte

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

func SignLeaseSetData(signingKey interface{}, data []byte, sigType uint16) ([]byte, error)

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

func ValidateLeaseSetHeaderSize(dataLen int, structName string) error

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

func ValidateMinDataSize(dataLen, minSize int, structName string) error

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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL