forked from cwtch.im/tapir
57 lines
1.8 KiB
Go
57 lines
1.8 KiB
Go
package applications
|
|
|
|
import (
|
|
"cwtch.im/tapir"
|
|
"cwtch.im/tapir/primitives/privacypass"
|
|
"encoding/json"
|
|
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
|
)
|
|
|
|
// TokenApplication provides Tokens for PoW
|
|
type TokenApplication struct {
|
|
TranscriptApp
|
|
TokenService *privacypass.TokenServer
|
|
Tokens []*privacypass.Token
|
|
}
|
|
|
|
// HasTokensCapability is granted once the client has obtained signed tokens
|
|
const HasTokensCapability = tapir.Capability("HasTokensCapability")
|
|
|
|
// NewInstance should always return a new instantiation of the application.
|
|
func (powapp *TokenApplication) NewInstance() tapir.Application {
|
|
app := new(TokenApplication)
|
|
app.TokenService = powapp.TokenService
|
|
return app
|
|
}
|
|
|
|
// Init is run when the connection is first started.
|
|
func (powapp *TokenApplication) Init(connection tapir.Connection) {
|
|
powapp.Transcript().NewProtocol("token-app")
|
|
if connection.IsOutbound() {
|
|
tokens, blinded := privacypass.GenerateBlindedTokenBatch(10)
|
|
data, _ := json.Marshal(blinded)
|
|
connection.Send(data)
|
|
var signedBatch privacypass.SignedBatchWithProof
|
|
err := json.Unmarshal(connection.Expect(), &signedBatch)
|
|
if err == nil {
|
|
verified := privacypass.UnblindSignedTokenBatch(tokens, blinded, signedBatch.SignedTokens, powapp.TokenService.Y, signedBatch.Proof, powapp.Transcript())
|
|
if verified {
|
|
log.Debugf("Successfully obtained signed tokens")
|
|
powapp.Tokens = tokens
|
|
connection.SetCapability(HasTokensCapability)
|
|
return
|
|
}
|
|
log.Debugf("Failed to verify signed token batch")
|
|
}
|
|
} else {
|
|
var blinded []privacypass.BlindedToken
|
|
err := json.Unmarshal(connection.Expect(), &blinded)
|
|
if err == nil {
|
|
batchProof := powapp.TokenService.SignBlindedTokenBatch(blinded, powapp.Transcript())
|
|
data, _ := json.Marshal(batchProof)
|
|
connection.Send(data)
|
|
return
|
|
}
|
|
}
|
|
}
|