Unraveling the Mystery of Missing DNSKEY Key Tags by Roy Arends

Quest for missing keytags
Roy Arends  |  DNS-OARC  
|  1 April 2016
What is a DNSKEY Key Tag
A.
a 16 bit value in the DNSKEY RDATA
B.
a physical tag that you’d hang on your key ring
C.
a 16 bit value in the DS and RRSIG RDATA
D.
a special variation of the game of tag.
Pubquiz question:
Why did I look into this?
2010, first root KSK published,
2015, I started working on my testbed
Why did I look into this?
2010
2015
Why did I look into this?
2010
2015
I wanted to use those as keytags for my testbed.
You can’t simply assign a keytag to a dnskey.
RFC4034:
“the algorithm for calculating the Key Tag is almost but not completely
identical to the familiar ones-complement checksum used in many other
Internet protocols.”
Simple loop
while true
 
do dnssec-keygen –a RSASHA256 –f KSK –b 2048 .
done
Simple loop
while true
 
do dnssec-keygen –a RSASHA256 –f KSK –b 2048 .
done
This only generated about 16K keys
I was expecting 64K keys
keytags 02010 and 02015 were absent
Simple loop
while true
 
do dnssec-keygen –a RSASHA256 –f KSK –b 2048 .
done
First clue by Duane Wessels:
dnssec-keygen won't generate a new key if:
the new key tag conflicts with an existing key tag + revoke bit
the new key tag + revoke bit conflicts with an existing key tag
Nice! Well observed.
Less Simple loop
while true
 
do dnssec-keygen –a RSASHA256 –f KSK –b 2048 .\
 
>> taglist
 
rm K\.+008*;
done
This simply removes keys after they’re created, but adds the tag to a list.
Less Simple loop
while true
 
do dnssec-keygen –a RSASHA256 –f KSK –b 2048 .\
 
>> taglist
 
rm K\.+008*;
done
This simply removes keys after they’re created, but adds the tag to a list.
sort –u taglist | wc –l
16387
Less Simple loop
while true
 
do dnssec-keygen –a RSASHA256 –f KSK –b 2048 .\
 
>> taglist
 
rm K\.+008*;
done
This simply removes keys after they’re created, but adds the tag to a list.
sort –u taglist | wc –l
16387
Wait, what? Not 16384?
It
s the tool, try a different one.
while true
 
do ldns-keygen –a RSASHA256 –k –b 2048 .
done
Nice and simple. No undocumented features.
Allows for foot shooting.
It
s the tool, try a different one.
while true
 
do ldns-keygen –a RSASHA256 –k –b 2048 .
done
Nice and simple. No undocumented features.
ls K.*private | wc –l
16385
It
s the tool, try a different one.
while true
 
do ldns-keygen –a RSASHA256 –k –b 2048 .
done
Nice and simple. No undocumented features.
ls K.*private | wc –l
16385
Still, not high enough.
Meanwhile, via Twitter
Meanwhile, via Twitter
So, it could be the library
DNSSEC-Keygen and ldns-keygen use OpenSSL
pdnssec uses mbedTLS
Is this a bug in OpenSSL?
So, it could be the library
DNSSEC-Keygen and ldns-keygen use OpenSSL
pdnssec uses mbedTLS
Is this a bug in OpenSSL?
“KEYSTARVE” [goes and registers name]
But
…. 
O
n DNS-Operations
Peter van Dijk:
I now have ~130k (different!) keys, with 32201 unique key tags. This is
almost twice as much as Roy had but it looks like it might top off around 32k.
But
…. 
O
n DNS-Operations
Peter van Dijk:
I now have ~130k (different!) keys, with 32201 unique key tags. This is
almost twice as much as Roy had but it looks like it might top off around 32k.
Now what
Three different tools
Two different libraries
Three issues:
1)
Not enough keytags (expected 64K, got less)
2)
Off by a few keytags (16387, 16385, 32769)
3)
One library produces 50% of the other library
Is it the keytag function?
The keytag function is very similar to a radix minus one complement
function. Very similar to the Internet Header Checksum.
So, generate 2048 random bits in pairs of 2 byte words and do an Internet
Header Checksum over that.
while true
  
 
do jot -r 128 0 65535 | awk \
 
