@@ -921,11 +921,43 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
921921 pgp_packet_body_t pktbody (PGP_PKT_SK_SESSION_KEY);
922922 /* version and algorithm fields */
923923 pktbody.add_byte (version);
924+ #if defined(ENABLE_CRYPTO_REFRESH)
925+ uint8_t s2k_len;
926+ /* A one-octet scalar octet count for the 5 fields following this octet. */
927+ /* TODO: unify with pgp_key_pkt_t::s2k_specifier_len() */
928+ if (version == PGP_SKSK_V6) {
929+ switch (s2k.specifier ) {
930+ case PGP_S2KS_SIMPLE:
931+ s2k_len = 2 ;
932+ break ;
933+ case PGP_S2KS_SALTED:
934+ s2k_len = 10 ;
935+ break ;
936+ case PGP_S2KS_ITERATED_AND_SALTED:
937+ s2k_len = 11 ;
938+ break ;
939+ default :
940+ RNP_LOG (" invalid specifier" );
941+ throw rnp::rnp_exception (RNP_ERROR_BAD_PARAMETERS);
942+ }
943+ pktbody.add_byte (3 + s2k_len + ivlen);
944+ }
945+ #endif
924946 pktbody.add_byte (alg);
925- if (version == PGP_SKSK_V5) {
947+ if (version == PGP_SKSK_V5
948+ #if defined(ENABLE_CRYPTO_REFRESH)
949+ || version == PGP_SKSK_V6
950+ #endif
951+ ) {
926952 pktbody.add_byte (aalg);
927953 }
928- /* S2K specifier */
954+ /* S2K specifier */
955+ #if defined(ENABLE_CRYPTO_REFRESH)
956+ /* A one-octet scalar octet count of the following field. */
957+ if (version == PGP_SKSK_V6) {
958+ pktbody.add_byte (s2k_len);
959+ }
960+ #endif
929961 pktbody.add_byte (s2k.specifier );
930962 pktbody.add_byte (s2k.hash_alg );
931963
@@ -944,7 +976,11 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
944976 throw rnp::rnp_exception (RNP_ERROR_BAD_PARAMETERS);
945977 }
946978 /* v5 : iv */
947- if (version == PGP_SKSK_V5) {
979+ if (version == PGP_SKSK_V5
980+ #if defined(ENABLE_CRYPTO_REFRESH)
981+ || version == PGP_SKSK_V6
982+ #endif
983+ ) {
948984 pktbody.add (iv, ivlen);
949985 }
950986 /* encrypted key and auth tag for v5 */
@@ -955,6 +991,82 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
955991 pktbody.write (dst);
956992}
957993
994+ #if defined(ENABLE_CRYPTO_REFRESH)
995+ rnp_result_t
996+ pgp_sk_sesskey_t ::parse_v6(pgp_packet_body_t &pkt)
997+ {
998+ uint8_t bt;
999+ uint8_t octet_count;
1000+ uint8_t s2k_len;
1001+
1002+ /* A one-octet scalar octet count for the 5 fields following this octet. */
1003+ /* TODO: do we need to check octet_count? */
1004+ if (!pkt.get (octet_count)) {
1005+ RNP_LOG (" failed to get octet count of next 5 fields" );
1006+ return RNP_ERROR_BAD_FORMAT;
1007+ }
1008+
1009+ /* symmetric algorithm */
1010+ if (!pkt.get (bt)) {
1011+ RNP_LOG (" failed to get symm alg" );
1012+ return RNP_ERROR_BAD_FORMAT;
1013+ }
1014+ alg = (pgp_symm_alg_t ) bt;
1015+
1016+ /* aead algorithm */
1017+ if (!pkt.get (bt)) {
1018+ RNP_LOG (" failed to get aead alg" );
1019+ return RNP_ERROR_BAD_FORMAT;
1020+ }
1021+ aalg = (pgp_aead_alg_t ) bt;
1022+ if ((aalg != PGP_AEAD_EAX) && (aalg != PGP_AEAD_OCB)) {
1023+ RNP_LOG (" unsupported AEAD algorithm : %d" , (int ) aalg);
1024+ return RNP_ERROR_BAD_PARAMETERS;
1025+ }
1026+
1027+ /* A one-octet scalar octet count of the following field. */
1028+ /* TODO: do we need to check s2k_len? */
1029+ if (!pkt.get (s2k_len)) {
1030+ RNP_LOG (" failed to get octet count of next 5 fields" );
1031+ return RNP_ERROR_BAD_FORMAT;
1032+ }
1033+
1034+ /* s2k */
1035+ if (!pkt.get (s2k)) {
1036+ RNP_LOG (" failed to parse s2k" );
1037+ return RNP_ERROR_BAD_FORMAT;
1038+ }
1039+
1040+ size_t noncelen = pgp_cipher_aead_nonce_len (aalg);
1041+ size_t taglen = pgp_cipher_aead_tag_len (aalg);
1042+ size_t keylen = 0 ;
1043+
1044+ if (pkt.left () > noncelen + taglen + PGP_MAX_KEY_SIZE) {
1045+ RNP_LOG (" too long esk" );
1046+ return RNP_ERROR_BAD_FORMAT;
1047+ }
1048+ if (pkt.left () < noncelen + taglen + 8 ) {
1049+ RNP_LOG (" too short esk" );
1050+ return RNP_ERROR_BAD_FORMAT;
1051+ }
1052+ /* iv */
1053+ if (!pkt.get (iv, noncelen)) {
1054+ RNP_LOG (" failed to get iv" );
1055+ return RNP_ERROR_BAD_FORMAT;
1056+ }
1057+ ivlen = noncelen;
1058+
1059+ /* key */
1060+ keylen = pkt.left ();
1061+ if (!pkt.get (enckey, keylen)) {
1062+ RNP_LOG (" failed to get key" );
1063+ return RNP_ERROR_BAD_FORMAT;
1064+ }
1065+ enckeylen = keylen;
1066+ return RNP_SUCCESS;
1067+ }
1068+ #endif
1069+
9581070rnp_result_t
9591071pgp_sk_sesskey_t ::parse(pgp_source_t &src)
9601072{
@@ -967,6 +1079,12 @@ pgp_sk_sesskey_t::parse(pgp_source_t &src)
9671079 /* version */
9681080 uint8_t bt;
9691081 if (!pkt.get (bt) || ((bt != PGP_SKSK_V4) && (bt != PGP_SKSK_V5))) {
1082+ #if defined(ENABLE_CRYPTO_REFRESH)
1083+ if (bt == PGP_SKSK_V6) {
1084+ version = bt;
1085+ return parse_v6 (pkt);
1086+ }
1087+ #endif
9701088 RNP_LOG (" wrong packet version" );
9711089 return RNP_ERROR_BAD_FORMAT;
9721090 }
@@ -1134,7 +1252,7 @@ pgp_pk_sesskey_t::parse(pgp_source_t &src)
11341252 return RNP_ERROR_BAD_FORMAT;
11351253 }
11361254 fp.length = fp_len;
1137- if (fp.length && (fp.length != (unsigned )(fp_and_key_ver_len - 1 ))) {
1255+ if (fp.length && (fp.length != (unsigned ) (fp_and_key_ver_len - 1 ))) {
11381256 RNP_LOG (" size mismatch (fingerprint size and fp+key version length field)" );
11391257 return RNP_ERROR_BAD_FORMAT;
11401258 }
0 commit comments