Skip to content

Commit dbd04af

Browse files
committed
verificationhelper/sas: include emoji descriptions in callback
Signed-off-by: Sumner Evans <[email protected]>
1 parent 077716a commit dbd04af

File tree

5 files changed

+91
-11
lines changed

5 files changed

+91
-11
lines changed

crypto/verificationhelper/callbacks_test.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ type baseVerificationCallbacks struct {
2828
doneTransactions map[id.VerificationTransactionID]struct{}
2929
verificationCancellation map[id.VerificationTransactionID]*event.VerificationCancelEventContent
3030
emojisShown map[id.VerificationTransactionID][]rune
31+
emojiDescriptionsShown map[id.VerificationTransactionID][]string
3132
decimalsShown map[id.VerificationTransactionID][]int
3233
}
3334

@@ -39,6 +40,7 @@ func newBaseVerificationCallbacks() *baseVerificationCallbacks {
3940
doneTransactions: map[id.VerificationTransactionID]struct{}{},
4041
verificationCancellation: map[id.VerificationTransactionID]*event.VerificationCancelEventContent{},
4142
emojisShown: map[id.VerificationTransactionID][]rune{},
43+
emojiDescriptionsShown: map[id.VerificationTransactionID][]string{},
4244
decimalsShown: map[id.VerificationTransactionID][]int{},
4345
}
4446
}
@@ -69,8 +71,8 @@ func (c *baseVerificationCallbacks) GetVerificationCancellation(txnID id.Verific
6971
return c.verificationCancellation[txnID]
7072
}
7173