'{s+=$1} END {print (s + int(s/65536))%65535}’ \
 
>>test
done
sort –u test | wc –l
65536
It is not the keytag function
The keytag function is very similar to a radix minus one complement
function. Very similar to the Internet Header Checksum.
So, generate 2048 random bits in pairs of 2 byte words and do an Internet
Header Checksum over that.
It is not the keytag function
It is not the keytag function
The keytag function is very similar to a radix minus one complement
function. Very similar to the Internet Header Checksum.
So, generate 2048 random bits in pairs of 2 byte words and do an Internet
Header Checksum over that.
It is not the keytag function
It is not the library
It is not the keytag function
The keytag function is very similar to a radix minus one complement
function. Very similar to the Internet Header Checksum.
So, generate 2048 random bits in pairs of 2 byte words and do an Internet
Header Checksum over that.
It is not the keytag function
It is not the library
It is not the tools
It is not the keytag function
The keytag function is very similar to a radix minus one complement
function. Very similar to the Internet Header Checksum.
So, generate 2048 random bits in pairs of 2 byte words and do an Internet
Header Checksum over that.
It is not the keytag function
It is not the library
It is not the tools
(and hopefully not the user)
?
Florian Maury and Jérôme Plût
The Internet Header Checksum is equivalent to
addition modulo 65535
Florian Maury and Jérôme Plût
The Internet Header Checksum is equivalent to
addition modulo 65535
Assuming a 32 bit number  
($num)
 this means:
($num AND 65535) + ($num >> 16)
is equivalent to 
$num % 65535
Florian Maury and Jérôme Plût
$num % 65535
In our case, $num contains the RDATA of the DNSKEY.
 For all the keys generated, the RDATA part contains a constant:
(RDLENGTH,PROTOCOL,ALGORITHM, EXPONENT)
And a variable part:
The RSA modulus, which consist of two prime factors P and Q
Florian Maury and Jérôme Plût
Therefore, we have
$num % 65535
Is equivalent to:
(constant + P*Q) % 65535
Is equivalent to:
(constant % 65535) + ((P*Q) % 65535 )
Florian Maury and Jérôme Plût
Ignoring the constant part we have:
(P*Q) % 65535
We know that P and Q are very large primes.
65535 has factors: 
3, 5, 17, 257
Since 
(P, Q, 3, 5, 17 and 257)
are co-prime,
P, Q can’t be divided by 3, 5, 17 and 257
and
(P*Q) % 3, 5, 17 or 257 will never be 0
Florian Maury and Jérôme Plût
(P*Q) % 3, 5, 17 or 257 will never be 0
(P*Q) % 3 has 2 solutions (not 3)
(P*Q) % 5 has 4 solutions (not 5)
(P*Q) % 17 has 16 solutions (not 17) and
(P*Q) % 257 has 256 solutions (not 257)
So, (P*Q) % 65535 has 2*4*16*256 solutions
Florian Maury and Jérôme Plût
(P*Q) % 3, 5, 17 or 257 will never be 0
(P*Q) % 3 has 2 solutions (not 3)
(P*Q) % 5 has 4 solutions (not 5)
(P*Q) % 17 has 16 solutions (not 17) and
(P*Q) % 257 has 256 solutions (not 257)
So, (P*Q) % 65535 has 2*4*16*256 solutions, or
32768
 different keytags
