Documentation
¶
Index ¶
- Constants
- func DeobfuscateModeDNSQuery(in []byte) ([]byte, []byte, []byte, int, error)
- func DeobfuscateModeDecoy(psk []byte, cumulativeHash []byte, in []byte) (bool, error)
- func DeobfuscateModeHTTPFragment(in []byte) ([]byte, []byte, []byte, int, error)
- func DeobfuscateModeNTPRequest(in []byte) ([]byte, []byte, []byte, int, error)
- func DeobfuscateModeTLSAppData(in []byte) ([]byte, []byte, []byte, int, error)
- func DeriveAESKey(psk []byte, packetID uint64, segmentIndex uint16, cumulativeHash []byte) ([]byte, error)
- func DeriveHMACKey(psk []byte, packetID uint64, segmentIndex uint16, cumulativeHash []byte) ([]byte, error)
- func DeriveInitialCumulativeHash(psk []byte) ([]byte, error)
- func DeriveKey(psk []byte, salt string, additionalContext []byte, keyLen int) ([]byte, error)
- func ExtractSegmentMetadata(segmentStateToken []byte) (uint64, uint16, uint16, uint16, error)
- func GenerateRandomBytes(length int) ([]byte, error)
- func GenerateSegmentStateToken(psk []byte, packetID uint64, segmentIndex uint16, totalSegments uint16, ...) ([]byte, error)
- func ObfuscateModeDNSQuery(randSrc *mrand.Rand, segmentStateToken, nonce, encryptedSegmentPayload []byte) ([]byte, error)
- func ObfuscateModeDecoy(randSrc *mrand.Rand, psk []byte, cumulativeHash []byte) ([]byte, error)
- func ObfuscateModeHTTPFragment(randSrc *mrand.Rand, segmentStateToken, nonce, encryptedSegmentPayload []byte) ([]byte, error)
- func ObfuscateModeNTPRequest(randSrc *mrand.Rand, segmentStateToken, nonce, encryptedSegmentPayload []byte) ([]byte, error)
- func ObfuscateModeTLSAppData(randSrc *mrand.Rand, segmentStateToken, nonce, encryptedSegmentPayload []byte) ([]byte, error)
- func UpdateCumulativeHash(psk []byte, oldHash []byte, packetID uint64, processedData []byte) ([]byte, error)
- func VerifySegmentStateToken(psk []byte, packetID uint64, segmentIndex uint16, totalSegments uint16, ...) (bool, error)
- type CosmicDustObfuscator
- type Obfuscator
Constants ¶
const ( MinPSKLen = 64 NonceLen = 12 TagLen = 16 AESKeyLen = 32 HMACKeyLen = 32 HMACSize = 32 SequenceNumLen = 8 CumulativeHashLen = 32 SegmentIDLen = 8 SegmentIndexLen = 2 TotalSegmentsLen = 2 EncryptedPayloadLenBytes = 2 SegmentMetadataLen = SegmentIDLen + SegmentIndexLen + TotalSegmentsLen + EncryptedPayloadLenBytes SegmentStateTokenLen = SegmentMetadataLen + HMACSize MaxSegmentPayloadSize = 1200 MinSegmentPayloadSize = 100 MaxDynamicPadding = 256 MinDynamicPadding = 64 DecoyFrequency = 5 )
const ( ModeTLSAppData = 0 ModeDNSQuery = 1 ModeHTTPFragment = 2 ModeNTPRequest = 3 ModeDecoy = 4 NumDisguiseModes = 5 )
Variables ¶
This section is empty.
Functions ¶
func DeobfuscateModeDNSQuery ¶
func DeobfuscateModeDecoy ¶
func DeriveAESKey ¶
func DeriveAESKey(psk []byte, packetID uint64, segmentIndex uint16, cumulativeHash []byte) ([]byte, error)
DeriveAESKey derives the AES key for a specific segment. It incorporates PSK, cumulativeStateHash, PacketID, and SegmentIndex.
func DeriveHMACKey ¶
func DeriveHMACKey(psk []byte, packetID uint64, segmentIndex uint16, cumulativeHash []byte) ([]byte, error)
DeriveHMACKey derives the HMAC key for a specific segment's state token. It incorporates PSK, cumulativeStateHash, PacketID, and SegmentIndex.
func DeriveInitialCumulativeHash ¶
DeriveInitialCumulativeHash computes the initial cumulative hash from the PSK. This ensures both client and server start with the same synchronized state.
func DeriveKey ¶
DeriveKey derives a fixed-size key from the PSK, a context-specific salt, and an additional context. The additional context allows for key diversity based on current state.
func ExtractSegmentMetadata ¶
ExtractSegmentMetadata extracts PacketID, SegmentIndex, TotalSegments, and EncryptedPayloadLen from the SegmentStateToken.
func GenerateRandomBytes ¶
GenerateRandomBytes generates a slice of cryptographically secure random bytes of the given length.
func GenerateSegmentStateToken ¶
func GenerateSegmentStateToken(psk []byte, packetID uint64, segmentIndex uint16, totalSegments uint16, encryptedPayloadLen uint16, cumulativeHash []byte, encryptedSegmentPayload []byte) ([]byte, error)
GenerateSegmentStateToken creates the token for each segment. Token structure: [PacketID (8 bytes)] + [SegmentIndex (2 bytes)] + [TotalSegments (2 bytes)] + [EncryptedPayloadLen (2 bytes)] + [HMAC (32 bytes)] The HMAC covers: PacketID + SegmentIndex + TotalSegments + EncryptedPayloadLen + CumulativeHash + EncryptedSegmentPayload.
func ObfuscateModeDNSQuery ¶
func ObfuscateModeDecoy ¶
func ObfuscateModeNTPRequest ¶
func ObfuscateModeTLSAppData ¶
func UpdateCumulativeHash ¶
func UpdateCumulativeHash(psk []byte, oldHash []byte, packetID uint64, processedData []byte) ([]byte, error)
UpdateCumulativeHash updates the global cumulative state hash. It incorporates the old hash, PSK, current packet ID, and the processed data (e.g., original payload).
func VerifySegmentStateToken ¶
func VerifySegmentStateToken(psk []byte, packetID uint64, segmentIndex uint16, totalSegments uint16, encryptedPayloadLen uint16, expectedCumulativeHash []byte, receivedToken []byte, encryptedSegmentPayload []byte) (bool, error)
VerifySegmentStateToken verifies the HMAC of a received segment state token.
Types ¶
type CosmicDustObfuscator ¶
type CosmicDustObfuscator struct {
PSK []byte
// contains filtered or unexported fields
}
func (*CosmicDustObfuscator) Deobfuscate ¶
func (o *CosmicDustObfuscator) Deobfuscate(in []byte, out []byte) int
type Obfuscator ¶
type Obfuscator interface {
Obfuscate(in []byte, out []byte) int
Deobfuscate(in []byte, out []byte) int
}
func NewCosmicDustObfuscator ¶
func NewCosmicDustObfuscator(psk []byte) (Obfuscator, error)