Skip to content

Commit d6a1e6d

Browse files
authored
fix: update GetType to check the first 4 bytes (#1736)
### Proposed Changes This pull request updates the GetType to only check max first 4 bytes of the reader to see if we a nanotdf or zip(tdf). ### Checklist - [ ] I have added or updated unit tests - [ ] I have added or updated integration tests (if appropriate) - [ ] I have added or updated documentation ### Testing Instructions
1 parent 292fca0 commit d6a1e6d

File tree

2 files changed

+68
-5
lines changed

2 files changed

+68
-5
lines changed

sdk/sdk.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package sdk
22

33
import (
4+
"bytes"
45
"context"
56
"crypto/tls"
67
_ "embed"
@@ -291,21 +292,43 @@ func (t TdfType) String() string {
291292
return string(t)
292293
}
293294

295+
var (
296+
// ZIP file Signature
297+
zipSignature = []byte{0x50, 0x4B, 0x03, 0x04}
298+
// Nano TDF Signature
299+
nanoSignature = []byte{0x4C, 0x31, 0x4C}
300+
)
301+
294302
// GetTdfType returns the type of TDF based on the reader.
295303
// Reader is reset after the check.
296304
func GetTdfType(reader io.ReadSeeker) TdfType {
297-
isValidNanoTdf, _ := IsValidNanoTdf(reader)
305+
numBytes := 4
306+
buffer := make([]byte, numBytes)
307+
n, err := reader.Read(buffer)
308+
if err != nil {
309+
return Invalid
310+
}
298311

299-
if isValidNanoTdf {
300-
return Nano
312+
// Reset the reader to its original position
313+
_, err = reader.Seek(0, io.SeekStart)
314+
if err != nil {
315+
return Invalid
301316
}
302317

303-
isValidStandardTdf, _ := IsValidTdf(reader)
318+
if n < numBytes {
319+
return Invalid
320+
}
304321

305-
if isValidStandardTdf {
322+
// Check if the first 4 bytes match the ZIP signature
323+
if bytes.Equal(buffer, zipSignature) {
306324
return Standard
307325
}
308326

327+
// Check if the first 3 bytes match the Nano signature
328+
if bytes.Equal(buffer[:3], nanoSignature) {
329+
return Nano
330+
}
331+
309332
return Invalid
310333
}
311334

sdk/sdk_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,3 +330,43 @@ func Test_ShouldSanitizePlatformEndpoint(t *testing.T) {
330330
})
331331
}
332332
}
333+
334+
func Test_GetType_NanoTDF(t *testing.T) {
335+
nano := "TDFMABJsb2NhbGhvc3Q6ODA4MC9rYXOAAQIA2qvjMRfg7b27lT2kf9SwHRkDIg8ZXtfRoiIvdMUHq/gL5AUMfmv4Di8sKCyLkmUm/WITVj5hDeV/z4JmQ0JL7ZxqSmgZoK6TAHvkKhUly4zMEWMRXH8IktKhFKy1+fD+3qwDopqWAO5Nm2nYQqi75atEFckstulpNKg3N+Ul22OHr/ZuR127oPObBDYNRfktBdzoZbEQcPlr8q1B57q6y5SPZFjEzL9weK+uS5bUJWkF3nsHASo2bZw7IPhTZxoFVmCDjwvj6MbxNa7zG6aClHJ162zKxLLnD9TtIHuZ59R7LgiSieipXeExj+ky9OgIw5DfwyUuxsQLtKpMIAFPmLY9Hy2naUJxke0MT1EUBgastCq+YtFGslV9LJo/A8FtrRqludwtM0O+Z9FlAkZ1oNL7M7uOkLrh7eRrv+C1AAAX6FaBQoOtqnmyu6Jp+VzkxDddEeLRUyI="
336+
nanoDecoded, err := base64.StdEncoding.DecodeString(nano)
337+
require.NoError(t, err)
338+
339+
in := bytes.NewReader(nanoDecoded)
340+
tdfType := sdk.GetTdfType(in)
341+
342+
assert.Equal(t, sdk.Nano, tdfType)
343+
}
344+
345+
func Test_GetType_TDF(t *testing.T) {
346+
tdf := "UEsDBC0ACAAAAJ2TFTEAAAAAAAAAAAAAAAAJAAAAMC5wYXlsb2Fktu4m+vdwl0mtjhY3U5e7TG2o1s8ifK+RAhFNjRjGTLJ7V3w5UEsHCGiY7skkAAAAJAAAAFBLAwQtAAgAAACdkxUxAAAAAAAAAAAAAAAADwAAADAubWFuaWZlc3QuanNvbnsiZW5jcnlwdGlvbkluZm9ybWF0aW9uIjp7InR5cGUiOiJzcGxpdCIsInBvbGljeSI6ImV5SjFkV2xrSWpvaU1HTTFORGsyWlRZdE5EYzRaaTB4TVdWbUxXSXlOakV0WWpJMVl6UmhORE14TjJFM0lpd2lZbTlrZVNJNmV5SmtZWFJoUVhSMGNtbGlkWFJsY3lJNlczc2lZWFIwY21saWRYUmxJam9pYUhSMGNITTZMeTlsZUdGdGNHeGxMbU52YlM5aGRIUnlMMkYwZEhJeEwzWmhiSFZsTDNaaGJIVmxNU0lzSW1ScGMzQnNZWGxPWVcxbElqb2lJaXdpYVhORVpXWmhkV3gwSWpwbVlXeHpaU3dpY0hWaVMyVjVJam9pSWl3aWEyRnpWVkpNSWpvaUluMWRMQ0prYVhOelpXMGlPbHRkZlgwPSIsImtleUFjY2VzcyI6W3sidHlwZSI6IndyYXBwZWQiLCJ1cmwiOiJodHRwOi8vbG9jYWxob3N0OjgwODAiLCJwcm90b2NvbCI6ImthcyIsIndyYXBwZWRLZXkiOiJ0VVMvUE9TaVBtOGV6OGhyL2dMVGN6Y1lOT0trcUNEclZiQTBWdHZna29QbHB0M1BDZVpTdDNndnlQNVZKZXBNMmNqdVBhUWJJUGlyMjlWdVJ2T1RXZmQzRUh1KzgyVCtFNEVZbEpBM25VbDdGQTRMUGZhUEtXWk1zTExHUkJJVUxZT0VhMWJma1MvUm9Xb0EwK283WlFFVkNhYmdJN2JFRDJKV2Q2aG1yam1iUnM2d0lwOVFXNUs4Q3dJWjZVZjlGMXEwRDViTmlrbGxHaCtiaVJsV1NucEwxbHBPaFdva1gxdUJsU0VRSDNvM2JtVXFTNVVaUjRmYUxuTW5xOGR0bS8wYnJjTjUwaFNiK0xTTlZkd2daTEszTTRHTmxEeGdzcDkxY0VuYjZoZktLemdSY0VCS0tMQTF1b3BXNHdCRG9BamFuWWplQlZVT3ZBZEI5ek45T3c9PSIsInBvbGljeUJpbmRpbmciOnsiYWxnIjoiSFMyNTYiLCJoYXNoIjoiWmpBek1HWXlZekl4WlRCbU16Tm1NamhoTWpGalpqSTJaRE5oWlRrMk5ERTNaREJoWlRrM05ESTJNREExTnpVMU1UVTFNV0ZpTTJSak9EUTFabU0yWWc9PSJ9LCJraWQiOiJyMSJ9XSwibWV0aG9kIjp7ImFsZ29yaXRobSI6IkFFUy0yNTYtR0NNIiwiaXYiOiIiLCJpc1N0cmVhbWFibGUiOnRydWV9LCJpbnRlZ3JpdHlJbmZvcm1hdGlvbiI6eyJyb290U2lnbmF0dXJlIjp7ImFsZyI6IkhTMjU2Iiwic2lnIjoiWkdWaFltRmtNRGhsTURCbU1UVm1ZekJtTVdFME0ySmhOamhrTmpBMVpUazFNVGRtWmpoa1pETmtNekk0Tldaa01XUXhOVFZsWXpjME1EVXhPRE13Tmc9PSJ9LCJzZWdtZW50SGFzaEFsZyI6IkdNQUMiLCJzZWdtZW50U2l6ZURlZmF1bHQiOjIwOTcxNTIsImVuY3J5cHRlZFNlZ21lbnRTaXplRGVmYXVsdCI6MjA5NzE4MCwic2VnbWVudHMiOlt7Imhhc2giOiJNakkzWTJGbU9URXdNakV4TkdRNFpERTRZelkwWTJJeU4ySTFOemRqTXprPSIsInNlZ21lbnRTaXplIjo4LCJlbmNyeXB0ZWRTZWdtZW50U2l6ZSI6MzZ9XX19LCJwYXlsb2FkIjp7InR5cGUiOiJyZWZlcmVuY2UiLCJ1cmwiOiIwLnBheWxvYWQiLCJwcm90b2NvbCI6InppcCIsIm1pbWVUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwiaXNFbmNyeXB0ZWQiOnRydWV9fVBLBwgwpFOlrwUAAK8FAABQSwECLQAtAAgAAACdkxUxaJjuySQAAAAkAAAACQAAAAAAAAAAAAAAAAAAAAAAMC5wYXlsb2FkUEsBAi0ALQAIAAAAnZMVMTCkU6WvBQAArwUAAA8AAAAAAAAAAAAAAAAAWwAAADAubWFuaWZlc3QuanNvblBLBQYAAAAAAgACAHQAAABHBgAAAAA="
347+
tdfDecoded, err := base64.StdEncoding.DecodeString(tdf)
348+
require.NoError(t, err)
349+
350+
in := bytes.NewReader(tdfDecoded)
351+
tdfType := sdk.GetTdfType(in)
352+
353+
assert.Equal(t, sdk.Standard, tdfType)
354+
}
355+
356+
func Test_GetType_InvalidTDF(t *testing.T) {
357+
tdf := ""
358+
in := bytes.NewReader([]byte(tdf))
359+
360+
tdfType := sdk.GetTdfType(in)
361+
362+
assert.Equal(t, sdk.Invalid, tdfType)
363+
}
364+
365+
func Test_GetType_Invalid2Bytes(t *testing.T) {
366+
tdf := "UE"
367+
in := bytes.NewReader([]byte(tdf))
368+
369+
tdfType := sdk.GetTdfType(in)
370+
371+
assert.Equal(t, sdk.Invalid, tdfType)
372+
}

0 commit comments

Comments
 (0)