Hoorah!
Three issues, one solved:
1)
SOLVED: Not enough keytags (expected 64K, got less)
2)
Off by a few keytags (16387, 16385, 32769)
3)
One library produces 50% of the other library
Off by a few
Very similar is not exactly the same
The last part of the key-tag function in RFC4034 reads as follows:
ac += (ac >> 16) & 0xFFFF;
return ac & 0xFFFF;
If the previous line result in a carry (value > 65535), the latter line ignores it.
Hence, some off by a few keytags are a result of that.
Hoorah!
Three issues, two solved:
1)
SOLVED: Not enough keytags (expected 64K, got less)
2)
SOLVED: Off by a few keytags (16387, 16385, 32769)
3)
One library produces 50% of the other library
Half the keyspace
Peter, using mbedTLS was able to produce twice as many keytags.
OpenSSL only generates safe primes:
P = 2 * P` + 1 where P` is also prime.
That implies that P mod 3 is never 1 (and thus always 2)
So: P*Q=M
(P mod 3) * (Q mod 3) = M mod 3
2 * 2 = 4 mod 3
M mod 3 is 1. Always
Half the keyspace
(P*Q) % 3, 5, 17 or 257 will never be 0
(P*Q) % 3 has 2 solutions (not 3)
(P*Q) % 5 has 4 solutions (not 5)
(P*Q) % 17 has 16 solutions (not 17) and
(P*Q) % 257 has 256 solutions (not 257)
So, (P*Q) % 65535 has 2*4*16*256 solutions, or
32768
 different keytags
Half the keyspace
(P*Q) % 3, 5, 17 or 257 will never be 0
(P*Q) % 3 will always be 1
(P*Q) % 3 has 
1
 solution  (not 3)
(P*Q) % 5 has 4 solutions (not 5)
(P*Q) % 17 has 16 solutions (not 17) and
(P*Q) % 257 has 256 solutions (not 257)
So, (P*Q) % 65535 has 
1
*4*16*256 solutions, or
32768
 different keytags
16384
Hoorah!
Three issues, two solved:
1)
SOLVED: Not enough keytags (expected 64K, got less)
2)
SOLVED: Off by a few keytags (16387, 16385, 32769)
3)
SOLVED: One library produces 50% of the other library
Thanks to
Warren Kumari
Ben Laurie
Florian Maury
Jérôme Plût
Jean-René Reinhard
Peter van Dijk
Bert Hubert
David Conrad
And all who have participated in the discussions on dns-operations
Questions?
Slide Note
Embed
Share

This content delves into Roy Arends' quest for missing keytags in the DNS-OARC, starting from 2010 to 2015. It explores the intricacies of DNSKEY Key Tags, the challenges faced in generating keys, and the clever techniques employed to address the issue.

  • DNSKEY
  • Key Tags
  • DNS-OARC
  • Roy Arends
  • Internet Protocols

Uploaded on Sep 23, 2024 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

E N D

