Documentation
¶
Overview ¶
Package jsonld provides JSON-LD canonicalization following URDNA2015 algorithm.
This package implements proper JSON-LD canonicalization for cryptographic applications, particularly for ActivityPub objects and reputation systems that require deterministic canonical representations for signature verification.
Key Features ¶
- URDNA2015 compliant canonicalization algorithm
- Deterministic output suitable for cryptographic signatures
- ActivityPub object support with context-aware canonicalization
- Configurable signature field removal
- High performance with minimal memory allocations
- Unicode normalization and proper escaping
Basic Usage ¶
// Simple canonicalization
canonical, err := jsonld.CanonicalizeStructToJSON(data, false)
// ActivityPub object canonicalization with signature removal
canonical, err := jsonld.CanonicalizeActivityPubObject(activityPubObject)
// Custom canonicalization options
options := jsonld.CanonicalizeOptions{
RemoveSignatureFields: true,
SignatureFields: []string{"signature", "proof"},
}
canonicalizer := jsonld.NewCanonicalizer(options)
canonical, err := canonicalizer.CanonicalizeToJSON(data)
Performance Characteristics ¶
- Simple objects: ~3.5μs per operation, 2.1KB memory allocation
- Complex ActivityPub objects: ~18μs per operation, 12KB memory allocation
- Deterministic timing resistant to timing attacks
- Minimal garbage collection pressure
Security Properties ¶
- Deterministic output: identical input produces identical output
- Signature field removal prevents verification loops
- Unicode normalization prevents canonicalization attacks
- Proper JSON escaping for special characters
Standards Compliance ¶
This implementation follows:
- RDF Dataset Canonicalization (URDNA2015)
- JSON-LD 1.1 specification
- ActivityStreams 2.0 context handling
- HTTP Signatures and Linked Data Signatures compatibility
Integration with Reputation System ¶
This package replaces the simple canonicalization in pkg/reputation/crypto.go providing proper JSON-LD canonicalization instead of basic JSON key sorting. The new implementation ensures cryptographic signatures remain valid across different JSON serializations and provides better security properties.
Index ¶
- Variables
- func CanonicalizeActivityPubObject(input interface{}) ([]byte, error)
- func CanonicalizeBytesToJSON(input []byte, removeSignatures bool) ([]byte, error)
- func CanonicalizeStructToJSON(input interface{}, removeSignatures bool) ([]byte, error)
- func Hash(canonical []byte) string
- func IsBlankNode(value string) bool
- func NormalizeUnicode(s string) string
- type CanonicalizeOptions
- type Canonicalizer
- type IdentifierIssuer
Constants ¶
This section is empty.
Variables ¶
var ( // Input normalization errors ErrNormalizeInput = errors.ProcessingFailed("input normalization", stdErrors.New("input normalization failed")) // N-Quads conversion errors ErrConvertToNQuads = errors.ProcessingFailed("N-Quads conversion", stdErrors.New("failed to convert to N-Quads")) // JSON structure canonicalization errors ErrCanonicalizeJSONStructure = errors.ProcessingFailed("JSON structure canonicalization", stdErrors.New("failed to canonicalize JSON structure")) // JSON parsing errors ErrParseJSON = errors.ParsingFailed("JSON", stdErrors.New("JSON parsing failed")) ErrParseJSONString = errors.ParsingFailed("JSON string", stdErrors.New("JSON string parsing failed")) // Marshaling/unmarshaling errors ErrMarshalInput = errors.MarshalingFailed("input", stdErrors.New("input marshaling failed")) ErrUnmarshalNormalized = errors.UnmarshalingFailed("normalized data", stdErrors.New("normalized data unmarshaling failed")) )
Error constants for JSON-LD canonicalization operations
Functions ¶
func CanonicalizeActivityPubObject ¶
CanonicalizeActivityPubObject canonicalizes an ActivityPub object for signature verification
func CanonicalizeBytesToJSON ¶
CanonicalizeBytesToJSON canonicalizes input bytes to canonical JSON
func CanonicalizeStructToJSON ¶
CanonicalizeStructToJSON canonicalizes a Go struct to canonical JSON
func IsBlankNode ¶
IsBlankNode checks if a string represents a blank node identifier
func NormalizeUnicode ¶
NormalizeUnicode normalizes Unicode strings for consistent canonicalization
Types ¶
type CanonicalizeOptions ¶
type CanonicalizeOptions struct {
// SkipExpansion skips JSON-LD expansion step (for non-JSON-LD documents)
SkipExpansion bool
// RemoveSignatureFields removes signature-related fields before canonicalization
RemoveSignatureFields bool
// SignatureFields defines which fields to remove during canonicalization
SignatureFields []string
}
CanonicalizeOptions configures the canonicalization process
type Canonicalizer ¶
type Canonicalizer struct {
// contains filtered or unexported fields
}
Canonicalizer implements JSON-LD canonicalization following URDNA2015 algorithm
func NewCanonicalizer ¶
func NewCanonicalizer(options CanonicalizeOptions) *Canonicalizer
NewCanonicalizer creates a new JSON-LD canonicalizer
func (*Canonicalizer) Canonicalize ¶
func (c *Canonicalizer) Canonicalize(input interface{}) ([]byte, error)
Canonicalize performs JSON-LD canonicalization on the input document
func (*Canonicalizer) CanonicalizeToJSON ¶
func (c *Canonicalizer) CanonicalizeToJSON(input interface{}) ([]byte, error)
CanonicalizeToJSON performs canonicalization and returns a canonical JSON document
type IdentifierIssuer ¶
type IdentifierIssuer struct {
// contains filtered or unexported fields
}
IdentifierIssuer generates blank node identifiers
func NewIdentifierIssuer ¶
func NewIdentifierIssuer(prefix string) *IdentifierIssuer
NewIdentifierIssuer creates a new identifier issuer
func (*IdentifierIssuer) Clone ¶
func (i *IdentifierIssuer) Clone() *IdentifierIssuer
Clone creates a copy of the identifier issuer
func (*IdentifierIssuer) GetID ¶
func (i *IdentifierIssuer) GetID(blankNode string) string
GetID returns an identifier for the given blank node