[Freeipa-devel] DNSSEC design page
Ludwig Krispenz
lkrispen at redhat.com
Tue Feb 25 12:49:58 UTC 2014
On 02/25/2014 01:30 PM, Petr Spacek wrote:
> On 25.2.2014 11:28, Ludwig Krispenz wrote:
>>
>> On 02/24/2014 08:20 PM, Simo Sorce wrote:
>>> On Mon, 2014-02-24 at 13:11 +0100, Ludwig Krispenz wrote:
>>>> Hi,
>>>>
>>>> here is a draft to start discussion. Lt me know if it is the right
>>>> direction and what you're missing.
>>>> https://fedorahosted.org/bind-dyndb-ldap/wiki/BIND9/Design/pkcs11Schema
>>>>
>>> I think we need to think hard if you really can make all those
>>> attributes a MUST for the private key, as not all the attributes
>>> seem to
>>> apply to all encryption algorithms. Would have to have to add bogus
>>> attributes in some cases.
>> most of them are MAY, right now I have only" ipaPkcs11keyType
>> ipaPkcs11label
>> ipaPkcs11id" as MUST, but this can be argued. I looke what softhsm is
>> doing
>> when importing a keypair:
>> |softhsm --import key1.pem --slot 1 --label "My key" --id A1B2 --pin
>> 123456
>> so I thought ID and LABEL woul be something provided from the
>> application and
>> should be there to describe the key. When storing the key (which is
>> in pkcs#8
>> format) softhsm breaks up the data from the file and creates two pkcs#11
>> attribute templates:
>>
>>
>> CK_ATTRIBUTE pubTemplate[] = {
>> { CKA_CLASS, &pubClass, sizeof(pubClass) },
>> { CKA_KEY_TYPE, &keyType, sizeof(keyType) },
>> { CKA_LABEL, label, strlen(label) },
>> { CKA_ID, objID, objIDLen },
>> { CKA_TOKEN, &ckTrue, sizeof(ckTrue) },
>> { CKA_VERIFY, &ckTrue, sizeof(ckTrue) },
>> { CKA_ENCRYPT, &ckFalse, sizeof(ckFalse) },
>> { CKA_WRAP, &ckFalse, sizeof(ckFalse) },
>> { CKA_PUBLIC_EXPONENT, keyMat->bigE, keyMat->sizeE },
>> { CKA_MODULUS, keyMat->bigN, keyMat->sizeN }
>> };
>> CK_ATTRIBUTE privTemplate[] = {
>> { CKA_CLASS, &privClass, sizeof(privClass) },
>> { CKA_KEY_TYPE, &keyType, sizeof(keyType) },
>> { CKA_LABEL, label, strlen(label) },
>> { CKA_ID, objID, objIDLen },
>> { CKA_SIGN, &ckTrue, sizeof(ckTrue) },
>> { CKA_DECRYPT, &ckFalse, sizeof(ckFalse) },
>> { CKA_UNWRAP, &ckFalse, sizeof(ckFalse) },
>> { CKA_SENSITIVE, &ckTrue, sizeof(ckTrue) },
>> { CKA_TOKEN, &ckTrue, sizeof(ckTrue) },
>> { CKA_PRIVATE, &ckTrue, sizeof(ckTrue) },
>> { CKA_EXTRACTABLE, &ckFalse, sizeof(ckFalse) },
>> { CKA_PUBLIC_EXPONENT, keyMat->bigE, keyMat->sizeE },
>> { CKA_MODULUS, keyMat->bigN, keyMat->sizeN },
>> { CKA_PRIVATE_EXPONENT, keyMat->bigD, keyMat->sizeD },
>> { CKA_PRIME_1, keyMat->bigP, keyMat->sizeP },
>> { CKA_PRIME_2, keyMat->bigQ, keyMat->sizeQ },
>> { CKA_EXPONENT_1, keyMat->bigDMP1, keyMat->sizeDMP1 },
>> { CKA_EXPONENT_2, keyMat->bigDMQ1, keyMat->sizeDMQ1 },
>> { CKA_COEFFICIENT, keyMat->bigIQMP, keyMat->sizeIQMP }
>> };
>>
>> I thought that CLASS would be translated to an LDAP objectclass, |
>>
>> |CKA_KEY_TYPE,||CKA_LABEL and CKA_ID would be provided (or default to
>> rsa)|.
>>
>> For the the private key itself it could be either stored completely as
>> ipaPkcs8privateKey or as individual key attributes:
>> ipaPkcs11publicExponent,
>> ipaPkcs11modulus, ipaPkcs11privateExponent, ipaPkcs11prim1,
>> ipaPkcs11prim2
>> I did ignore CKA_SIGN, CKA_DECRYPT, CKA_UNWRAP, CKA_SENSITIVE as only
>> defaults
>> were used, but maybe this is my ignorance.
>> And|CKA_EXPONENT_1,||CKA_EXPONENT_2, CKA_COEFICIENT as they seemed
>> redundant
>> to me, calculated from other components.
>>
>> If we need any of the attributes I omitted or if we need other
>> attributes for
>> other keytypes let me know.
>> |
>>
>>> ipaPkcs8privateKey
>>>
>>> Also can you add some examples on how we would use these classes to
>>> store DNS keys ?
>> in what format do you provide the dns key ? The public key could be
>> stored
>> using modulus and exponent, do we need the flags, protocol adn algorithm
>> attribute ? Does a schema for DNS records already exist ?
>
> I would store DNSSEC-specific attributes in separate objectClass not
> to pollute pure PKCS#11 object classes.
>
> We have to be able to reproduce BIND key-files in the first
> implementation phase. I'm attaching public-private key pairs with
> different algorithms and flags to this e-mail.
>
> .key files contain DNSKEY record. It is basically public key,
> algorithm and flags as used by DNS clients. This is just one long
> string stored in normal idnsZone object.
>
> DNSKEY format is described on
> http://tools.ietf.org/html/rfc4034#section-2.3
but you already have a KeyRecord defined in ".../schema/60ipadns.ldif"
which refers to RFC2535, which is obsoleted by 4034, the one you
reference. Do you wan to split this up into several attributes in a new
objectclass (why)?
I will look at the examples, thanks.
>
>
>
> .private files contain private keys and metadata for BIND, stored as
> key-value pairs.
>
> Some values can be derived from standard PKCS#11 attributes, some
> other have to be stored explicitly.
>
> For example (file Kdsa-ksk.+006+51642.private):
> > Private-key-format: v1.3
> > Algorithm: 6 (NSEC3DSA)
> - We need to check if this can be derived from PKCS#11 type or not.
> (It could contain some DNSSEC-specific values.)
> - See
> http://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xhtml#dns-sec-alg-numbers-1
>
> > Prime(p):
> 6h4K2APYLBWTOFgoo9b2aMpCNz9QfhYMh1fUnipZFdCt3TsBy2mYueC8iVrqC35EUCCU/SbKkZv2SfVjpwJRc37bmSNhsGt6tFCqHAvuMO/KD43erLebvTuQc58zmkswLqDM1+Rx6sCtk1Dse6xdRrWAi1CXhpQfyHD
> > Subprime(q): tzQKBcEOLQT5/R7WzaMij86hwEM=
> > Base(g):
> uHVjFBrRFijLHFUWP+1aWZA1kiq85Wrn+npPu39F4P9VOIyasJaxSEncw7F0T1b2h+ADZ3/Ny1aQPBeJJ4o5NuTNUb92tifjr6peP8UZWG3NHoyU+RZJkoHIjaMiTHaPwBJItRQdEg+3nSCjmCEDNaFhUwwfG+yJ1FZJ
> > Private_value(x): avcS6O/s60qa4TZ8m5dlHvyiSQI=
> > Public_value(y):
> 5cb5cH2hLkIrLGO9xCv4fgWYOTN+txiVD4hRILTJHG8GXhadIPuKmvuvyc6ynnPIn8XgZnrpVqCJXteMoPk0ERQh1wmSoxPqks9pyKJlnIGADW8zH5uEueBT53lx6I2WkNXU+BK0/A7psVPpqo51iX1s0h5f
> - All this is algorithm-specific but we need to be able to extract
> each field separately for BIND-keyfile generation
>
> There is also a bunch of DNSSEC-specific timestamps:
> > Created: 20140225113328
> > Publish: 20140327113328
> - When the key will be made visible for the first time.
> > Activate: 20140327113328
> - When the key will be used for signing the first time.
> - Probably can be mapped to PKCS#11 ??
> > Inactive: 20140426113328
> - From when the key will not be used for signing anymore.
> - Probably can be mapped to PKCS#11 ??
> > Revoke: 20140526113328
> > Delete: 20140625113328
>
> There is also some information coded in file name:
> - name of the DNS zone
> - key_id - some value computed from the DNSKEY record
> - key_alg - the same value as in .key and .private files
>
> I hope this clarifies requirements from DNSSEC-point of view.
>
> We need to find what is possible to derive from PKCS#11 attributes and
> create auxiliary object class for remaining values.
>
> Petr^2 Spacek
>
>>> Ideally the example would show the LDAP tree and some example data in
>>> detail, and also what operation we think would be common.
>>>
>>> Simo.
>
>
> _______________________________________________
> Freeipa-devel mailing list
> Freeipa-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/freeipa-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/freeipa-devel/attachments/20140225/38eccec4/attachment.htm>
More information about the Freeipa-devel
mailing list