Presentation Transcript


  1. Quest for missing keytags Roy Arends | DNS-OARC | 1 April 2016

  2. Pubquiz question: What is a DNSKEY Key Tag a 16 bit value in the DNSKEY RDATA A. a physical tag that you d hang on your key ring B. a 16 bit value in the DS and RRSIG RDATA C. a special variation of the game of tag. D. | 2

  3. Why did I look into this? 2010, first root KSK published, 2015, I started working on my testbed | 3

  4. Why did I look into this? 2010 2015 | 4

  5. Why did I look into this? 2010 2015 I wanted to use those as keytags for my testbed. You can t simply assign a keytag to a dnskey. RFC4034: the algorithm for calculating the Key Tag is almost but not completely identical to the familiar ones-complement checksum used in many other Internet protocols. | 5

  6. Simple loop while true do dnssec-keygen a RSASHA256 f KSK b 2048 . done | 6

  7. Simple loop while true do dnssec-keygen a RSASHA256 f KSK b 2048 . done This only generated about 16K keys I was expecting 64K keys keytags 02010 and 02015 were absent | 7

  8. Simple loop while true do dnssec-keygen a RSASHA256 f KSK b 2048 . done First clue by Duane Wessels: dnssec-keygen won't generate a new key if: the new key tag conflicts with an existing key tag + revoke bit the new key tag + revoke bit conflicts with an existing key tag Nice! Well observed. | 8

  9. Less Simple loop while true do dnssec-keygen a RSASHA256 f KSK b 2048 .\ >> taglist rm K\.+008*; done This simply removes keys after they re created, but adds the tag to a list. | 9

  10. Less Simple loop while true do dnssec-keygen a RSASHA256 f KSK b 2048 .\ >> taglist rm K\.+008*; done This simply removes keys after they re created, but adds the tag to a list. sort u taglist | wc l 16387 | 10

  11. Less Simple loop while true do dnssec-keygen a RSASHA256 f KSK b 2048 .\ >> taglist rm K\.+008*; done This simply removes keys after they re created, but adds the tag to a list. sort u taglist | wc l 16387 Wait, what? Not 16384? | 11

  12. Its the tool, try a different one. while true do ldns-keygen a RSASHA256 k b 2048 . done Nice and simple. No undocumented features. Allows for foot shooting. | 12

  13. Its the tool, try a different one. while true do ldns-keygen a RSASHA256 k b 2048 . done Nice and simple. No undocumented features. ls K.*private | wc l 16385 | 13

  14. Its the tool, try a different one. while true do ldns-keygen a RSASHA256 k b 2048 . done Nice and simple. No undocumented features. ls K.*private | wc l 16385 Still, not high enough. | 14

  15. Meanwhile, via Twitter | 15

  16. Meanwhile, via Twitter | 16

  17. So, it could be the library DNSSEC-Keygen and ldns-keygen use OpenSSL pdnssec uses mbedTLS Is this a bug in OpenSSL? | 17

  18. So, it could be the library DNSSEC-Keygen and ldns-keygen use OpenSSL pdnssec uses mbedTLS Is this a bug in OpenSSL? KEYSTARVE [goes and registers name] | 18

  19. But. On DNS-Operations Peter van Dijk: I now have ~130k (different!) keys, with 32201 unique key tags. This is almost twice as much as Roy had but it looks like it might top off around 32k. | 19

  20. But. On DNS-Operations Peter van Dijk: I now have ~130k (different!) keys, with 32201 unique key tags. This is almost twice as much as Roy had but it looks like it might top off around 32k. | 20

  21. Now what Three different tools Two different libraries Three issues: Not enough keytags (expected 64K, got less) Off by a few keytags (16387, 16385, 32769) One library produces 50% of the other library 1) 2) 3) | 21

  22. Is it the keytag function? The keytag function is very similar to a radix minus one complement function. Very similar to the Internet Header Checksum. So, generate 2048 random bits in pairs of 2 byte words and do an Internet Header Checksum over that. while true do jot -r 128 0 65535 | awk \ '{s+=$1} END {print (s + int(s/65536))%65535} \ >>test done sort u test | wc l 65536 | 22

  23. It is not the keytag function The keytag function is very similar to a radix minus one complement function. Very similar to the Internet Header Checksum. So, generate 2048 random bits in pairs of 2 byte words and do an Internet Header Checksum over that. It is not the keytag function | 23

  24. It is not the keytag function The keytag function is very similar to a radix minus one complement function. Very similar to the Internet Header Checksum. So, generate 2048 random bits in pairs of 2 byte words and do an Internet Header Checksum over that. It is not the keytag function It is not the library | 24

  25. It is not the keytag function The keytag function is very similar to a radix minus one complement function. Very similar to the Internet Header Checksum. So, generate 2048 random bits in pairs of 2 byte words and do an Internet Header Checksum over that. It is not the keytag function It is not the library It is not the tools | 25

  26. It is not the keytag function The keytag function is very similar to a radix minus one complement function. Very similar to the Internet Header Checksum. So, generate 2048 random bits in pairs of 2 byte words and do an Internet Header Checksum over that. It is not the keytag function It is not the library It is not the tools (and hopefully not the user) | 26

  27. | 27

  28. Florian Maury and Jrme Plt The Internet Header Checksum is equivalent to addition modulo 65535 | 28

  29. Florian Maury and Jrme Plt The Internet Header Checksum is equivalent to addition modulo 65535 Assuming a 32 bit number ($num) this means: ($num AND 65535) + ($num >> 16) is equivalent to $num % 65535 | 29

  30. Florian Maury and Jrme Plt $num % 65535 In our case, $num contains the RDATA of the DNSKEY. For all the keys generated, the RDATA part contains a constant: (RDLENGTH,PROTOCOL,ALGORITHM, EXPONENT) And a variable part: The RSA modulus, which consist of two prime factors P and Q | 30

  31. Florian Maury and Jrme Plt Therefore, we have $num % 65535 Is equivalent to: (constant + P*Q) % 65535 Is equivalent to: (constant % 65535) + ((P*Q) % 65535 ) | 31

  32. Florian Maury and Jrme Plt Ignoring the constant part we have: (P*Q) % 65535 We know that P and Q are very large primes. 65535 has factors: 3, 5, 17, 257 Since (P, Q, 3, 5, 17 and 257)are co-prime, P, Q can t be divided by 3, 5, 17 and 257 and (P*Q) % 3, 5, 17 or 257 will never be 0 | 32

  33. Florian Maury and Jrme Plt (P*Q) % 3, 5, 17 or 257 will never be 0 (P*Q) % 3 has 2 solutions (not 3) (P*Q) % 5 has 4 solutions (not 5) (P*Q) % 17 has 16 solutions (not 17) and (P*Q) % 257 has 256 solutions (not 257) So, (P*Q) % 65535 has 2*4*16*256 solutions | 33

  34. Florian Maury and Jrme Plt (P*Q) % 3, 5, 17 or 257 will never be 0 (P*Q) % 3 has 2 solutions (not 3) (P*Q) % 5 has 4 solutions (not 5) (P*Q) % 17 has 16 solutions (not 17) and (P*Q) % 257 has 256 solutions (not 257) So, (P*Q) % 65535 has 2*4*16*256 solutions, or 32768 different keytags | 34

  35. Hoorah! Three issues, one solved: SOLVED: Not enough keytags (expected 64K, got less) Off by a few keytags (16387, 16385, 32769) One library produces 50% of the other library 1) 2) 3) | 35

  36. Off by a few Very similar is not exactly the same The last part of the key-tag function in RFC4034 reads as follows: ac += (ac >> 16) & 0xFFFF; return ac & 0xFFFF; If the previous line result in a carry (value > 65535), the latter line ignores it. Hence, some off by a few keytags are a result of that. | 36

  37. Hoorah! Three issues, two solved: SOLVED: Not enough keytags (expected 64K, got less) SOLVED: Off by a few keytags (16387, 16385, 32769) One library produces 50% of the other library 1) 2) 3) | 37

  38. Half the keyspace Peter, using mbedTLS was able to produce twice as many keytags. OpenSSL only generates safe primes: P = 2 * P` + 1 where P` is also prime. That implies that P mod 3 is never 1 (and thus always 2) So: P*Q=M (P mod 3) * (Q mod 3) = M mod 3 2 * 2 = 4 mod 3 M mod 3 is 1. Always | 38

  39. Half the keyspace (P*Q) % 3, 5, 17 or 257 will never be 0 (P*Q) % 3 has 2 solutions (not 3) (P*Q) % 5 has 4 solutions (not 5) (P*Q) % 17 has 16 solutions (not 17) and (P*Q) % 257 has 256 solutions (not 257) So, (P*Q) % 65535 has 2*4*16*256 solutions, or 32768 different keytags | 39

  40. Half the keyspace (P*Q) % 3, 5, 17 or 257 will never be 0 (P*Q) % 3 will always be 1 (P*Q) % 3 has 1 solution (not 3) (P*Q) % 5 has 4 solutions (not 5) (P*Q) % 17 has 16 solutions (not 17) and (P*Q) % 257 has 256 solutions (not 257) So, (P*Q) % 65535 has 1*4*16*256 solutions, or 32768 different keytags 16384 | 40

  41. Hoorah! Three issues, two solved: SOLVED: Not enough keytags (expected 64K, got less) SOLVED: Off by a few keytags (16387, 16385, 32769) SOLVED: One library produces 50% of the other library 1) 2) 3) | 41

  42. Thanks to Warren Kumari Ben Laurie Florian Maury J r me Pl t Jean-Ren Reinhard Peter van Dijk Bert Hubert David Conrad And all who have participated in the discussions on dns-operations | 42

  43. Questions? | 43

More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#