72-
func (c *baseVerificationCallbacks) GetEmojisShown(txnID id.VerificationTransactionID) []rune {
73-
return c.emojisShown[txnID]
74+
func (c *baseVerificationCallbacks) GetEmojisAndDescriptionsShown(txnID id.VerificationTransactionID) ([]rune, []string) {
75+
return c.emojisShown[txnID], c.emojiDescriptionsShown[txnID]
7476
}
7577

7678
func (c *baseVerificationCallbacks) GetDecimalsShown(txnID id.VerificationTransactionID) []int {
@@ -104,8 +106,9 @@ func newSASVerificationCallbacksWithBase(base *baseVerificationCallbacks) *sasVe
104106
return &sasVerificationCallbacks{base}
105107
}
106108

107-
func (c *sasVerificationCallbacks) ShowSAS(ctx context.Context, txnID id.VerificationTransactionID, emojis []rune, decimals []int) {
109+
func (c *sasVerificationCallbacks) ShowSAS(ctx context.Context, txnID id.VerificationTransactionID, emojis []rune, emojiDescriptions []string, decimals []int) {
108110
c.emojisShown[txnID] = emojis
111+
c.emojiDescriptionsShown[txnID] = emojiDescriptions
109112
c.decimalsShown[txnID] = decimals
110113
}
111114

crypto/verificationhelper/sas.go

+70-1
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ func (vh *VerificationHelper) onVerificationKey(ctx context.Context, txn Verific
360360

361361
var decimals []int
362362
var emojis []rune
363+
var emojiDescriptions []string
363364
if slices.Contains(txn.StartEventContent.ShortAuthenticationString, event.SASMethodDecimal) {
364365
decimals = []int{
365366
(int(sasBytes[0])<<5 | int(sasBytes[1])>>3) + 1000,
@@ -375,9 +376,10 @@ func (vh *VerificationHelper) onVerificationKey(ctx context.Context, txn Verific
375376
// Right shift the number and then mask the lowest 6 bits.
376377
emojiIdx := (sasNum >> uint(48-(i+1)*6)) & 0b111111
377378
emojis = append(emojis, allEmojis[emojiIdx])
379+
emojiDescriptions = append(emojiDescriptions, allEmojiDescriptions[emojiIdx])
378380
}
379381
}
380-
vh.showSAS(ctx, txn.TransactionID, emojis, decimals)
382+
vh.showSAS(ctx, txn.TransactionID, emojis, emojiDescriptions, decimals)
381383

382384
if err := vh.store.SaveVerificationTransaction(ctx, txn); err != nil {
383385
log.Err(err).Msg("failed to save verification transaction")
@@ -575,6 +577,73 @@ var allEmojis = []rune{
575577
'📌',
576578
}
577579

580+
var allEmojiDescriptions = []string{
581+
"Dog",
582+
"Cat",
583+
"Lion",
584+
"Horse",
585+
"Unicorn",
586+
"Pig",
587+
"Elephant",
588+
"Rabbit",
589+
"Panda",
590+
"Rooster",
591+
"Penguin",
592+
"Turtle",
593+
"Fish",
594+
"Octopus",
595+
"Butterfly",
596+
"Flower",
597+
"Tree",
598+
"Cactus",
599+
"Mushroom",
600+
"Globe",
601+
"Moon",
602+
"Cloud",
603+
"Fire",
604+
"Banana",
605+
"Apple",
606+
"Strawberry",
607+
"Corn",
608+
"Pizza",
609+
"Cake",
610+
"Heart",
611+
"Smiley",
612+
"Robot",
613+
"Hat",
614+
"Glasses",
615+
"Spanner",
616+
"Santa",
617+
"Thumbs Up",
618+
"Umbrella",
619+
"Hourglass",
620+
"Clock",
621+
"Gift",
622+
"Light Bulb",
623+
"Book",
624+
"Pencil",
625+
"Paperclip",
626+
"Scissors",
627+
"Lock",
628+
"Key",
629+
"Hammer",
630+
"Telephone",
631+
"Flag",
632+
"Train",
633+
"Bicycle",
634+
"Aeroplane",
635+
"Rocket",
636+
"Trophy",
637+
"Ball",
638+
"Guitar",
639+
"Trumpet",
640+
"Bell",
641+
"Anchor",
642+
"Headphones",
643+
"Folder",
644+
"Pin",
645+
}
646+
578647
func (vh *VerificationHelper) onVerificationMAC(ctx context.Context, txn VerificationTransaction, evt *event.Event) {
579648
log := vh.getLog(ctx).With().
580649
Str("verification_action", "mac").

crypto/verificationhelper/verificationhelper.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ type RequiredCallbacks interface {
4242
type ShowSASCallbacks interface {
4343
// ShowSAS is a callback that is called when the SAS verification has
4444
// generated a short authentication string to show. It is guaranteed that
45-
// either the emojis list, or the decimals list, or both will be present.
46-
ShowSAS(ctx context.Context, txnID id.VerificationTransactionID, emojis []rune, decimals []int)
45+
// either the emojis and emoji descriptions lists, or the decimals list, or
46+
// both will be present.
47+
ShowSAS(ctx context.Context, txnID id.VerificationTransactionID, emojis []rune, emojiDescriptions []string, decimals []int)
4748
}
4849

4950
type ShowQRCodeCallbacks interface {
@@ -75,7 +76,7 @@ type VerificationHelper struct {
7576
verificationCancelledCallback func(ctx context.Context, txnID id.VerificationTransactionID, code event.VerificationCancelCode, reason string)
7677
verificationDone func(ctx context.Context, txnID id.VerificationTransactionID)
7778

78-
showSAS func(ctx context.Context, txnID id.VerificationTransactionID, emojis []rune, decimals []int)
79+
showSAS func(ctx context.Context, txnID id.VerificationTransactionID, emojis []rune, emojiDescriptions []string, decimals []int)
7980

8081
scanQRCode func(ctx context.Context, txnID id.VerificationTransactionID)
8182
showQRCode func(ctx context.Context, txnID id.VerificationTransactionID, qrCode *QRCode)

crypto/verificationhelper/verificationhelper_sas_test.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,9 @@ func TestVerification_SAS(t *testing.T) {
165165

166166
// Ensure that the receiving device showed emojis and SAS numbers.
167167
assert.Len(t, receivingCallbacks.GetDecimalsShown(txnID), 3)
168-
assert.Len(t, receivingCallbacks.GetEmojisShown(txnID), 7)
168+
emojis, descriptions := receivingCallbacks.GetEmojisAndDescriptionsShown(txnID)
169+
assert.Len(t, emojis, 7)
170+
assert.Len(t, descriptions, 7)
169171
} else {
170172
// Process the first key event on the sending device.
171173
ts.dispatchToDevice(t, ctx, sendingClient)
@@ -178,7 +180,9 @@ func TestVerification_SAS(t *testing.T) {
178180

179181
// Ensure that the sending device showed emojis and SAS numbers.
180182
assert.Len(t, sendingCallbacks.GetDecimalsShown(txnID), 3)
181-
assert.Len(t, sendingCallbacks.GetEmojisShown(txnID), 7)
183+
emojis, descriptions := sendingCallbacks.GetEmojisAndDescriptionsShown(txnID)
184+
assert.Len(t, emojis, 7)
185+
assert.Len(t, descriptions, 7)
182186
}
183187
assert.Equal(t, txnID, secondKeyEvt.TransactionID)
184188
assert.NotEmpty(t, secondKeyEvt.Key)
@@ -193,7 +197,10 @@ func TestVerification_SAS(t *testing.T) {
193197
ts.dispatchToDevice(t, ctx, receivingClient)
194198
}
195199
assert.Equal(t, sendingCallbacks.GetDecimalsShown(txnID), receivingCallbacks.GetDecimalsShown(txnID))
196-
assert.Equal(t, sendingCallbacks.GetEmojisShown(txnID), receivingCallbacks.GetEmojisShown(txnID))
200+
sendingEmojis, sendingDescriptions := sendingCallbacks.GetEmojisAndDescriptionsShown(txnID)
201+
receivingEmojis, receivingDescriptions := receivingCallbacks.GetEmojisAndDescriptionsShown(txnID)
202+
assert.Equal(t, sendingEmojis, receivingEmojis)
203+
assert.Equal(t, sendingDescriptions, receivingDescriptions)
197204

198205
// Test that the first MAC event is correct
199206
var firstMACEvt *event.VerificationMACEventContent

crypto/verificationhelper/verificationhelper_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ func TestVerification_Start(t *testing.T) {
138138
assert.NotEmpty(t, toDeviceInbox[receivingDeviceID])
139139
assert.NotEmpty(t, toDeviceInbox[receivingDeviceID2])
140140
assert.Equal(t, toDeviceInbox[receivingDeviceID], toDeviceInbox[receivingDeviceID2])
141-
assert.Len(t, toDeviceInbox[receivingDeviceID], 1)
141+
require.Len(t, toDeviceInbox[receivingDeviceID], 1)
142142

143143
// Ensure that the verification request is correct.
144144
verificationRequest := toDeviceInbox[receivingDeviceID][0].Content.AsVerificationRequest()

0 commit comments

Comments
 (0)