Articles

Behind the Code —
Solving the I/O 2019 Puzzle

The core mechanic

The challenge at the core of the puzzle to reveal I/O’s 2019 dates is based on the concept of elliptic-curve cryptography. While the methods to solve the puzzle don’t reflect real-world applications of this approach to encryption, they do provide a visually interesting artifact. Additionally, the math involved in solving them is difficult to brute force yet easy to consistently verify when all the information is available.

The puzzle pieces

The puzzle is made up of three major components containing all the clues and details needed to solve it

  1. The poem: The first component introduced is a mysterious poem. Attached to a tweet from Google Developers, it creates intrigue and leads people to the second piece.

  2. The video: The initial tweet leads to a site containing a lone video. With the poem as a voice-over, the video’s seemingly abstract imagery contains multiple artifacts that need to be pieced together. These artifacts – like images of bezier curves or the poem presented alongside numbers – are only seen briefly or as single frames in the video.

  3. The browser: The third component of the puzzle is information accessible through the browser. Data within local storage and an error within the developer console are the final set of clues necessary to find the solution.

How it all works

The first step to solving the puzzle is finding and piecing together all the artifacts from the video. To make the clues apparent to users, the video contains both sound effects and visuals cues, like a ‘+’ sign when important elements appear. The bezier curves, the labeled start and end points of each curve, and the grid they sit on are all available in the video. By layering the frames with these artifacts together, the necessary information is revealed.

The next step requires inspecting the page with browser development tools, two pieces of information are logged in the console. The first is an error message from a function that fails to run. The second is a message that says “Transmission received” which only displays 35 seconds into the video. Looking further into the dev tools, a large set of points labeled as “t1” and “t2” are visible in local storage along with a block of text in hex format. This hex code also appears during the video just before a brief sequence showing an animation of multiple points moving with their x and y coordinates being summed together. This is an important clue, because after all the prior information on the curves has been gathered the only thing missing are their control points. And there is now enough information to calculate the missing control point coordinates. Once you have these control points you’ll need to sum their coordinates as suggested by the animation sequence mentioned above.

Remember that hex code found in local storage? When converted to ASCII, it translates to: “the answer you seek in the sum of your journey to the horizon and to the stars you will find in the remains of the longest path and the depth of the ocean”. This is a clue that the sum of the x coordinates (“the horizon”) and the sum of y coordinates (“the stars”) must each be divided by another number to get the remainder. At the end of the video, the poem is shown with line numbers. The line with longest word count has a number attached to the last word of the line. The word count of that line and the trailing number represent the “longest path” and the “depth of the ocean,” respectively. Dividing the summed x value of the control points by the longest  word count and dividing the summed y value of the control points by the total line length yield remainders that give you the final x/y value.

Once you’ve solved these numbers for each curve, you’ll find the x and y coordinates correspond to words in the poem. The x values relate to the nth word in a line, and the y values correspond to the line number. This yields the words “why was six afraid of seven,” a simple and common riddle whose answer is “because seven eight nine.”

You might think that testing if the puzzle worked after every revision and tweak might be time consuming. You’d be right! That’s why we also built a suite of testing tools which allowed us to automate solving the puzzle each time we got an updated video file and prove there hadn’t been any accidental bugs introduced. You can explore the test code on our Github.

The final reveal

While we have the major pieces put together, there’s still the question of what the error in the dev console means. The error message includes the arguments that were passed to it. The first argument is an array of 6 tuples labeled ‘points.’ The second argument is a float labeled ‘t.’ These are the two pieces of information necessary to verify a point along a bezier curve.

By calling the function with the array of coordinates for each of the six solved words in the poem, as well as .789 for the value ‘t,’ the puzzle is completed. The page is refreshed to reveal the dates for I/O 2019.

Related